From 4e56282b596f2d00ca82d242b206e88dff4365ea Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 5 Aug 2008 15:54:13 +1000 Subject: [PATCH] --- yaml --- r: 108525 b: refs/heads/master c: c89a8eee61540df04fc83f32f51ef0f46ec018b1 h: refs/heads/master i: 108523: 8e30ce39cd6c3430005f025b05010874eb0f2704 v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 636a6397b4b6..150dd0db0b42 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ac4090d24c6a26211bc4523d920376e054d4f3f8 +refs/heads/master: c89a8eee61540df04fc83f32f51ef0f46ec018b1 diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index 6eb95451f161..25b893ec562e 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -6003,7 +6003,7 @@ static int remove_and_add_spares(mddev_t *mddev) } } - if (mddev->degraded) { + if (mddev->degraded && ! mddev->ro) { rdev_for_each(rdev, rtmp, mddev) { if (rdev->raid_disk >= 0 && !test_bit(In_sync, &rdev->flags) && @@ -6077,6 +6077,8 @@ void md_check_recovery(mddev_t *mddev) flush_signals(current); } + if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) + return; if ( ! ( (mddev->flags && !mddev->external) || test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || @@ -6090,6 +6092,15 @@ void md_check_recovery(mddev_t *mddev) if (mddev_trylock(mddev)) { int spares = 0; + if (mddev->ro) { + /* Only thing we do on a ro array is remove + * failed devices. + */ + remove_and_add_spares(mddev); + clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + goto unlock; + } + if (!mddev->external) { int did_change = 0; spin_lock_irq(&mddev->write_lock);