Message ID | 20151006041953.GA7948@xzibit.linux.bs1.fc.nec.co.jp (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Mike Snitzer |
Headers | show |
On Tue, Oct 06 2015 at 12:19am -0400, Junichi Nomura <j-nomura@ce.jp.nec.com> wrote: > end_clone_bio() is a endio callback for clone bio and should check > and save the clone's bi_error for error reporting. However, > 4246a0b63bd8 ("block: add a bi_error field to struct bio") changed > the function to check the original bio's bi_error, which is 0. > > Without this fix, clone's error is ignored and reported to the > original request as success. Thus data corruption will be observed. > > Fixes: 4246a0b63bd8 ("block: add a bi_error field to struct bio") > Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> > Cc: Christoph Hellwig <hch@lst.de> Thanks, I've applied it here: https://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=for-next&id=50887bd139b83ce4489ed865a04bf1be5559c4ad I'll send it to Linus by the end of the week for 4.3-rc5 inclusion. -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 7289ece..dd6e667 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1001,7 +1001,9 @@ static void end_clone_bio(struct bio *clone) struct dm_rq_target_io *tio = info->tio; struct bio *bio = info->orig; unsigned int nr_bytes = info->orig->bi_iter.bi_size; + int error; + error = clone->bi_error; bio_put(clone); if (tio->error) @@ -1011,13 +1013,13 @@ static void end_clone_bio(struct bio *clone) * the remainder. */ return; - else if (bio->bi_error) { + else if (error) { /* * Don't notice the error to the upper layer yet. * The error handling decision is made by the target driver, * when the request is completed. */ - tio->error = bio->bi_error; + tio->error = error; return; }
end_clone_bio() is a endio callback for clone bio and should check and save the clone's bi_error for error reporting. However, 4246a0b63bd8 ("block: add a bi_error field to struct bio") changed the function to check the original bio's bi_error, which is 0. Without this fix, clone's error is ignored and reported to the original request as success. Thus data corruption will be observed. Fixes: 4246a0b63bd8 ("block: add a bi_error field to struct bio") Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Cc: Christoph Hellwig <hch@lst.de> --- drivers/md/dm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)