[PATCH] md: allow md intent bitmap to be stored near the superblock.
This provides an alternate to storing the bitmap in a separate file. The bitmap can be stored at a given offset from the superblock. Obviously the creator of the array must make sure this doesn't intersect with data.... After is good for version-0.90 superblocks. Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
3d310eb7b3
commit
a654b9d8f8
@ -217,6 +217,7 @@ struct bitmap {
|
||||
/* bitmap spinlock */
|
||||
spinlock_t lock;
|
||||
|
||||
long offset; /* offset from superblock if file is NULL */
|
||||
struct file *file; /* backing disk file */
|
||||
struct page *sb_page; /* cached copy of the bitmap file superblock */
|
||||
struct page **filemap; /* list of cache pages for the file */
|
||||
@ -255,6 +256,7 @@ void bitmap_print_sb(struct bitmap *bitmap);
|
||||
int bitmap_update_sb(struct bitmap *bitmap);
|
||||
|
||||
int bitmap_setallbits(struct bitmap *bitmap);
|
||||
void bitmap_write_all(struct bitmap *bitmap);
|
||||
|
||||
/* these are exported */
|
||||
int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectors);
|
||||
|
@ -60,7 +60,14 @@
|
||||
*/
|
||||
#define MD_MAJOR_VERSION 0
|
||||
#define MD_MINOR_VERSION 90
|
||||
#define MD_PATCHLEVEL_VERSION 1
|
||||
/*
|
||||
* MD_PATCHLEVEL_VERSION indicates kernel functionality.
|
||||
* >=1 means different superblock formats are selectable using SET_ARRAY_INFO
|
||||
* and major_version/minor_version accordingly
|
||||
* >=2 means that Internal bitmaps are supported by setting MD_SB_BITMAP_PRESENT
|
||||
* in the super status byte
|
||||
*/
|
||||
#define MD_PATCHLEVEL_VERSION 2
|
||||
|
||||
extern int register_md_personality (int p_num, mdk_personality_t *p);
|
||||
extern int unregister_md_personality (int p_num);
|
||||
@ -78,6 +85,12 @@ extern void md_unplug_mddev(mddev_t *mddev);
|
||||
|
||||
extern void md_print_devices (void);
|
||||
|
||||
extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
|
||||
sector_t sector, int size, struct page *page);
|
||||
extern int sync_page_io(struct block_device *bdev, sector_t sector, int size,
|
||||
struct page *page, int rw);
|
||||
|
||||
|
||||
#define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); }
|
||||
|
||||
#endif
|
||||
|
@ -273,6 +273,10 @@ struct mddev_s
|
||||
|
||||
struct bitmap *bitmap; /* the bitmap for the device */
|
||||
struct file *bitmap_file; /* the bitmap file */
|
||||
long bitmap_offset; /* offset from superblock of
|
||||
* start of bitmap. May be
|
||||
* negative, but not '0'
|
||||
*/
|
||||
|
||||
struct list_head all_mddevs;
|
||||
};
|
||||
|
@ -96,6 +96,7 @@ typedef struct mdp_device_descriptor_s {
|
||||
#define MD_SB_CLEAN 0
|
||||
#define MD_SB_ERRORS 1
|
||||
|
||||
#define MD_SB_BITMAP_PRESENT 8 /* bitmap may be present nearby */
|
||||
typedef struct mdp_superblock_s {
|
||||
/*
|
||||
* Constant generic information
|
||||
@ -184,7 +185,7 @@ struct mdp_superblock_1 {
|
||||
/* constant array information - 128 bytes */
|
||||
__u32 magic; /* MD_SB_MAGIC: 0xa92b4efc - little endian */
|
||||
__u32 major_version; /* 1 */
|
||||
__u32 feature_map; /* 0 for now */
|
||||
__u32 feature_map; /* bit 0 set if 'bitmap_offset' is meaningful */
|
||||
__u32 pad0; /* always set to 0 when writing */
|
||||
|
||||
__u8 set_uuid[16]; /* user-space generated. */
|
||||
@ -197,6 +198,10 @@ struct mdp_superblock_1 {
|
||||
|
||||
__u32 chunksize; /* in 512byte sectors */
|
||||
__u32 raid_disks;
|
||||
__u32 bitmap_offset; /* sectors after start of superblock that bitmap starts
|
||||
* NOTE: signed, so bitmap can be before superblock
|
||||
* only meaningful of feature_map[0] is set.
|
||||
*/
|
||||
__u8 pad1[128-96]; /* set to 0 when written */
|
||||
|
||||
/* constant this-device information - 64 bytes */
|
||||
|
Reference in New Issue
Block a user