加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux内核md源代码解读 七 阵列同步一 :先容阵列同步

发布时间:2016-11-03 19:51:54 所属栏目:Linux 来源:站长网
导读:副标题#e# 阵列同步在md_do_sync,那么入口在哪里呢?就是说阵列同步触发点在哪里呢?听说过md_check_recovery吧,,但这还不是同步的入口点。那raid5d函数是入口点吧?如果要认真分析起来还不算是。 真正的同步入口点在do_md_run函数,就是在运行阵列run函

7746行,external表示超级块存储位置,为0表示存储在阵列所在磁盘上。默认值为0,也许好奇的你会问那可不可以既存储在外面又存储在阵列所在磁盘上呢?那只能怪你想像力太丰富了,不过我就是这么干的,原代码是不支持的需要自己修改代码支持这个特性。这个特性的重要性跟数据的重要性成正比。试想为什么市面上那么多数据恢复软件,为什么会丢数据?根本原因就是metadata丢了,metadata就是宝藏的藏宝图,再回头想想就很有必要啦。

7749行,这个判断就是刚刚7718行的判断,分支里代码也就验证了之前的说明,这个判断主要目的是用来更新超级块的。至于这里更新超级块的重要性理解了in_sync的功能就知道了。

7753行,设置in_sync标志。

7754行,设置阵列改变标识。

7755行,设置mddev改变标志。

7757行,设置safemode为0。尽管前面已经讲解了安全模式了,这里再从另外一个角度说一下,safemode标志就像软件看门狗,在阵列写数据时设置为0,然后需要在写完成时喂狗,如果不喂狗那么阵列为脏需要重新启动同步,喂狗程序就是safemode_timer定时器。

7760行,更新mddev的sysfs下状态。

7764行,更新阵列超级块。

7767行,同步线程正在工作,就没有必要再去凑热闹了。

7773行,同步已完成。

7774行,回收同步线程。

继续md_check_recovery函数:

7777                 /* Set RUNNING before clearing NEEDED to avoid 
7778                  * any transients in the value of "sync_action". 
7779                  */
7780                 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);  
7781                 /* Clear some bits that don't mean anything, but 
7782                  * might be left set 
7783                  */
7784                 clear_bit(MD_RECOVERY_INTR, &mddev->recovery);  
7785                 clear_bit(MD_RECOVERY_DONE, &mddev->recovery);  
7786   
7787                 if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||  
7788                     test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))  
7789                         goto unlock;  
7790                 /* no recovery is running. 
7791                  * remove any failed drives, then 
7792                  * add spares if possible. 
7793                  * Spare are also removed and re-added, to allow 
7794                  * the personality to fail the re-add. 
7795                  */
7796   
7797                 if (mddev->reshape_position != MaxSector) {  
7798                         if (mddev->pers->check_reshape == NULL ||  
7799                             mddev->pers->check_reshape(mddev) != 0)  
7800                                 /* Cannot proceed */
7801                                 goto unlock;  
7802                         set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);  
7803                         clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);  
7804                 } else if ((spares = remove_and_add_spares(mddev))) {  
7805                         clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);  
7806                         clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);  
7807                         clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);  
7808                         set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);  
7809                 } else if (mddev->recovery_cp < MaxSector) {  
7810                         set_bit(MD_RECOVERY_SYNC, &mddev->recovery);  
7811                         clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);  
7812                 } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))  
7813                         /* nothing to be done ... */
7814                         goto unlock;

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读