Bitmap在磁阵处理写访问请求时,调用bitmap_startwrite设置bitmap内存的信息,包括内存中的bitmap结构,以及内存中bitmap磁盘文件的映射filemap;在磁阵实际将写请求实际提交给子设备前,调用bitmap_unplug将bitmap信息写入磁盘。
除这两个函数外,bitmap_start_sync,bitmap_end_sync,bitmap_endwrite等函数也和bitmap的一些标志设置有关。
bitmap_startwrite
该函数在磁阵处理访问请求时(make_request)调用。函数主要完成:
1. 如果是延迟写,则增加延迟写计数
2. 由于一个写操作涉及的数据段可能对应多个bitmap,对于每个这样的bitmap:
a) 获取该bitmap的内存结构,即bp数组指向的内容
b) 如果该bitmap的COUNTER达到最大值,说明磁阵上该数据区正在进行的写访问已经太多,磁阵等待太久,此时需要启动设备的队列处理。
c) 如果bitmap上没有正在进行的写操作(COUNT=0),设置filemap的对应bit。将内存bitmap结构COUNT直接设置为2。
d) Bitmap内存结构COUNT累加。(也就是写操作计数为0时,表示没有写入操作;为1,2都是特殊状态,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标志;如果NEED和RESYNC都没有设置,则认为该数据块不需要同步。
bitmap_end_sync
磁阵同步完成后,调用该函数。
这个函数获取bitmap的内存结构,如果RESYNC标志被设置,则清除该标志。如果同步是失败的,则设置NEED位。如果COUNT小于3,则设置该页file_attr的BITMAP_PAGE_CLEAN(下文简写为CLEAN),表示该页存在需要清除的bit位。
bitmap_endwrite
写操作完成后,取出对应数据段的bitmap内存结构,COUNT递减,如果COUNT小于3,则设置对应filemap页的CLEAN属性。
如果写失败,则设置对应bitmap的NEED标志。