Commit f610937214e2ac8c4225df9a124ea0de1f030626
1 parent
0cc67cd9c5
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
dm cache: fix stacking of geometry limits
Do not blindly override the queue limits (specifically io_min and io_opt). Allow traditional stacking of these limits if io_opt is a factor of the cache's data block size. Without this patch mkfs.xfs does not recognize the cache device's provided limits as a useful geometry (e.g. raid) so these hints are ignored. This was due to setting io_min to a useless value. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com> Acked-by: Joe Thornber <ejt@redhat.com>
Showing 1 changed file with 10 additions and 2 deletions Side-by-side Diff
drivers/md/dm-cache-target.c
... | ... | @@ -2612,9 +2612,17 @@ |
2612 | 2612 | static void cache_io_hints(struct dm_target *ti, struct queue_limits *limits) |
2613 | 2613 | { |
2614 | 2614 | struct cache *cache = ti->private; |
2615 | + uint64_t io_opt_sectors = limits->io_opt >> SECTOR_SHIFT; | |
2615 | 2616 | |
2616 | - blk_limits_io_min(limits, 0); | |
2617 | - blk_limits_io_opt(limits, cache->sectors_per_block << SECTOR_SHIFT); | |
2617 | + /* | |
2618 | + * If the system-determined stacked limits are compatible with the | |
2619 | + * cache's blocksize (io_opt is a factor) do not override them. | |
2620 | + */ | |
2621 | + if (io_opt_sectors < cache->sectors_per_block || | |
2622 | + do_div(io_opt_sectors, cache->sectors_per_block)) { | |
2623 | + blk_limits_io_min(limits, 0); | |
2624 | + blk_limits_io_opt(limits, cache->sectors_per_block << SECTOR_SHIFT); | |
2625 | + } | |
2618 | 2626 | set_discard_limits(cache, limits); |
2619 | 2627 | } |
2620 | 2628 |