加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (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函

看完了以上的注释,我已经泪流满面了,因为写代码的哥们太敬业了,把所有精华都已经说出来了,害得像我这种写个博文已经没有什么可写的了。还好我写博文只是自娱自乐,如果是拿这个当饭碗还不早就喝西北风了。

说归说,还是得一行行阅读代码:

7694 void md_check_recovery(struct mddev *mddev)  
7695 {  
7696         if (mddev->suspended)  
7697                 return;  
7698   
7699         if (mddev->bitmap)  
7700                 bitmap_daemon_work(mddev);  
7701   
7702         if (signal_pending(current)) {  
7703                 if (mddev->pers->sync_request && !mddev->external) {  
7704                         printk(KERN_INFO "md: %s in immediate safe moden",  
7705                                mdname(mddev));  
7706                         mddev->safemode = 2;  
7707                 }  
7708                 flush_signals(current);  
7709         }  
7710   
7711         if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))  
7712                 return;  
7713         if ( ! (  
7714                 (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) ||  
7715                 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||  
7716                 test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||  
7717                 (mddev->external == 0 && mddev->safemode == 1) ||  
7718                 (mddev->safemode == 2 && ! atomic_read(&mddev->writes_pending)  
7719                  && !mddev->in_sync && mddev->recovery_cp == MaxSector)  
7720                 ))  
7721                 return;

7696行,检查阵列是否挂起。阵列挂起是一个管理命令,挂起时可以将IO流hold住。

7699行,bitmap清理操作,等bitmap小节再讲。

7702行,接收到信号,进入safemode。

7711行,只读阵列并且未设置检查标志则返回。

7713行,只要一个条件满足,就继续检查,否则返回。

7714行,阵列状态发生改变,则继续检查。

7715行,设置了需要检查标志,则继续检查。

7716行,同步完成,则继续检查。

7717行,安全模式且非external,则继续检查。

7718行,safemode为2有两种情况,一是系统重启时,二是7768行接收到信号时,第一种情况时in_sync为1,第二种情况可以触发更新超级块,根据in_sync标志写回磁盘resync_offset等等。

7723         if (mddev_trylock(mddev)) {  
7724                 int spares = 0;  
...  
7746                 if (!mddev->external) {  
7747                         int did_change = 0;  
7748                         spin_lock_irq(&mddev->write_lock);  
7749                         if (mddev->safemode &&  
7750                             !atomic_read(&mddev->writes_pending) &&  
7751                             !mddev->in_sync &&  
7752                             mddev->recovery_cp == MaxSector) {  
7753                                 mddev->in_sync = 1;  
7754                                 did_change = 1;  
7755                                 set_bit(MD_CHANGE_CLEAN, &mddev->flags);  
7756                         }  
7757                         if (mddev->safemode == 1)  
7758                                 mddev->safemode = 0;  
7759                         spin_unlock_irq(&mddev->write_lock);  
7760                         if (did_change)  
7761                                 sysfs_notify_dirent_safe(mddev->sysfs_state);  
7762                 }  
7763   
7764                 if (mddev->flags)  
7765                         md_update_sb(mddev, 0);  
7766   
7767                 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&  
7768                     !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {  
7769                         /* resync/recovery still happening */
7770                         clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);  
7771                         goto unlock;  
7772                 }  
7773                 if (mddev->sync_thread) {  
7774                         reap_sync_thread(mddev);  
7775                         goto unlock;  
7776                 }

(编辑:温州站长网)

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

热点阅读