分类: LINUX
2015-07-21 23:43:39
bitmap的工作原理就是使用一个位图,每个位对应md设备的一个数据块,在md设备有数据写入时,设置该数据块对应的位,等待写入完成后,再清除该数据块对应的位。
当需要进行数据同步/恢复时,参照bitmap的位图,只有设置了位对应的数据块才需要进行同步/恢复操作。
此结构定义在mddev结构中,其核心部分为:
核心成员 |
描述 |
struct file *file |
描述bitmap file,当指定为md自身时,为NULL |
loff_t offset |
可以为负,不能为0,描述bitmap文件存放在超级块之前还是之后,为负,就在超级块前 |
struct default_offset |
当md设备创建后,再指定bitmapfile时会使用 |
unsigned long chunksize |
存放bitmap chunksize |
int external |
创建MD设备时指定internal时,值为0 |
核心成员 |
描述 |
void *map |
指向一个page的指针起始位置,一个page中每2B的大小保存一个16位的bimtap_counter描述一个chunk的状态 |
unsigned in hijacked:1 |
当map申请失败时会被使用 |
unsigned int count:31 |
描述在这个page中有dirty位的bit个数 |
以下列出bitmap结构的核心部分:
核心成员 |
描述 |
struct bitmap_page *bp |
申请为一个数组,每个元素对应一个bitmap内存页 |
unsigned long pages |
描述bp数组元素的个数 |
unsigned long chunkshift |
通过bitmap-chunk计算出来的shift值 |
unsigned long chunks |
底层磁盘大小计算出来的chunk个数 |
spinlock_t lock |
Bitmap的自旋锁,保护filemap 的page |
struct page *sb_page |
存放md的bitmap的superblock的信息 |
struct page **filemap |
描述整个bitmap file的信息,以页的形式保存 |
unsigned long *filemap_attr |
每4bit对应filemap的一页 |
unsigned long file_pages |
描述bitmap file在filemap中用了多少个page |
unsigned long flags |
描述bitmap的状态 |
成员 |
描述 |
__le32 magic |
0 - 4 宏BITMAP_MAGIC,定义成0x6d746962 |
__le32 version |
4 - 8 the bitmap major for now, could change... |
__u8 uuid[16] |
8 - 24 128 bit uuid - must match md device uuid |
__le64 events |
24 - 32 event counter for the bitmap (1) |
__le64 events_cleared |
32 - 40 event counter when last bit cleared (2) |
__le64 sync_size |
40 - 48 the size of the md device's sync range(3) |
__le32 state |
48 - 52 bitmap state information |
__le32 chunksize |
52 - 56 the bitmap chunk size in bytes |
__le32 daemon_sleep |
56 - 60 seconds between disk flushes |
__le32 write_behind |
60 - 64 number of outstanding write-behind writes |
__le8 pad[256 - 64] |
set to zero |
上述结构是在md设备创建时,由应用层程序mdadm进行初始化赋值。在kernel中,是直接通过读取bitmap file对应位置的信息保存在sb_page中,然后通过内存映射,将这些值读出来的。
值得关注的是,event记录md设备的最后一个事件,这个事件被记录在md的超级块的events和mddev结构中events中,在MD中某个成员盘加载时,可以比较这两个结构中的events确定bitmap文件是否已经过期。Bitmap信息可以存在在md设备之外,单独指定一个磁盘/文件,此时mddev结构中的bitmap_file表示这个bitmap文件。
Bitmap信息也可以存放在md设备自身,bitmap文件相对于md的超级块的位置由bitmap_offset指定,当这个值为负值时,表示bitmap文件存放在超级块之前。这里假设bitmap_offset大于0,则表示bitmap磁盘文件在超级块之后。
Bitmap文件状态如下,记录在bitmap->flags和bitmap->sb->state中:
1. BITMAP_STALE = 0x002:此状态被设置,表示bitmap file已经过期;
2. BITMAP_WRITE_ERROR = 0x004:此状态在发生写错误时,被设置;
3. BITMAP_HOSTENDIAN = 0x8000:当bitmap->sb.version == BITMAP_MAJOR_HOSTENDIAN(3)时被设置
下面以bitmap信息存放在MD设备自身为例,此时bitmap_file=NULL。