在前面描述的设置流程中,涵盖了全部的bitmap用户能够看到的流程,这些流程中只有bit的设置,但没有bit的清除。对于可以清除的bit,最多只是设置了所在的filemap页CLEAN属性,没有实际的清除filemap中的bit和写入磁盘。
Bitmap的bit清除工作是在bitmap_daemon_work函数中进行的,这个函数又在md_check_recovery中被调用,而md_check_recovery是在磁阵的守护进程中首先被调用的,所以实际上守护进程每次运行时,都要调用到bitmap_daemon_work。
这个函数完成这样一些工作:
1. 如果bitmap_daemon_work没有睡够,则直接返回。这个睡眠是为了将一定时间内的写盘操作集中批量处理。
2. 对于每个bit,取出其对应的filemap页:
i. 如果该页没有设置CLEAN和BITMAP_PAGE_NEEDWRITE(下文简写为NEEDWRITE)属性,则跳过该bit。如果没有设置CLEAN,而设置了NEEDWRITE,则将该filemap页写入磁盘,清除该页的NEEDWRITE标志,结束本bit的处理。
ii. 如果该页设置了CLEAN标记,则清除该页的CLEAN标记。本次bitmap_daemon_work执行中,清除该页的CLEAN标记只有这一次的机会,如果在iv中又一次设置了该页的CLEAN标志,则只能等到下一次函数调用才会再清除它了。
iii. 如果页中的所有bit都处理结束后,如果该页的CLEAN标记被清除过(如果没有清除过则不会记入oldpage中的),判断页的NEEDWRITE被设置,则清除该标志,将该页写入磁盘;否则设置NEEDWRITE标志,结束该页的处理。
iv. 获取该bit的内存结构,(如果NEED,RESYNC都没有设置,)COUNT为2,表明该bit对应的磁阵数据段已经没有写访问,设COUNT等于1,设置该bit对应的filemap页CLEAN属性;如果COUNT为1,设置COUNT等于0,清除filemap中对应bit。继续下一bit的处理。
这个函数的逻辑比较绕,但我们可以看到真正执行filemap中bit清除的工作是在该bit对应的内存结构的COUNT为1后进行的,而写盘操作是在filemap页的状态为NEEDWRITE后进行的。所以要理清逻辑关系,还需要对bit的COUNT和filemap的状态变化以及相互的关系做一个详细的了解:
1. COUNT是bit对应的磁阵数据段上正在进行的写操作的计数器,但0,1,2三个值比较特殊,这三个值都说明该数据段上没有写操作进行,真正的写操作数是从2开始累加的(bitmap_startwrite)。但0表示bit没有设置,1表示bit已经设置,2表示所有写操作刚刚结束。在清除阶段,COUNT为2,则设置所在filemap页的CLEAN属性,表示该页有bit需要清除。
2. filemap页的属性,CLEAN表示该页有bit需要清除;程序逻辑里,在CLEAN清除后,会设置页的NEEDWRITE标志。在NEEDWRITE标志设置后的下一次调用,则会把bitmap写入磁盘。
3. 为简化分析,可以以一个bit,一个页来进行分析:
a) 在磁阵对应内存段上写操作全部结束,bit对应的内存结构的COUNT为2时,此时设置filemap页CLEAN属性。
b) bitmap_daemon_work启动后,发现该页属性为CLEAN,则清除CLEAN标记。清除后,看到COUNT为2,又再次设置这个CLEAN标志,COUNT等于1。由于已经清除过一次CLEAN,所以filemap的页的NEEDWRITE标志被设置。对于这个bit和页来说,本次bitmap_daemon_work调用结束。
c) 下一次再次调用到bitmap_daemon_work后,由于CLEAN标记被设置,所以这次再被清除。由于COUNT为1,所以设置COUNT等于0,清除filemap页bit位,并且filemap也的NEEDWRITE属性被设置,所以进行了写盘。
4. 从流程分析看,这个逻辑存在一些缺陷,还是以一个bit的变化为例,如果在步骤b,c之间,该bit对应的数据段又发生了写操作,则c将不会清除bit位,此时的写盘也就没有必要。
5. 再者,CLEAN标记被清除一次后,就会设置NEEDWRITE标志,filemap中其他bit也存在再次设置CLEAN的可能。而这个再次设置显得混乱了,感觉应该在该页的所有bit处理完成后,再对页的CLEAN标记进行清除。
6. 另外,在bitmap_endwrite函数中,如果所有写请求完成后,COUNT已经为2,bitmap_endwrite函数也设置了filemap的CLEAN属性,和bitmap_daemon_work判断COUNT为2时再次设置CLEAN存在重复。
阅读(884) | 评论(0) | 转发(0) |