@@ -467,48 +467,51 @@ static void raid10_end_write_request(struct bio *bio)
dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl);
- if (repl)
+ if (repl) {
rdev = r10_bio->devs[slot].replacement;
- else
+ /* replacement may have replaced rdev */
+ if (rdev == conf->mirrors[dev].replacement) {
+ if (bio->bi_status && !discard_error) {
+ /*
+ * Never record new bad blocks to replacement,
+ * just fail it.
+ */
+ md_error(rdev->mddev, rdev);
+ goto out;
+ }
+ }
+ } else {
rdev = r10_bio->devs[slot].rdev;
+ }
/*
* this branch is our 'one mirror IO has finished' event handler:
*/
if (bio->bi_status && !discard_error) {
- /* replacement may have replaced rdev */
- if (repl && rdev == conf->mirrors[dev].replacement)
- /* Never record new bad blocks to replacement,
- * just fail it.
- */
- md_error(rdev->mddev, rdev);
- else {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
+ set_bit(WriteErrorSeen, &rdev->flags);
+ if (!test_and_set_bit(WantReplacement, &rdev->flags))
+ set_bit(MD_RECOVERY_NEEDED,
+ &rdev->mddev->recovery);
- dec_rdev = 0;
- if (test_bit(FailFast, &rdev->flags) &&
- (bio->bi_opf & MD_FAILFAST)) {
- md_error(rdev->mddev, rdev);
- }
+ dec_rdev = 0;
+ if (test_bit(FailFast, &rdev->flags) &&
+ (bio->bi_opf & MD_FAILFAST))
+ md_error(rdev->mddev, rdev);
- /*
- * When the device is faulty, it is not necessary to
- * handle write error.
- */
- if (!test_bit(Faulty, &rdev->flags))
- set_bit(R10BIO_WriteError, &r10_bio->state);
- else {
- /* Fail the request */
- set_bit(R10BIO_Degraded, &r10_bio->state);
- if (repl)
- r10_bio->devs[slot].repl_bio = NULL;
- else
- r10_bio->devs[slot].bio = NULL;
- to_put = bio;
- dec_rdev = 1;
- }
+ /*
+ * When the device is faulty, it is not necessary to
+ * handle write error.
+ */
+ if (!test_bit(Faulty, &rdev->flags)) {
+ set_bit(R10BIO_WriteError, &r10_bio->state);
+ } else {
+ /* Fail the request */
+ set_bit(R10BIO_Degraded, &r10_bio->state);
+ if (repl)
+ r10_bio->devs[slot].repl_bio = NULL;
+ else
+ r10_bio->devs[slot].bio = NULL;
+ to_put = bio;
+ dec_rdev = 1;
}
} else {
/*
@@ -540,16 +543,17 @@ static void raid10_end_write_request(struct bio *bio)
r10_bio->devs[slot].addr,
r10_bio->sectors,
&first_bad, &bad_sectors) && !discard_error) {
- bio_put(bio);
if (repl)
r10_bio->devs[slot].repl_bio = IO_MADE_GOOD;
else
r10_bio->devs[slot].bio = IO_MADE_GOOD;
+ bio_put(bio);
dec_rdev = 0;
set_bit(R10BIO_MadeGood, &r10_bio->state);
}
}
+out:
/*
*
* Let's see if all mirrored write operations have finished