
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.



---

 25-akpm/drivers/md/md.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff -puN drivers/md/md.c~md-05-recovery-fix drivers/md/md.c
--- 25/drivers/md/md.c~md-05-recovery-fix	Thu Jan 15 17:36:18 2004
+++ 25-akpm/drivers/md/md.c	Thu Jan 15 17:36:18 2004
@@ -3376,9 +3376,11 @@ void md_check_recovery(mddev_t *mddev)
 		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);
@@ -3391,11 +3393,13 @@ void md_check_recovery(mddev_t *mddev)
 			}
 			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);
 		}

_
