Commit f610937214e2ac8c4225df9a124ea0de1f030626

Authored by Mike Snitzer
1 parent 0cc67cd9c5

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