max_io_len always passed in an explicit, non-zero chunk_sectors into blk_max_size_offset. That means much of blk_max_size_offset is not needed and open coding it simplifies the code. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- drivers/md/dm.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index a011d09cb0fac..825ed9d84c9c0 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -944,24 +944,18 @@ static inline sector_t max_io_len_target_boundary(struct dm_target *ti, static sector_t max_io_len(struct dm_target *ti, sector_t sector) { sector_t target_offset = dm_target_offset(ti, sector); - sector_t len = max_io_len_target_boundary(ti, target_offset); - sector_t max_len; + unsigned int len = max_io_len_target_boundary(ti, target_offset); /* * Does the target need to split IO even further? * - varied (per target) IO splitting is a tenet of DM; this * explains why stacked chunk_sectors based splitting via - * blk_max_size_offset() isn't possible here. So pass in - * ti->max_io_len to override stacked chunk_sectors. + * blk_queue_split() isn't possible here. */ - if (ti->max_io_len) { - max_len = blk_max_size_offset(ti->table->md->queue, - target_offset, ti->max_io_len); - if (len > max_len) - len = max_len; - } - - return len; + if (!ti->max_io_len) + return len; + return min3(len, ti->table->md->queue->limits.max_sectors, + blk_chunk_sectors_left(target_offset, ti->max_io_len)); } int dm_set_target_max_io_len(struct dm_target *ti, sector_t len) -- 2.30.2