Commit 6ebf3b6c authored by Keith Busch's avatar Keith Busch Committed by Mikulas Patocka
Browse files

dm-integrity: fix mismatched queue limits



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: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
parent 5387815a
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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;
	}