summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-12-23 09:57:19 +1100
committerNeilBrown <neilb@suse.de>2011-12-23 09:57:19 +1100
commit60fc13702a1b35118c1548e9c257fa038cecb658 (patch)
tree163094eb4ae229f9263bfd05b788f29cc14e94f5
parent30d7a4836847bdb10b32c78a4879d4aebe0f193b (diff)
downloadlinux-60fc13702a1b35118c1548e9c257fa038cecb658.tar.gz
linux-60fc13702a1b35118c1548e9c257fa038cecb658.tar.bz2
linux-60fc13702a1b35118c1548e9c257fa038cecb658.zip
md: don't give up looking for spares on first failure-to-add
Before performing a recovery we try to remove any spares that might not be working, then add any that might have become relevant. Currently we abort on the first spare that cannot be added. This is a false optimisation. It is conceivable that - depending on rules in the personality - a subsequent spare might be accepted. Also the loop does other things like count the available spares and reset the 'recovery_offset' value. If we abort early these might not happen properly. So remove the early abort. In particular if you have an array what is undergoing recovery and which has extra spares, then the recovery may not restart after as reboot as the could of 'spares' might end up as zero. Reported-by: Anssi Hannula <anssi.hannula@iki.fi> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/md.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index ee981737edfc..f47f1f8ac44b 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7360,8 +7360,7 @@ static int remove_and_add_spares(struct mddev *mddev)
spares++;
md_new_event(mddev);
set_bit(MD_CHANGE_DEVS, &mddev->flags);
- } else
- break;
+ }
}
}
}