From dae5f6d3932f8d9f2fc102746bf2f827bf78a9c5 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 28 Feb 2013 11:59:03 +1100 Subject: [PATCH] --- yaml --- r: 360746 b: refs/heads/master c: f3378b48705154b9089affb2d2e939622aea68f1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 7eb3378724c4..690386b6db82 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 51acbcec6c42b24482bac18e42befc822524535d +refs/heads/master: f3378b48705154b9089affb2d2e939622aea68f1 diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index f363135144f6..fcb878f88796 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -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;