From ff027110c89833f10d0454035d278b5cf74d3bf6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 31 Jul 2015 10:28:33 -0700 Subject: [PATCH] 3.14-stable patches added patches: block-do-a-full-clone-when-splitting-discard-bios.patch --- ...ll-clone-when-splitting-discard-bios.patch | 64 +++++++++++++++++++ queue-3.14/series | 1 + 2 files changed, 65 insertions(+) create mode 100644 queue-3.14/block-do-a-full-clone-when-splitting-discard-bios.patch diff --git a/queue-3.14/block-do-a-full-clone-when-splitting-discard-bios.patch b/queue-3.14/block-do-a-full-clone-when-splitting-discard-bios.patch new file mode 100644 index 00000000000..e3c6e146e74 --- /dev/null +++ b/queue-3.14/block-do-a-full-clone-when-splitting-discard-bios.patch @@ -0,0 +1,64 @@ +From f3f5da624e0a891c34d8cd513c57f1d9b0c7dadc Mon Sep 17 00:00:00 2001 +From: "Martin K. Petersen" +Date: Wed, 22 Jul 2015 07:57:12 -0400 +Subject: block: Do a full clone when splitting discard bios + +From: "Martin K. Petersen" + +commit f3f5da624e0a891c34d8cd513c57f1d9b0c7dadc upstream. + +This fixes a data corruption bug when using discard on top of MD linear, +raid0 and raid10 personalities. + +Commit 20d0189b1012 "block: Introduce new bio_split()" permits sharing +the bio_vec between the two resulting bios. That is fine for read/write +requests where the bio_vec is immutable. For discards, however, we need +to be able to attach a payload and update the bio_vec so the page can +get mapped to a scatterlist entry. Therefore the bio_vec can not be +shared when splitting discards and we must do a full clone. + +Signed-off-by: Martin K. Petersen +Reported-by: Seunguk Shin +Tested-by: Seunguk Shin +Cc: Seunguk Shin +Cc: Jens Axboe +Cc: Kent Overstreet +Reviewed-by: Christoph Hellwig +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + fs/bio.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +--- a/fs/bio.c ++++ b/fs/bio.c +@@ -1806,8 +1806,9 @@ EXPORT_SYMBOL(bio_endio_nodec); + * Allocates and returns a new bio which represents @sectors from the start of + * @bio, and updates @bio to represent the remaining sectors. + * +- * The newly allocated bio will point to @bio's bi_io_vec; it is the caller's +- * responsibility to ensure that @bio is not freed before the split. ++ * Unless this is a discard request the newly allocated bio will point ++ * to @bio's bi_io_vec; it is the caller's responsibility to ensure that ++ * @bio is not freed before the split. + */ + struct bio *bio_split(struct bio *bio, int sectors, + gfp_t gfp, struct bio_set *bs) +@@ -1817,7 +1818,15 @@ struct bio *bio_split(struct bio *bio, i + BUG_ON(sectors <= 0); + BUG_ON(sectors >= bio_sectors(bio)); + +- split = bio_clone_fast(bio, gfp, bs); ++ /* ++ * Discards need a mutable bio_vec to accommodate the payload ++ * required by the DSM TRIM and UNMAP commands. ++ */ ++ if (bio->bi_rw & REQ_DISCARD) ++ split = bio_clone_bioset(bio, gfp, bs); ++ else ++ split = bio_clone_fast(bio, gfp, bs); ++ + if (!split) + return NULL; + diff --git a/queue-3.14/series b/queue-3.14/series index e7e3ce4644e..53aa921fb73 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -107,3 +107,4 @@ clocksource-exynos_mct-avoid-blocking-calls-in-the-cpu-hotplug-notifier.patch ideapad-fix-software-rfkill-setting.patch dell-laptop-fix-allocating-freeing-smi-buffer-page.patch usb-usbfs-allow-urbs-to-be-reaped-after-disconnection.patch +block-do-a-full-clone-when-splitting-discard-bios.patch -- 2.47.3