123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- #ifndef BITMAP_H
- #define BITMAP_H 1
- #define BITMAP_MAJOR_LO 3
- #define BITMAP_MAJOR_HI 4
- #define BITMAP_MAJOR_CLUSTERED 5
- #define BITMAP_MAJOR_HOSTENDIAN 3
- #ifdef __KERNEL__
- #define PAGE_BITS (PAGE_SIZE << 3)
- #define PAGE_BIT_SHIFT (PAGE_SHIFT + 3)
- typedef __u16 bitmap_counter_t;
- #define COUNTER_BITS 16
- #define COUNTER_BIT_SHIFT 4
- #define COUNTER_BYTE_SHIFT (COUNTER_BIT_SHIFT - 3)
- #define NEEDED_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 1)))
- #define RESYNC_MASK ((bitmap_counter_t) (1 << (COUNTER_BITS - 2)))
- #define COUNTER_MAX ((bitmap_counter_t) RESYNC_MASK - 1)
- #define NEEDED(x) (((bitmap_counter_t) x) & NEEDED_MASK)
- #define RESYNC(x) (((bitmap_counter_t) x) & RESYNC_MASK)
- #define COUNTER(x) (((bitmap_counter_t) x) & COUNTER_MAX)
- #define PAGE_COUNTER_RATIO (PAGE_BITS / COUNTER_BITS)
- #define PAGE_COUNTER_SHIFT (PAGE_BIT_SHIFT - COUNTER_BIT_SHIFT)
- #define PAGE_COUNTER_MASK (PAGE_COUNTER_RATIO - 1)
- #define BITMAP_BLOCK_SHIFT 9
- #endif
- #define BITMAP_MAGIC 0x6d746962
- enum bitmap_state {
- BITMAP_STALE = 1,
- BITMAP_WRITE_ERROR = 2,
- BITMAP_HOSTENDIAN =15,
- };
- typedef struct bitmap_super_s {
- __le32 magic;
- __le32 version;
- __u8 uuid[16];
- __le64 events;
- __le64 events_cleared;
- __le64 sync_size;
- __le32 state;
- __le32 chunksize;
- __le32 daemon_sleep;
- __le32 write_behind;
- __le32 sectors_reserved;
- __le32 nodes;
- __u8 cluster_name[64];
- __u8 pad[256 - 136];
- } bitmap_super_t;
- #ifdef __KERNEL__
- struct bitmap_page {
-
- char *map;
-
- unsigned int hijacked:1;
-
- unsigned int pending:1;
-
- unsigned int count:30;
- };
- struct bitmap {
- struct bitmap_counts {
- spinlock_t lock;
- struct bitmap_page *bp;
- unsigned long pages;
- unsigned long missing_pages;
- unsigned long chunkshift;
- unsigned long chunks;
- } counts;
- struct mddev *mddev;
- __u64 events_cleared;
- int need_sync;
- struct bitmap_storage {
- struct file *file;
- struct page *sb_page;
- struct page **filemap;
- unsigned long *filemap_attr;
- unsigned long file_pages;
- unsigned long bytes;
- } storage;
- unsigned long flags;
- int allclean;
- atomic_t behind_writes;
- unsigned long behind_writes_used;
-
- unsigned long daemon_lastrun;
- unsigned long last_end_sync;
- atomic_t pending_writes;
- wait_queue_head_t write_wait;
- wait_queue_head_t overflow_wait;
- wait_queue_head_t behind_wait;
- struct kernfs_node *sysfs_can_clear;
- int cluster_slot;
- };
- struct bitmap *md_bitmap_create(struct mddev *mddev, int slot);
- int md_bitmap_load(struct mddev *mddev);
- void md_bitmap_flush(struct mddev *mddev);
- void md_bitmap_destroy(struct mddev *mddev);
- void md_bitmap_print_sb(struct bitmap *bitmap);
- void md_bitmap_update_sb(struct bitmap *bitmap);
- void md_bitmap_status(struct seq_file *seq, struct bitmap *bitmap);
- int md_bitmap_setallbits(struct bitmap *bitmap);
- void md_bitmap_write_all(struct bitmap *bitmap);
- void md_bitmap_dirty_bits(struct bitmap *bitmap, unsigned long s, unsigned long e);
- int md_bitmap_startwrite(struct bitmap *bitmap, sector_t offset,
- unsigned long sectors, int behind);
- void md_bitmap_endwrite(struct bitmap *bitmap, sector_t offset,
- unsigned long sectors, int success, int behind);
- int md_bitmap_start_sync(struct bitmap *bitmap, sector_t offset, sector_t *blocks, int degraded);
- void md_bitmap_end_sync(struct bitmap *bitmap, sector_t offset, sector_t *blocks, int aborted);
- void md_bitmap_close_sync(struct bitmap *bitmap);
- void md_bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector, bool force);
- void md_bitmap_sync_with_cluster(struct mddev *mddev,
- sector_t old_lo, sector_t old_hi,
- sector_t new_lo, sector_t new_hi);
- void md_bitmap_unplug(struct bitmap *bitmap);
- void md_bitmap_daemon_work(struct mddev *mddev);
- int md_bitmap_resize(struct bitmap *bitmap, sector_t blocks,
- int chunksize, int init);
- struct bitmap *get_bitmap_from_slot(struct mddev *mddev, int slot);
- int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,
- sector_t *lo, sector_t *hi, bool clear_bits);
- void md_bitmap_free(struct bitmap *bitmap);
- void md_bitmap_wait_behind_writes(struct mddev *mddev);
- static inline bool md_bitmap_enabled(struct bitmap *bitmap)
- {
- return bitmap && bitmap->storage.filemap &&
- !test_bit(BITMAP_STALE, &bitmap->flags);
- }
- #endif
- #endif
|