]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
md: Wait for md_check_recovery before attempting device removal.
authorHannes Reinecke <hare@suse.de>
Tue, 2 Apr 2013 06:38:55 +0000 (08:38 +0200)
committerNeilBrown <neilb@suse.de>
Thu, 13 Jun 2013 22:10:26 +0000 (08:10 +1000)
When a device has failed, it needs to be removed from the personality
module before it can be removed from the array as a whole.
The first step is performed by md_check_recovery() which is called
from the raid management thread.

So when a HOT_REMOVE ioctl arrives, wait briefly for md_check_recovery
to have run.  This increases the chance that the ioctl will succeed.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Neil Brown <nfbrown@suse.de>
drivers/md/md.c

index 9b82377a833bd6572b628c79426ca153781fd712..3b25b72ef0b6b594a954c73d04ea46ff9631183b 100644 (file)
@@ -6405,6 +6405,12 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
                /* need to ensure md_delayed_delete() has completed */
                flush_workqueue(md_misc_wq);
 
+       if (cmd == HOT_REMOVE_DISK)
+               /* need to ensure recovery thread has run */
+               wait_event_interruptible_timeout(mddev->sb_wait,
+                                                !test_bit(MD_RECOVERY_NEEDED,
+                                                          &mddev->flags),
+                                                msecs_to_jiffies(5000));
        err = mddev_lock(mddev);
        if (err) {
                printk(KERN_INFO 
@@ -7892,6 +7898,8 @@ void md_check_recovery(struct mddev *mddev)
                        md_new_event(mddev);
                }
        unlock:
+               wake_up(&mddev->sb_wait);
+
                if (!mddev->sync_thread) {
                        clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
                        if (test_and_clear_bit(MD_RECOVERY_RECOVER,