diff options
author | Ben Hutchings <ben@decadent.org.uk> | 2014-12-07 20:00:27 +0000 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2014-12-13 15:16:18 +0100 |
commit | d49465185ef41bea43666e349b72b6d1e1fbd296 (patch) | |
tree | ee5004b032b2433e383a99959d36b8570921853f | |
parent | 7185a7199b3e6540e72c718db0ad1a91676e37d0 (diff) |
md/raid6: Fix misapplied backport in 2.6.32.64
Upstream commit 9c4bdf697c39 ("md/raid6: avoid data corruption during
recovery of double-degraded RAID6") changes handle_stripe(), but we
have separate functions for RAID5 and RAID6 and need to apply the
change to handle_stripe6(). When cherry-picked, the change was
wrongly applied to handle_stripe5().
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Willy Tarreau <w@1wt.eu>
-rw-r--r-- | drivers/md/raid5.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 013e598ed6be..4d70eef22354 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3091,8 +3091,6 @@ static void handle_stripe5(struct stripe_head *sh) set_bit(R5_Wantwrite, &dev->flags); if (prexor) continue; - if (s.failed > 1) - continue; if (!test_bit(R5_Insync, &dev->flags) || (i == sh->pd_idx && s.failed == 0)) set_bit(STRIPE_INSYNC, &sh->state); @@ -3380,6 +3378,8 @@ static void handle_stripe6(struct stripe_head *sh) pr_debug("Writing block %d\n", i); BUG_ON(!test_bit(R5_UPTODATE, &dev->flags)); set_bit(R5_Wantwrite, &dev->flags); + if (s.failed > 1) + continue; if (!test_bit(R5_Insync, &dev->flags) || ((i == sh->pd_idx || i == qd_idx) && s.failed == 0)) |