FAILED: patch "[PATCH] dm-integrity: don't modify bio's immutable bio_vec in" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-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-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x b86f4b790c998afdbc88fe1aa55cfe89c4068726
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023123001-profusely-reassign-059b@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
b86f4b790c99 ("dm-integrity: don't modify bio's immutable bio_vec in integrity_metadata()") 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")86e4d3e8d183 ("dm-crypt: provide dma_alignment limit in io_hints")c3adefb5baf3 ("Merge tag 'for-6.0/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b86f4b790c998afdbc88fe1aa55cfe89c4068726 Mon Sep 17 00:00:00 2001
From: Mikulas Patocka <[email protected]>
Date: Tue, 5 Dec 2023 16:39:16 +0100
Subject: [PATCH] dm-integrity: don't modify bio's immutable bio_vec in
integrity_metadata()
__bio_for_each_segment assumes that the first struct bio_vec argument doesn't change - it calls "bio_advance_iter_single((bio), &(iter), (bvl).bv_len)" to advance the iterator. Unfortunately, the dm-integrity code changes the bio_vec with "bv.bv_len -= pos". When this code path is taken, the iterator would be out of sync and dm-integrity would report errors. This happens if the machine is out of memory and "kmalloc" fails.
Fix this bug by making a copy of "bv" and changing the copy instead.
drivers/md/dm-integrity.c +6 -5
@@ -1755,11 +1755,12 @@ static void integrity_metadata(struct work_struct *w) sectors_to_process = dio->range.n_sectors;__bio_for_each_segment (bv, bio, iter, dio->bio_details.bi_iter) { +struct bio_vec bv_copy = bv;unsigned int pos;char *mem, *checksums_ptr; again: - mem =bvec_kmap_local (&bv); + mem =bvec_kmap_local (&bv_copy); pos =0 ; checksums_ptr = checksums; do {
@@ -1768,7 +1769,7 @@ static void integrity_metadata(struct work_struct *w) sectors_to_process -= ic->sectors_per_block; pos += ic->sectors_per_block <<SECTOR_SHIFT ; sector += ic->sectors_per_block; - }while (pos < bv.bv_len && sectors_to_process && checksums != checksums_onstack); + }while (pos < bv_copy.bv_len && sectors_to_process && checksums != checksums_onstack);kunmap_local (mem); r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset,
@@ -1793,9 +1794,9 @@ static void integrity_metadata(struct work_struct *w)if (!sectors_to_process)break ; -if (unlikely (pos < bv.bv_len)) { - bv.bv_offset += pos; - bv.bv_len -= pos; +if (unlikely (pos < bv_copy.bv_len)) { + bv_copy.bv_offset += pos; + bv_copy.bv_len -= pos; goto again; } }
Mikulas Patocka
maintainerQuoted 5 lines · On Sat, 30 Dec 2023, [email protected] wrote:
The patch below does not apply to the 5.15-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]>.
Hi
Here I'm sending backport of the patch b86f4b790c998afdbc88fe1aa55cfe89c4068726 for the stable branches 4.19 to 5.15.
commit b86f4b790c998afdbc88fe1aa55cfe89c4068726
Author: Mikulas Patocka <[email protected]> Date: Tue Dec 5 16:39:16 2023 +0100
dm-integrity: don't modify bio's immutable bio_vec in integrity_metadata()
__bio_for_each_segment assumes that the first struct bio_vec argument doesn't change - it calls "bio_advance_iter_single((bio), &(iter), (bvl).bv_len)" to advance the iterator. Unfortunately, the dm-integrity code changes the bio_vec with "bv.bv_len -= pos". When this code path is taken, the iterator would be out of sync and dm-integrity would report errors. This happens if the machine is out of memory and "kmalloc" fails.
Fix this bug by making a copy of "bv" and changing the copy instead.
--- drivers/md/dm-integrity.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/md/dm-integrity.c +6 -5
@@ -1762,11 +1762,12 @@ static void integrity_metadata(struct wo sectors_to_process = dio->range.n_sectors;__bio_for_each_segment (bv, bio, iter, dio->bio_details.bi_iter) { +struct bio_vec bv_copy = bv;unsigned pos;char *mem, *checksums_ptr; again: - mem = (char *)kmap_atomic (bv.bv_page) + bv.bv_offset; + mem = (char *)kmap_atomic (bv_copy.bv_page) + bv_copy.bv_offset; pos =0 ; checksums_ptr = checksums; do {
@@ -1775,7 +1776,7 @@ again: sectors_to_process -= ic->sectors_per_block; pos += ic->sectors_per_block <<SECTOR_SHIFT ; sector += ic->sectors_per_block; - }while (pos < bv.bv_len && sectors_to_process && checksums != checksums_onstack); + }while (pos < bv_copy.bv_len && sectors_to_process && checksums != checksums_onstack);kunmap_atomic (mem); r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset,
@@ -1796,9 +1797,9 @@ again:if (!sectors_to_process)break ; -if (unlikely (pos < bv.bv_len)) { - bv.bv_offset += pos; - bv.bv_len -= pos; +if (unlikely (pos < bv_copy.bv_len)) { + bv_copy.bv_offset += pos; + bv_copy.bv_len -= pos; goto again; } }