From: Keith Busch <[email protected]>

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 <[email protected]>
---
 drivers/md/dm-integrity.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 06e805902151c..8dfd498ed1ffd 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -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;
        }
-- 
2.52.0


Reply via email to