1 Bitmap实现
1.1 bitmap原理
简单的说,bitmap的工作原理就是使用一个位图,每个位对应md设备的一个数据块,在md设备有数据写入时,设置该数据块对应的位,等待写入完成后,再清除该数据块对应的位。
当需要进行数据同步/恢复时,参照bitmap的位图,只有设置了位对应的数据块才需要进行同步/恢复操作。
1.2 核心数据结构
1.2.1 Bitmap_info结构
此结构定义在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 |
有cli传入,这里传入internal时,此值为0 |
1.2.2 Bitmap_page结构
核心成员 |
描述 |
void *map |
指向一个page的指针起始位置,一个page中每2B的大小保存一个16位的bimtap_counter描述一个chunk的状态 |
unsigned in hijacked:1 |
当map申请失败时会被使用 |
unsigned int count:31 |
描述在这个page中有dirty位的bit个数 |
1.2.3 Bitmap结构
以下列出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 |