block: Improve blk_revalidate_disk_zones() checks
authorDamien Le Moal <damien.lemoal@wdc.com>
Wed, 11 Nov 2020 07:36:06 +0000 (16:36 +0900)
committerJens Axboe <axboe@kernel.dk>
Tue, 8 Dec 2020 00:34:21 +0000 (17:34 -0700)
Improves the checks on the zones of a zoned block device done in
blk_revalidate_disk_zones() by making sure that the device report_zones
method did report at least one zone and that the zones reported exactly
cover the entire disk capacity, that is, that there are no missing zones
at the end of the disk sector range.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-zoned.c

index 6817a673e5cec03da10d96500cc12ceb68a44b6e..7a68b6e4300cec97b2624d861b7d7cf97a2f1bb6 100644 (file)
@@ -508,15 +508,29 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
        noio_flag = memalloc_noio_save();
        ret = disk->fops->report_zones(disk, 0, UINT_MAX,
                                       blk_revalidate_zone_cb, &args);
+       if (!ret) {
+               pr_warn("%s: No zones reported\n", disk->disk_name);
+               ret = -ENODEV;
+       }
        memalloc_noio_restore(noio_flag);
 
+       /*
+        * If zones where reported, make sure that the entire disk capacity
+        * has been checked.
+        */
+       if (ret > 0 && args.sector != get_capacity(disk)) {
+               pr_warn("%s: Missing zones from sector %llu\n",
+                       disk->disk_name, args.sector);
+               ret = -ENODEV;
+       }
+
        /*
         * Install the new bitmaps and update nr_zones only once the queue is
         * stopped and all I/Os are completed (i.e. a scheduler is not
         * referencing the bitmaps).
         */
        blk_mq_freeze_queue(q);
-       if (ret >= 0) {
+       if (ret > 0) {
                blk_queue_chunk_sectors(q, args.zone_sectors);
                q->nr_zones = args.nr_zones;
                swap(q->seq_zones_wlock, args.seq_zones_wlock);