MD中的bitmap(4) - Bitmap的设置

 

Bitmap在磁阵处理写访问请求时,调用bitmap_startwrite设置bitmap内存的信息,包括内存中的bitmap结构,以及内存中bitmap磁盘文件的映射filemap;在磁阵实际将写请求实际提交给子设备前,调用bitmap_unplugbitmap信息写入磁盘。

除这两个函数外,bitmap_start_syncbitmap_end_syncbitmap_endwrite等函数也和bitmap的一些标志设置有关。

bitmap_startwrite

该函数在磁阵处理访问请求时(make_request)调用。函数主要完成:

1. 如果是延迟写,则增加延迟写计数

2. 由于一个写操作涉及的数据段可能对应多个bitmap,对于每个这样的bitmap

a)       获取该bitmap的内存结构,即bp数组指向的内容

b)       如果该bitmapCOUNTER达到最大值,说明磁阵上该数据区正在进行的写访问已经太多,磁阵等待太久,此时需要启动设备的队列处理。

c)       如果bitmap上没有正在进行的写操作(COUNT=0),设置filemap的对应bit。将内存bitmap结构COUNT直接设置为2

d)       Bitmap内存结构COUNT累加。(也就是写操作计数为0时,表示没有写入操作;为12都是特殊状态,3表示有一个写入,依次类推)

bitmap_unplug

遍历bitmap的所有filemap页,如有标记为脏的页(BITMAP_PAGE_DIRTY bit置位时设置),或者为需要写入的(BITMAP_PAGE_NEEDWRITE bit清除时设置),则将该页写入磁盘。

如果有脏页,则等待写入结束后返回。

注意这里如果只有BITMAP_PAGE_NEEDWRITE标记的页,是不需要等待的,因为bit的清除并不是很关键,即使这个信息丢失,最多不过是多余的同步操作而已,没有副作用。而bit设置则需要可靠写入磁盘后方可进行磁阵条带的写入,否则在条带数据写入磁盘过程中,bitmap写入磁盘前,磁阵出现异常,则可能导致数据不一致而bitmap不能发觉。

bitmap_start_sync

在磁阵同步操作开始时,调用该函数。

这个函数获取bitmap的内存结构,如果NEED标志或者RESYNC标志被设置,就认为该数据块需要同步,此时如果磁阵工作完好,则清除NEED标志,设置RESYNC标志;如果NEEDRESYNC都没有设置,则认为该数据块不需要同步。

bitmap_end_sync

磁阵同步完成后,调用该函数。

这个函数获取bitmap的内存结构,如果RESYNC标志被设置,则清除该标志。如果同步是失败的,则设置NEED位。如果COUNT小于3,则设置该页file_attrBITMAP_PAGE_CLEAN(下文简写为CLEAN),表示该页存在需要清除的bit位。

bitmap_endwrite

写操作完成后,取出对应数据段的bitmap内存结构,COUNT递减,如果COUNT小于3,则设置对应filemap页的CLEAN属性。

    如果写失败,则设置对应bitmapNEED标志。

你可能感兴趣的:(c,工作,File,磁盘)