dm zoned: check superblock location
authorHannes Reinecke <hare@suse.de>
Tue, 2 Jun 2020 11:09:56 +0000 (13:09 +0200)
committerMike Snitzer <snitzer@redhat.com>
Fri, 5 Jun 2020 18:59:54 +0000 (14:59 -0400)
When specifying several devices the superblock location must be
checked to ensure the devices are specified in the correct order.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-zoned-metadata.c

index 59a34895f5a8e46777b271f98302234e14e98143..314ce31a2c437190941281123d0b9984da4e130e 100644 (file)
@@ -997,7 +997,7 @@ static int dmz_check_sb(struct dmz_metadata *zmd, struct dmz_sb *dsb,
        struct dmz_dev *dev = dsb->dev;
        unsigned int nr_meta_zones, nr_data_zones;
        u32 crc, stored_crc;
-       u64 gen;
+       u64 gen, sb_block;
 
        if (le32_to_cpu(sb->magic) != DMZ_MAGIC) {
                dmz_dev_err(dev, "Invalid meta magic (needed 0x%08x, got 0x%08x)",
@@ -1026,6 +1026,14 @@ static int dmz_check_sb(struct dmz_metadata *zmd, struct dmz_sb *dsb,
                return -ENXIO;
        }
 
+       sb_block = le64_to_cpu(sb->sb_block);
+       if (sb_block != (u64)dsb->zone->id << zmd->zone_nr_blocks_shift ) {
+               dmz_dev_err(dev, "Invalid superblock position "
+                           "(is %llu expected %llu)",
+                           sb_block,
+                           (u64)dsb->zone->id << zmd->zone_nr_blocks_shift);
+               return -EINVAL;
+       }
        if (zmd->sb_version > 1) {
                uuid_t sb_uuid;