]> git.hungrycats.org Git - linux/commitdiff
[PATCH] md: Make sure md recovery happens appropriately.
authorAndrew Morton <akpm@osdl.org>
Tue, 20 Jan 2004 11:12:27 +0000 (03:12 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Tue, 20 Jan 2004 11:12:27 +0000 (03:12 -0800)
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.

drivers/md/md.c

index 95c8f87ba83c6eb811e3a2889227aa9baa8a56b6..b278d1db753d7674b02d8da2d47ce289154f3152 100644 (file)
@@ -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);
                }