]> Git Repo - linux.git/commitdiff
md: expedite metadata update when switching read-auto -> active
authorNeilBrown <[email protected]>
Thu, 28 Feb 2013 00:59:03 +0000 (11:59 +1100)
committerNeilBrown <[email protected]>
Thu, 28 Feb 2013 00:59:03 +0000 (11:59 +1100)
If something has failed while the array was read-auto,
then when we switch to 'active' we need to update the metadata.
This will happen anyway but it is good to expedite it, and
also to ensure any failed device has been released by the
underlying device before we try to action the ioctl which
caused us to switch to 'active' mode.

Reported-by: Joe Lawrence <[email protected]>
Signed-off-by: NeilBrown <[email protected]>
drivers/md/md.c

index f363135144f62fe4ea9cdb4abf4ad5b6bdcf80cf..fcb878f88796c8ab884da058b36ea5f287fe2eab 100644 (file)
@@ -6532,7 +6532,17 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
                        mddev->ro = 0;
                        sysfs_notify_dirent_safe(mddev->sysfs_state);
                        set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-                       md_wakeup_thread(mddev->thread);
+                       /* mddev_unlock will wake thread */
+                       /* If a device failed while we were read-only, we
+                        * need to make sure the metadata is updated now.
+                        */
+                       if (test_bit(MD_CHANGE_DEVS, &mddev->flags)) {
+                               mddev_unlock(mddev);
+                               wait_event(mddev->sb_wait,
+                                          !test_bit(MD_CHANGE_DEVS, &mddev->flags) &&
+                                          !test_bit(MD_CHANGE_PENDING, &mddev->flags));
+                               mddev_lock(mddev);
+                       }
                } else {
                        err = -EROFS;
                        goto abort_unlock;
This page took 0.083241 seconds and 4 git commands to generate.