From: NeilBrown <neilb@cse.unsw.edu.au>
Currently if there are two failed drives, and two spares are added, then
recovery starts onto the first spare, but never notices the second spare. To
cope, we set RECOVERY_NEEDED when recovery finishes so that we re-check.
if (mddev->sb_dirty)
md_update_sb(mddev);
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
- !test_bit(MD_RECOVERY_DONE, &mddev->recovery))
+ !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
/* resync/recovery still happening */
+ clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
goto unlock;
+ }
if (mddev->sync_thread) {
/* resync has finished, collect result */
md_unregister_thread(mddev->sync_thread);
}
md_update_sb(mddev);
mddev->recovery = 0;
+ /* flag recovery needed just to double check */
+ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
wake_up(&resync_wait);
goto unlock;
}
if (mddev->recovery) {
- /* that's odd.. */
+ /* probably just the RECOVERY_NEEDED flag */
mddev->recovery = 0;
wake_up(&resync_wait);
}