]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dm-integrity: fix mismatched queue limits
authorKeith Busch <kbusch@kernel.org>
Wed, 25 Mar 2026 19:36:06 +0000 (12:36 -0700)
committerMikulas Patocka <mpatocka@redhat.com>
Fri, 27 Mar 2026 21:18:56 +0000 (22:18 +0100)
A user can integritysetup a device with a backing device using a 4k
logical block size, but request the dm device use 1k or 2k. This
mismatch creates an inconsistency such that the dm device would report
limits for IO that it can't actually execute. Fix this by using the
backing device's limits if they are larger.

Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
drivers/md/dm-integrity.c

index 06e805902151c831b7bf12c2a7342ef778a7c53f..8dfd498ed1ffd6ed4725c32d1bb1f8ef0517f909 100644 (file)
@@ -4047,9 +4047,15 @@ static void dm_integrity_io_hints(struct dm_target *ti, struct queue_limits *lim
        struct dm_integrity_c *ic = ti->private;
 
        if (ic->sectors_per_block > 1) {
-               limits->logical_block_size = ic->sectors_per_block << SECTOR_SHIFT;
-               limits->physical_block_size = ic->sectors_per_block << SECTOR_SHIFT;
-               limits->io_min = ic->sectors_per_block << SECTOR_SHIFT;
+               limits->logical_block_size =
+                               max(limits->logical_block_size,
+                                   ic->sectors_per_block << SECTOR_SHIFT);
+               limits->physical_block_size =
+                               max(limits->physical_block_size,
+                                   ic->sectors_per_block << SECTOR_SHIFT);
+               limits->io_min =
+                               max(limits->io_min,
+                                   ic->sectors_per_block << SECTOR_SHIFT);
                limits->dma_alignment = limits->logical_block_size - 1;
                limits->discard_granularity = ic->sectors_per_block << SECTOR_SHIFT;
        }