On Wed, Nov 09, 2016 at 09:58:44AM +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > The patch below does not apply to the 4.4-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. Well, it applied, but it broke the build, so I dropped it. thanks, greg k-h > ------------------ original commit in Linus's tree ------------------ > > >From 579ed34f7b751b8add233cba4cf755258dbdd60a Mon Sep 17 00:00:00 2001 > From: Shaohua Li <shli@xxxxxx> > Date: Thu, 6 Oct 2016 14:13:52 -0700 > Subject: [PATCH] RAID10: ignore discard error > > This is the counterpart of raid10 fix. If a write error occurs, raid10 > will try to rewrite the bio in small chunk size. If the rewrite fails, > raid10 will record the error in bad block. narrow_write_error will > always use WRITE for the bio, but actually it could be a discard. Since > discard bio hasn't payload, write the bio will cause different issues. > But discard error isn't fatal, we can safely ignore it. This is what > this patch does. > > This issue should exist since discard is added, but only exposed with > recent arbitrary bio size feature. > > Cc: Sitsofe Wheeler <sitsofe@xxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx (v3.6) > Signed-off-by: Shaohua Li <shli@xxxxxx> > > 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; > > -- > To unsubscribe from this list: send the line "unsubscribe stable" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html