On Wed, Mar 25, 2026 at 12:36:06PM -0700, Keith Busch wrote:
> 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;

Shouldn't this also respect the underlying device's discard_granularity?

-Ben

>       }
> -- 
> 2.52.0
> 


Reply via email to