]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dm-integrity: fix a bug if the bio is out of limits
authorMikulas Patocka <mpatocka@redhat.com>
Thu, 9 Jul 2026 19:25:39 +0000 (21:25 +0200)
committerMikulas Patocka <mpatocka@redhat.com>
Fri, 10 Jul 2026 12:39:47 +0000 (14:39 +0200)
If dm_integrity_check_limits fails, the code would exit with
DM_MAPIO_KILL. However, the range would be already locked at this point,
and it wouldn't be unlocked, resulting in a deadlock. Let's move the
limit check up, so that when it exits, no resources are leaked.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Assisted-by: Claude:claude-opus-4.6
Fixes: fb0987682c62 ("dm-integrity: introduce the Inline mode")
Cc: stable@vger.kernel.org
drivers/md/dm-integrity.c

index f5508b1bca11d35926946417e0cd6cd6b32e898d..1f2593f113f642bb08b164db06a3a6c96191754e 100644 (file)
@@ -2520,6 +2520,9 @@ static int dm_integrity_map_inline(struct dm_integrity_io *dio, bool from_map)
        if (unlikely((bio->bi_opf & REQ_PREFLUSH) != 0))
                return DM_MAPIO_REMAPPED;
 
+       if (unlikely(!dm_integrity_check_limits(ic, bio->bi_iter.bi_sector, bio)))
+               return DM_MAPIO_KILL;
+
 retry:
        if (!dio->integrity_payload) {
                unsigned digest_size, extra_size;
@@ -2584,10 +2587,6 @@ skip_spinlock:
 
        dio->bio_details.bi_iter = bio->bi_iter;
 
-       if (unlikely(!dm_integrity_check_limits(ic, bio->bi_iter.bi_sector, bio))) {
-               return DM_MAPIO_KILL;
-       }
-
        bio->bi_iter.bi_sector += ic->start + SB_SECTORS;
 
        bip = bio_integrity_alloc(bio, GFP_NOIO, 1);