diff options
author | Mike Snitzer <snitzer@redhat.com> | 2020-09-14 12:02:23 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2020-09-29 16:33:01 -0400 |
commit | 882ec4e609c1a6de1836e765905f62de1502ae1e (patch) | |
tree | b9ab981dd874b0729f764d49f3db5537f8c86446 | |
parent | 1471308fb5ec4335f9ae9fc65f65048dbe7c336e (diff) | |
download | linux-stable-882ec4e609c1a6de1836e765905f62de1502ae1e.tar.gz linux-stable-882ec4e609c1a6de1836e765905f62de1502ae1e.tar.bz2 linux-stable-882ec4e609c1a6de1836e765905f62de1502ae1e.zip |
dm table: stack 'chunk_sectors' limit to account for target-specific splitting
If target set ti->max_io_len it must be used when stacking
DM device's queue_limits to establish a 'chunk_sectors' that is
compatible with the IO stack.
By using lcm_not_zero() care is taken to avoid blindly overriding the
chunk_sectors limit stacked up by blk_stack_limits().
Depends-on: 07d098e6bbad ("block: allow 'chunk_sectors' to be non-power-of-2")
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-table.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index c3be7cb2570c..704345e95cc1 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -18,6 +18,7 @@ #include <linux/mutex.h> #include <linux/delay.h> #include <linux/atomic.h> +#include <linux/lcm.h> #include <linux/blk-mq.h> #include <linux/mount.h> #include <linux/dax.h> @@ -1506,6 +1507,10 @@ int dm_calculate_queue_limits(struct dm_table *table, zone_sectors = ti_limits.chunk_sectors; } + /* Stack chunk_sectors if target-specific splitting is required */ + if (ti->max_io_len) + ti_limits.chunk_sectors = lcm_not_zero(ti->max_io_len, + ti_limits.chunk_sectors); /* Set I/O hints portion of queue limits */ if (ti->type->io_hints) ti->type->io_hints(ti, &ti_limits); |