|
@@ -2369,8 +2369,8 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
|
|
|
|
|
/* complete a check operation */
|
|
|
if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
|
|
|
- clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
|
|
|
- clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
|
|
|
+ clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
|
|
|
+ clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
|
|
|
if (s->failed == 0) {
|
|
|
if (sh->ops.zero_sum_result == 0)
|
|
|
/* parity is correct (on disc,
|
|
@@ -2400,16 +2400,6 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
|
|
canceled_check = 1; /* STRIPE_INSYNC is not set */
|
|
|
}
|
|
|
|
|
|
- /* check if we can clear a parity disk reconstruct */
|
|
|
- if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) &&
|
|
|
- test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
|
|
|
-
|
|
|
- clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending);
|
|
|
- clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete);
|
|
|
- clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack);
|
|
|
- clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
|
|
|
- }
|
|
|
-
|
|
|
/* start a new check operation if there are no failures, the stripe is
|
|
|
* not insync, and a repair is not in flight
|
|
|
*/
|
|
@@ -2424,6 +2414,17 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /* check if we can clear a parity disk reconstruct */
|
|
|
+ if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) &&
|
|
|
+ test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
|
|
|
+
|
|
|
+ clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending);
|
|
|
+ clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete);
|
|
|
+ clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack);
|
|
|
+ clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/* Wait for check parity and compute block operations to complete
|
|
|
* before write-back. If a failure occurred while the check operation
|
|
|
* was in flight we need to cycle this stripe through handle_stripe
|