diff options
author | NeilBrown <neilb@suse.com> | 2015-09-24 04:00:51 (GMT) |
---|---|---|
committer | NeilBrown <neilb@suse.com> | 2015-10-02 07:23:43 (GMT) |
commit | 88724bfa68be792c1487d759e87568c36ac1a1cc (patch) | |
tree | 12cf787a5922610396529d90ae82ccaf223a57d9 /drivers/md | |
parent | bcee19f424a0d8c26ecf2607b73c690802658b29 (diff) | |
download | linux-88724bfa68be792c1487d759e87568c36ac1a1cc.tar.xz |
md: wait for pending superblock updates before switching to read-only
If a superblock update is pending, wait for it to complete before
letting md_set_readonly() switch to readonly.
Otherwise we might lose important information about a device having
failed.
For external arrays, waiting for superblock updates can wait on
user-space, so in that case, just return an error.
Reported-and-tested-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4f5ecbe..b8247bc 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5409,9 +5409,13 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) * which will now never happen */ wake_up_process(mddev->sync_thread->tsk); + if (mddev->external && test_bit(MD_CHANGE_PENDING, &mddev->flags)) + return -EBUSY; mddev_unlock(mddev); wait_event(resync_wait, !test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)); + wait_event(mddev->sb_wait, + !test_bit(MD_CHANGE_PENDING, &mddev->flags)); mddev_lock_nointr(mddev); mutex_lock(&mddev->open_mutex); |