FAILED: patch "[PATCH] dm: fix improper splitting for abnormal bios" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-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 <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x f7b58a69fad9d2c4c90cab0247811155dd0d48e7
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023040334-attire-drone-2c8b@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
f7b58a69fad9 ("dm: fix improper splitting for abnormal bios")86a3238c7b9b ("dm: change "unsigned" to "unsigned int"")7533afa1d27b ("dm: send just one event on resize, not two")5cd6d1d53a1f ("dm integrity: Remove bi_sector that's only used by commented debug code") 22c40e134c4c ("dm cache: Add some documentation to dm-cache-background-tracker.h")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f7b58a69fad9d2c4c90cab0247811155dd0d48e7 Mon Sep 17 00:00:00 2001
From: Mike Snitzer <[email protected]>
Date: Thu, 30 Mar 2023 14:56:38 -0400
Subject: [PATCH] dm: fix improper splitting for abnormal bios
"Abnormal" bios include discards, write zeroes and secure erase. By no longer passing the calculated 'len' pointer, commit 7dd06a2548b2 ("dm:
allow dm_accept_partial_bio() for dm_io without duplicate bios") took a senseless approach to disallowing dm_accept_partial_bio() from working for duplicate bios processed using __send_duplicate_bios().
It inadvertently and incorrectly stopped the use of 'len' when initializing a target's io (in alloc_tio). As such the resulting tio could address more area of a device than it should.
For example, when discarding an entire DM striped device with the following DM table:
vg-lvol0: 0 159744 striped 2 128 7:0 2048 7:1 2048
vg-lvol0: 159744 45056 striped 2 128 7:2 2048 7:3 2048
Before this fix:
device-mapper: striped: target_stripe=0, bdev=7:0, start=2048 len=102400
blkdiscard: attempt to access beyond end of device
loop0: rw=2051, sector=2048, nr_sectors = 102400 limit=81920
device-mapper: striped: target_stripe=1, bdev=7:1, start=2048 len=102400
blkdiscard: attempt to access beyond end of device
loop1: rw=2051, sector=2048, nr_sectors = 102400 limit=81920
After this fix;
device-mapper: striped: target_stripe=0, bdev=7:0, start=2048 len=79872
device-mapper: striped: target_stripe=1, bdev=7:1, start=2048 len=79872
drivers/md/dm.c +4 -3
@@ -1467,7 +1467,8 @@ static void setup_split_accounting(struct clone_info *ci, unsigned int len) }static void alloc_multiple_bios (struct bio_list *blist,struct clone_info *ci, -struct dm_target *ti,unsigned int num_bios) +struct dm_target *ti,unsigned int num_bios, +unsigned *len) {struct bio *bio;int try;
@@ -1478,7 +1479,7 @@ static void alloc_multiple_bios(struct bio_list *blist, struct clone_info *ci,if (try)mutex_lock (&ci->io->md->table_devices_lock);for (bio_nr =0 ; bio_nr < num_bios; bio_nr++) { - bio =alloc_tio (ci, ti, bio_nr,NULL , + bio =alloc_tio (ci, ti, bio_nr, len, try ?GFP_NOIO :GFP_NOWAIT );if (!bio)break ;
@@ -1514,7 +1515,7 @@ static int __send_duplicate_bios(struct clone_info *ci, struct dm_target *ti,break ;default :/* dm_accept_partial_bio() is not supported with shared tio->len_ptr */ -alloc_multiple_bios (&blist, ci, ti, num_bios); +alloc_multiple_bios (&blist, ci, ti, num_bios, len);while ((clone =bio_list_pop (&blist))) {dm_tio_set_flag (clone_to_tio (clone),DM_TIO_IS_DUPLICATE_BIO );__map_bio (clone);
Mike Snitzer
maintainerPATCH 1/1 dm: fix improper splitting for abnormal bios
From: Benjamin Marzinski <[email protected]>
Conflicts: Code changes due to missing upstream commit 86a3238c7b9b
('dm: change "unsigned" to "unsigned int"')
commit f7b58a69fad9d2c4c90cab0247811155dd0d48e7
Author: Mike Snitzer <[email protected]> Date: Thu Mar 30 14:56:38 2023 -0400
dm: fix improper splitting for abnormal bios
"Abnormal" bios include discards, write zeroes and secure erase. By no longer passing the calculated 'len' pointer, commit 7dd06a2548b2 ("dm:
allow dm_accept_partial_bio() for dm_io without duplicate bios") took a senseless approach to disallowing dm_accept_partial_bio() from working for duplicate bios processed using __send_duplicate_bios().
It inadvertently and incorrectly stopped the use of 'len' when initializing a target's io (in alloc_tio). As such the resulting tio could address more area of a device than it should.
For example, when discarding an entire DM striped device with the following DM table:
vg-lvol0: 0 159744 striped 2 128 7:0 2048 7:1 2048
vg-lvol0: 159744 45056 striped 2 128 7:2 2048 7:3 2048
Before this fix:
device-mapper: striped: target_stripe=0, bdev=7:0, start=2048 len=102400
blkdiscard: attempt to access beyond end of device
loop0: rw=2051, sector=2048, nr_sectors = 102400 limit=81920
device-mapper: striped: target_stripe=1, bdev=7:1, start=2048 len=102400
blkdiscard: attempt to access beyond end of device
loop1: rw=2051, sector=2048, nr_sectors = 102400 limit=81920
After this fix;
device-mapper: striped: target_stripe=0, bdev=7:0, start=2048 len=79872
device-mapper: striped: target_stripe=1, bdev=7:1, start=2048 len=79872
--- drivers/md/dm.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/md/dm.c +4 -3
@@ -1460,7 +1460,8 @@ static void setup_split_accounting(struct clone_info *ci, unsigned len) }static void alloc_multiple_bios (struct bio_list *blist,struct clone_info *ci, -struct dm_target *ti,unsigned num_bios) +struct dm_target *ti,unsigned num_bios, +unsigned *len) {struct bio *bio;int try;
@@ -1471,7 +1472,7 @@ static void alloc_multiple_bios(struct bio_list *blist, struct clone_info *ci,if (try)mutex_lock (&ci->io->md->table_devices_lock);for (bio_nr =0 ; bio_nr < num_bios; bio_nr++) { - bio =alloc_tio (ci, ti, bio_nr,NULL , + bio =alloc_tio (ci, ti, bio_nr, len, try ?GFP_NOIO :GFP_NOWAIT );if (!bio)break ;
@@ -1507,7 +1508,7 @@ static int __send_duplicate_bios(struct clone_info *ci, struct dm_target *ti,break ;default :/* dm_accept_partial_bio() is not supported with shared tio->len_ptr */ -alloc_multiple_bios (&blist, ci, ti, num_bios); +alloc_multiple_bios (&blist, ci, ti, num_bios, len);while ((clone =bio_list_pop (&blist))) {dm_tio_set_flag (clone_to_tio (clone),DM_TIO_IS_DUPLICATE_BIO );__map_bio (clone);
Signature · 1 line
2.30.0