dm zoned: Fix metadata zone size check
authorShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Thu, 18 Jun 2020 02:48:10 +0000 (11:48 +0900)
committerMike Snitzer <snitzer@redhat.com>
Fri, 19 Jun 2020 16:21:57 +0000 (12:21 -0400)
When dm zoned has multiple devices, metadata is on the cache device, not
in random zones of the zoned devices. Then the number of metadata zones
shall be checked with the number of cache zones, not random zones.

Fixes: 34f5affd04c4 ("dm zoned: separate random and cache zones")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-zoned-metadata.c

index 130b5a6d9f126cbcd582f5527690b7c251aa62fb..fc1329ca3e70e2fa317f58b4d90693bb97310c31 100644 (file)
@@ -1078,7 +1078,8 @@ static int dmz_check_sb(struct dmz_metadata *zmd, struct dmz_sb *dsb,
        nr_meta_zones = (le32_to_cpu(sb->nr_meta_blocks) + zmd->zone_nr_blocks - 1)
                >> zmd->zone_nr_blocks_shift;
        if (!nr_meta_zones ||
-           nr_meta_zones >= zmd->nr_rnd_zones) {
+           (zmd->nr_devs <= 1 && nr_meta_zones >= zmd->nr_rnd_zones) ||
+           (zmd->nr_devs > 1 && nr_meta_zones >= zmd->nr_cache_zones)) {
                dmz_dev_err(dev, "Invalid number of metadata blocks");
                return -ENXIO;
        }