linux内核md源代码解读 七 阵列同步一 :先容阵列同步
看完了以上的注释,我已经泪流满面了,因为写代码的哥们太敬业了,把所有精华都已经说出来了,害得像我这种写个博文已经没有什么可写的了。还好我写博文只是自娱自乐,如果是拿这个当饭碗还不早就喝西北风了。 说归说,还是得一行行阅读代码: 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 } (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |