| From 9a3f530f39f4490eaa18b02719fb74ce5f4d2d86 Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.de> |
| Date: Tue, 8 Nov 2011 16:22:01 +1100 |
| Subject: md/raid5: abort any pending parity operations when array fails. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| commit 9a3f530f39f4490eaa18b02719fb74ce5f4d2d86 upstream. |
| |
| When the number of failed devices exceeds the allowed number |
| we must abort any active parity operations (checks or updates) as they |
| are no longer meaningful, and can lead to a BUG_ON in |
| handle_parity_checks6. |
| |
| This bug was introduce by commit 6c0069c0ae9659e3a91b68eaed06a5c6c37f45c8 |
| in 2.6.29. |
| |
| Reported-by: Manish Katiyar <mkatiyar@gmail.com> |
| Tested-by: Manish Katiyar <mkatiyar@gmail.com> |
| Acked-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/raid5.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/md/raid5.c |
| +++ b/drivers/md/raid5.c |
| @@ -3165,10 +3165,14 @@ static void handle_stripe(struct stripe_ |
| /* check if the array has lost more than max_degraded devices and, |
| * if so, some requests might need to be failed. |
| */ |
| - if (s.failed > conf->max_degraded && s.to_read+s.to_write+s.written) |
| - handle_failed_stripe(conf, sh, &s, disks, &s.return_bi); |
| - if (s.failed > conf->max_degraded && s.syncing) |
| - handle_failed_sync(conf, sh, &s); |
| + if (s.failed > conf->max_degraded) { |
| + sh->check_state = 0; |
| + sh->reconstruct_state = 0; |
| + if (s.to_read+s.to_write+s.written) |
| + handle_failed_stripe(conf, sh, &s, disks, &s.return_bi); |
| + if (s.syncing) |
| + handle_failed_sync(conf, sh, &s); |
| + } |
| |
| /* |
| * might be able to return some write requests if the parity blocks |