^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * bitmap.h: Copyright (C) Peter T. Breuer (ptb@ot.uc3m.es) 2003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * additions: Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef BITMAP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define BITMAP_H 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define BITMAP_MAJOR_LO 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /* version 4 insists the bitmap is in little-endian order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * with version 3, it is host-endian which is non-portable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Version 5 is currently set only for clustered devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define BITMAP_MAJOR_HI 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define BITMAP_MAJOR_CLUSTERED 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define BITMAP_MAJOR_HOSTENDIAN 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * in-memory bitmap:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Use 16 bit block counters to track pending writes to each "chunk".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * The 2 high order bits are special-purpose, the first is a flag indicating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * whether a resync is needed. The second is a flag indicating whether a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * resync is active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * This means that the counter is actually 14 bits:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * +--------+--------+------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * | resync | resync | counter |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * | needed | active | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * | (0-1) | (0-1) | (0-16383) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * +--------+--------+------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * The "resync needed" bit is set when:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * a '1' bit is read from storage at startup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * a write request fails on some drives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * a resync is aborted on a chunk with 'resync active' set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * It is cleared (and resync-active set) when a resync starts across all drives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * of the chunk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * The "resync active" bit is set when:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * a resync is started on all drives, and resync_needed is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * resync_needed will be cleared (as long as resync_active wasn't already set).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * It is cleared when a resync completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * The counter counts pending write requests, plus the on-disk bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * When the counter is '1' and the resync bits are clear, the on-disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * bit can be cleared as well, thus setting the counter to 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * When we set a bit, or in the counter (to start a write), if the fields is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * 0, we first set the disk bit and set the counter to 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * If the counter is 0, the on-disk bit is clear and the stripe is clean
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * Anything that dirties the stripe pushes the counter to 2 (at least)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * and sets the on-disk bit (lazily).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * If a periodic sweep find the counter at 2, it is decremented to 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * If the sweep find the counter at 1, the on-disk bit is cleared and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * counter goes to zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * Also, we'll hijack the "map" pointer itself and use it as two 16 bit block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * counters as a fallback when "page" memory cannot be allocated:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Normal case (page memory allocated):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * page pointer (32-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * [ ] ------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * +-------> [ ][ ]..[ ] (4096 byte page == 2048 counters)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * c1 c2 c2048
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * Hijacked case (page memory allocation failed):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * hijacked page pointer (32-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * [ ][ ] (no page memory allocated)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * counter #1 (16-bit) counter #2 (16-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define PAGE_BITS (PAGE_SIZE << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define PAGE_BIT_SHIFT (PAGE_SHIFT + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) typedef __u16 bitmap_counter_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define COUNTER_BITS 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define COUNTER_BIT_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define NEEDED(x) (((bitmap_counter_t) x) & NEEDED_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define RESYNC(x) (((bitmap_counter_t) x) & RESYNC_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define COUNTER(x) (((bitmap_counter_t) x) & COUNTER_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* how many counters per page? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define PAGE_COUNTER_RATIO (PAGE_BITS / COUNTER_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* same, except a shift value for more efficient bitops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define PAGE_COUNTER_SHIFT (PAGE_BIT_SHIFT - COUNTER_BIT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* same, except a mask value for more efficient bitops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define PAGE_COUNTER_MASK (PAGE_COUNTER_RATIO - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define BITMAP_BLOCK_SHIFT 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * bitmap structures:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define BITMAP_MAGIC 0x6d746962
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* use these for bitmap->flags and bitmap->sb->state bit-fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) enum bitmap_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) BITMAP_STALE = 1, /* the bitmap file is out of date or had -EIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) BITMAP_WRITE_ERROR = 2, /* A write error has occurred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) BITMAP_HOSTENDIAN =15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* the superblock at the front of the bitmap file -- little endian */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) typedef struct bitmap_super_s {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) __le32 magic; /* 0 BITMAP_MAGIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) __le32 version; /* 4 the bitmap major for now, could change... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) __u8 uuid[16]; /* 8 128 bit uuid - must match md device uuid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) __le64 events; /* 24 event counter for the bitmap (1)*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) __le64 events_cleared;/*32 event counter when last bit cleared (2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) __le64 sync_size; /* 40 the size of the md device's sync range(3) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) __le32 state; /* 48 bitmap state information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __le32 chunksize; /* 52 the bitmap chunk size in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) __le32 daemon_sleep; /* 56 seconds between disk flushes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __le32 write_behind; /* 60 number of outstanding write-behind writes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) __le32 sectors_reserved; /* 64 number of 512-byte sectors that are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * reserved for the bitmap. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) __le32 nodes; /* 68 the maximum number of nodes in cluster. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) __u8 cluster_name[64]; /* 72 cluster name to which this md belongs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) __u8 pad[256 - 136]; /* set to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) } bitmap_super_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* notes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) * (1) This event counter is updated before the eventcounter in the md superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * When a bitmap is loaded, it is only accepted if this event counter is equal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * to, or one greater than, the event counter in the superblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * (2) This event counter is updated when the other one is *if*and*only*if* the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * array is not degraded. As bits are not cleared when the array is degraded,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * this represents the last time that any bits were cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * If a device is being added that has an event count with this value or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * higher, it is accepted as conforming to the bitmap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * (3)This is the number of sectors represented by the bitmap, and is the range that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * resync happens across. For raid1 and raid5/6 it is the size of individual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * devices. For raid10 it is the size of the array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* the in-memory bitmap is represented by bitmap_pages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct bitmap_page {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * map points to the actual memory page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) char *map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * in emergencies (when map cannot be alloced), hijack the map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * pointer and use it as two counters itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) unsigned int hijacked:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * If any counter in this page is '1' or '2' - and so could be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * cleared then that page is marked as 'pending'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) unsigned int pending:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * count of dirty bits on the page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) unsigned int count:30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* the main bitmap structure - one per mddev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct bitmap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct bitmap_counts {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct bitmap_page *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) unsigned long pages; /* total number of pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * in the bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) unsigned long missing_pages; /* number of pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * not yet allocated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) unsigned long chunkshift; /* chunksize = 2^chunkshift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * (for bitops) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) unsigned long chunks; /* Total number of data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * chunks for the array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) } counts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct mddev *mddev; /* the md device that the bitmap is for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) __u64 events_cleared;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) int need_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct bitmap_storage {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct file *file; /* backing disk file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct page *sb_page; /* cached copy of the bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * file superblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct page **filemap; /* list of cache pages for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) * the file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) unsigned long *filemap_attr; /* attributes associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * w/ filemap pages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unsigned long file_pages; /* number of pages in the file*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) unsigned long bytes; /* total bytes in the bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) } storage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int allclean;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) atomic_t behind_writes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) unsigned long behind_writes_used; /* highest actual value at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * the bitmap daemon - periodically wakes up and sweeps the bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * file, cleaning up bits and flushing out pages to disk as necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) unsigned long daemon_lastrun; /* jiffies of last run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned long last_end_sync; /* when we lasted called end_sync to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * update bitmap with resync progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) atomic_t pending_writes; /* pending writes to the bitmap file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) wait_queue_head_t write_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) wait_queue_head_t overflow_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) wait_queue_head_t behind_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct kernfs_node *sysfs_can_clear;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int cluster_slot; /* Slot offset for clustered env */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* the bitmap API */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* these are used only by md/bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct bitmap *md_bitmap_create(struct mddev *mddev, int slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int md_bitmap_load(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) void md_bitmap_flush(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) void md_bitmap_destroy(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) void md_bitmap_print_sb(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) void md_bitmap_update_sb(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) void md_bitmap_status(struct seq_file *seq, struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int md_bitmap_setallbits(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) void md_bitmap_write_all(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) void md_bitmap_dirty_bits(struct bitmap *bitmap, unsigned long s, unsigned long e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* these are exported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) int md_bitmap_startwrite(struct bitmap *bitmap, sector_t offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) unsigned long sectors, int behind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) void md_bitmap_endwrite(struct bitmap *bitmap, sector_t offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) unsigned long sectors, int success, int behind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) int md_bitmap_start_sync(struct bitmap *bitmap, sector_t offset, sector_t *blocks, int degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) void md_bitmap_end_sync(struct bitmap *bitmap, sector_t offset, sector_t *blocks, int aborted);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) void md_bitmap_close_sync(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) void md_bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector, bool force);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) void md_bitmap_sync_with_cluster(struct mddev *mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) sector_t old_lo, sector_t old_hi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) sector_t new_lo, sector_t new_hi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) void md_bitmap_unplug(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) void md_bitmap_daemon_work(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) int md_bitmap_resize(struct bitmap *bitmap, sector_t blocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) int chunksize, int init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) sector_t *lo, sector_t *hi, bool clear_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) void md_bitmap_free(struct bitmap *bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) void md_bitmap_wait_behind_writes(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #endif