|
@@ -3490,40 +3490,6 @@ static void handle_stripe(struct stripe_head *sh)
|
|
handle_failed_sync(conf, sh, &s);
|
|
handle_failed_sync(conf, sh, &s);
|
|
}
|
|
}
|
|
|
|
|
|
- /*
|
|
|
|
- * might be able to return some write requests if the parity blocks
|
|
|
|
- * are safe, or on a failed drive
|
|
|
|
- */
|
|
|
|
- pdev = &sh->dev[sh->pd_idx];
|
|
|
|
- s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx)
|
|
|
|
- || (s.failed >= 2 && s.failed_num[1] == sh->pd_idx);
|
|
|
|
- qdev = &sh->dev[sh->qd_idx];
|
|
|
|
- s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx)
|
|
|
|
- || (s.failed >= 2 && s.failed_num[1] == sh->qd_idx)
|
|
|
|
- || conf->level < 6;
|
|
|
|
-
|
|
|
|
- if (s.written &&
|
|
|
|
- (s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
|
|
|
|
- && !test_bit(R5_LOCKED, &pdev->flags)
|
|
|
|
- && (test_bit(R5_UPTODATE, &pdev->flags) ||
|
|
|
|
- test_bit(R5_Discard, &pdev->flags))))) &&
|
|
|
|
- (s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
|
|
|
|
- && !test_bit(R5_LOCKED, &qdev->flags)
|
|
|
|
- && (test_bit(R5_UPTODATE, &qdev->flags) ||
|
|
|
|
- test_bit(R5_Discard, &qdev->flags))))))
|
|
|
|
- handle_stripe_clean_event(conf, sh, disks, &s.return_bi);
|
|
|
|
-
|
|
|
|
- /* Now we might consider reading some blocks, either to check/generate
|
|
|
|
- * parity, or to satisfy requests
|
|
|
|
- * or to load a block that is being partially written.
|
|
|
|
- */
|
|
|
|
- if (s.to_read || s.non_overwrite
|
|
|
|
- || (conf->level == 6 && s.to_write && s.failed)
|
|
|
|
- || (s.syncing && (s.uptodate + s.compute < disks))
|
|
|
|
- || s.replacing
|
|
|
|
- || s.expanding)
|
|
|
|
- handle_stripe_fill(sh, &s, disks);
|
|
|
|
-
|
|
|
|
/* Now we check to see if any write operations have recently
|
|
/* Now we check to see if any write operations have recently
|
|
* completed
|
|
* completed
|
|
*/
|
|
*/
|
|
@@ -3561,6 +3527,40 @@ static void handle_stripe(struct stripe_head *sh)
|
|
s.dec_preread_active = 1;
|
|
s.dec_preread_active = 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * might be able to return some write requests if the parity blocks
|
|
|
|
+ * are safe, or on a failed drive
|
|
|
|
+ */
|
|
|
|
+ pdev = &sh->dev[sh->pd_idx];
|
|
|
|
+ s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx)
|
|
|
|
+ || (s.failed >= 2 && s.failed_num[1] == sh->pd_idx);
|
|
|
|
+ qdev = &sh->dev[sh->qd_idx];
|
|
|
|
+ s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx)
|
|
|
|
+ || (s.failed >= 2 && s.failed_num[1] == sh->qd_idx)
|
|
|
|
+ || conf->level < 6;
|
|
|
|
+
|
|
|
|
+ if (s.written &&
|
|
|
|
+ (s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
|
|
|
|
+ && !test_bit(R5_LOCKED, &pdev->flags)
|
|
|
|
+ && (test_bit(R5_UPTODATE, &pdev->flags) ||
|
|
|
|
+ test_bit(R5_Discard, &pdev->flags))))) &&
|
|
|
|
+ (s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
|
|
|
|
+ && !test_bit(R5_LOCKED, &qdev->flags)
|
|
|
|
+ && (test_bit(R5_UPTODATE, &qdev->flags) ||
|
|
|
|
+ test_bit(R5_Discard, &qdev->flags))))))
|
|
|
|
+ handle_stripe_clean_event(conf, sh, disks, &s.return_bi);
|
|
|
|
+
|
|
|
|
+ /* Now we might consider reading some blocks, either to check/generate
|
|
|
|
+ * parity, or to satisfy requests
|
|
|
|
+ * or to load a block that is being partially written.
|
|
|
|
+ */
|
|
|
|
+ if (s.to_read || s.non_overwrite
|
|
|
|
+ || (conf->level == 6 && s.to_write && s.failed)
|
|
|
|
+ || (s.syncing && (s.uptodate + s.compute < disks))
|
|
|
|
+ || s.replacing
|
|
|
|
+ || s.expanding)
|
|
|
|
+ handle_stripe_fill(sh, &s, disks);
|
|
|
|
+
|
|
/* Now to consider new write requests and what else, if anything
|
|
/* Now to consider new write requests and what else, if anything
|
|
* should be read. We do not handle new writes when:
|
|
* should be read. We do not handle new writes when:
|
|
* 1/ A 'write' operation (copy+xor) is already in flight.
|
|
* 1/ A 'write' operation (copy+xor) is already in flight.
|