|
|
@@ -4185,7 +4185,7 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
|
|
/* now write out any block on a failed drive,
|
|
|
* or P or Q if they were recomputed
|
|
|
*/
|
|
|
- BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */
|
|
|
+ dev = NULL;
|
|
|
if (s->failed == 2) {
|
|
|
dev = &sh->dev[s->failed_num[1]];
|
|
|
s->locked++;
|
|
|
@@ -4210,6 +4210,14 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
|
|
set_bit(R5_LOCKED, &dev->flags);
|
|
|
set_bit(R5_Wantwrite, &dev->flags);
|
|
|
}
|
|
|
+ if (WARN_ONCE(dev && !test_bit(R5_UPTODATE, &dev->flags),
|
|
|
+ "%s: disk%td not up to date\n",
|
|
|
+ mdname(conf->mddev),
|
|
|
+ dev - (struct r5dev *) &sh->dev)) {
|
|
|
+ clear_bit(R5_LOCKED, &dev->flags);
|
|
|
+ clear_bit(R5_Wantwrite, &dev->flags);
|
|
|
+ s->locked--;
|
|
|
+ }
|
|
|
clear_bit(STRIPE_DEGRADED, &sh->state);
|
|
|
|
|
|
set_bit(STRIPE_INSYNC, &sh->state);
|