linux内核md源代码解读 七 阵列同步一 :先容阵列同步
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; (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |