|
@@ -447,6 +447,9 @@ static void raid10_end_write_request(struct bio *bio)
|
|
|
struct r10conf *conf = r10_bio->mddev->private;
|
|
|
int slot, repl;
|
|
|
struct md_rdev *rdev = NULL;
|
|
|
+ bool discard_error;
|
|
|
+
|
|
|
+ discard_error = bio->bi_error && bio_op(bio) == REQ_OP_DISCARD;
|
|
|
|
|
|
dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl);
|
|
|
|
|
@@ -460,7 +463,7 @@ static void raid10_end_write_request(struct bio *bio)
|
|
|
/*
|
|
|
* this branch is our 'one mirror IO has finished' event handler:
|
|
|
*/
|
|
|
- if (bio->bi_error) {
|
|
|
+ if (bio->bi_error && !discard_error) {
|
|
|
if (repl)
|
|
|
/* Never record new bad blocks to replacement,
|
|
|
* just fail it.
|
|
@@ -503,7 +506,7 @@ static void raid10_end_write_request(struct bio *bio)
|
|
|
if (is_badblock(rdev,
|
|
|
r10_bio->devs[slot].addr,
|
|
|
r10_bio->sectors,
|
|
|
- &first_bad, &bad_sectors)) {
|
|
|
+ &first_bad, &bad_sectors) && !discard_error) {
|
|
|
bio_put(bio);
|
|
|
if (repl)
|
|
|
r10_bio->devs[slot].repl_bio = IO_MADE_GOOD;
|