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标志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值