diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index be1a9fca3b2d..39fddda2fef2 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -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;  | 
