linux内核md源代码解读 七 阵列同步一 :先容阵列同步
发布时间:2016-10-30 08:21:21 所属栏目: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 }
(编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


