| From 1cc03eb93245e63b0b7a7832165efdc52e25b4e6 Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.de> |
| Date: Mon, 6 Jan 2014 13:19:42 +1100 |
| Subject: md/raid5: Fix possible confusion when multiple write errors occur. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| commit 1cc03eb93245e63b0b7a7832165efdc52e25b4e6 upstream. |
| |
| commit 5d8c71f9e5fbdd95650be00294d238e27a363b5c |
| md: raid5 crash during degradation |
| |
| Fixed a crash in an overly simplistic way which could leave |
| R5_WriteError or R5_MadeGood set in the stripe cache for devices |
| for which it is no longer relevant. |
| When those devices are removed and spares added the flags are still |
| set and can cause incorrect behaviour. |
| |
| commit 14a75d3e07c784c004b4b44b34af996b8e4ac453 |
| md/raid5: preferentially read from replacement device if possible. |
| |
| Fixed the same bug if a more effective way, so we can now revert |
| the original commit. |
| |
| Reported-and-tested-by: Alexander Lyakas <alex.bolshoy@gmail.com> |
| Fixes: 5d8c71f9e5fbdd95650be00294d238e27a363b5c |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/raid5.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/md/raid5.c |
| +++ b/drivers/md/raid5.c |
| @@ -3502,7 +3502,7 @@ static void analyse_stripe(struct stripe |
| */ |
| set_bit(R5_Insync, &dev->flags); |
| |
| - if (rdev && test_bit(R5_WriteError, &dev->flags)) { |
| + if (test_bit(R5_WriteError, &dev->flags)) { |
| /* This flag does not apply to '.replacement' |
| * only to .rdev, so make sure to check that*/ |
| struct md_rdev *rdev2 = rcu_dereference( |
| @@ -3515,7 +3515,7 @@ static void analyse_stripe(struct stripe |
| } else |
| clear_bit(R5_WriteError, &dev->flags); |
| } |
| - if (rdev && test_bit(R5_MadeGood, &dev->flags)) { |
| + if (test_bit(R5_MadeGood, &dev->flags)) { |
| /* This flag does not apply to '.replacement' |
| * only to .rdev, so make sure to check that*/ |
| struct md_rdev *rdev2 = rcu_dereference( |