block: replace seq_zones_bitmap with conv_zones_bitmap
authorChristoph Hellwig <hch@lst.de>
Tue, 3 Dec 2019 09:39:05 +0000 (10:39 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 3 Dec 2019 15:51:25 +0000 (08:51 -0700)
Invert the meaning of seq_zones_bitmap by keeping a bitmap of
conventional zones.  This allows not having a bitmap for devices
that do not have conventional zones.

Reviewed-by: Javier González <javier@javigon.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-zoned.c
include/linux/blkdev.h

index 65a9bdc9fe2772b22cbbef583b09f43e18f2c62f..9c3931051f4f4da57cf2a41f92060a398aa3fdfb 100644 (file)
@@ -332,15 +332,15 @@ static inline unsigned long *blk_alloc_zone_bitmap(int node,
 
 void blk_queue_free_zone_bitmaps(struct request_queue *q)
 {
-       kfree(q->seq_zones_bitmap);
-       q->seq_zones_bitmap = NULL;
+       kfree(q->conv_zones_bitmap);
+       q->conv_zones_bitmap = NULL;
        kfree(q->seq_zones_wlock);
        q->seq_zones_wlock = NULL;
 }
 
 struct blk_revalidate_zone_args {
        struct gendisk  *disk;
-       unsigned long   *seq_zones_bitmap;
+       unsigned long   *conv_zones_bitmap;
        unsigned long   *seq_zones_wlock;
        sector_t        sector;
 };
@@ -394,8 +394,8 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
                return -ENODEV;
        }
 
-       if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL)
-               set_bit(idx, args->seq_zones_bitmap);
+       if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
+               set_bit(idx, args->conv_zones_bitmap);
 
        args->sector += zone->len;
        return 0;
@@ -415,8 +415,8 @@ static int blk_update_zone_info(struct gendisk *disk, unsigned int nr_zones,
        args->seq_zones_wlock = blk_alloc_zone_bitmap(q->node, nr_zones);
        if (!args->seq_zones_wlock)
                return -ENOMEM;
-       args->seq_zones_bitmap = blk_alloc_zone_bitmap(q->node, nr_zones);
-       if (!args->seq_zones_bitmap)
+       args->conv_zones_bitmap = blk_alloc_zone_bitmap(q->node, nr_zones);
+       if (!args->conv_zones_bitmap)
                return -ENOMEM;
 
        ret = disk->fops->report_zones(disk, 0, nr_zones,
@@ -465,7 +465,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk)
        if (ret >= 0) {
                q->nr_zones = nr_zones;
                swap(q->seq_zones_wlock, args.seq_zones_wlock);
-               swap(q->seq_zones_bitmap, args.seq_zones_bitmap);
+               swap(q->conv_zones_bitmap, args.conv_zones_bitmap);
                ret = 0;
        } else {
                pr_warn("%s: failed to revalidate zones\n", disk->disk_name);
@@ -474,7 +474,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk)
        blk_mq_unfreeze_queue(q);
 
        kfree(args.seq_zones_wlock);
-       kfree(args.seq_zones_bitmap);
+       kfree(args.conv_zones_bitmap);
        return ret;
 }
 EXPORT_SYMBOL_GPL(blk_revalidate_disk_zones);
index c5852de402b634e67ff9d4ee74526ea3cc1aec6d..503c4d4c58840065176ddd40745ce17b57c28a95 100644 (file)
@@ -503,9 +503,9 @@ struct request_queue {
        /*
         * Zoned block device information for request dispatch control.
         * nr_zones is the total number of zones of the device. This is always
-        * 0 for regular block devices. seq_zones_bitmap is a bitmap of nr_zones
-        * bits which indicates if a zone is conventional (bit clear) or
-        * sequential (bit set). seq_zones_wlock is a bitmap of nr_zones
+        * 0 for regular block devices. conv_zones_bitmap is a bitmap of nr_zones
+        * bits which indicates if a zone is conventional (bit set) or
+        * sequential (bit clear). seq_zones_wlock is a bitmap of nr_zones
         * bits which indicates if a zone is write locked, that is, if a write
         * request targeting the zone was dispatched. All three fields are
         * initialized by the low level device driver (e.g. scsi/sd.c).
@@ -518,7 +518,7 @@ struct request_queue {
         * blk_mq_unfreeze_queue().
         */
        unsigned int            nr_zones;
-       unsigned long           *seq_zones_bitmap;
+       unsigned long           *conv_zones_bitmap;
        unsigned long           *seq_zones_wlock;
 #endif /* CONFIG_BLK_DEV_ZONED */
 
@@ -723,9 +723,11 @@ static inline unsigned int blk_queue_zone_no(struct request_queue *q,
 static inline bool blk_queue_zone_is_seq(struct request_queue *q,
                                         sector_t sector)
 {
-       if (!blk_queue_is_zoned(q) || !q->seq_zones_bitmap)
+       if (!blk_queue_is_zoned(q))
                return false;
-       return test_bit(blk_queue_zone_no(q, sector), q->seq_zones_bitmap);
+       if (!q->conv_zones_bitmap)
+               return true;
+       return !test_bit(blk_queue_zone_no(q, sector), q->conv_zones_bitmap);
 }
 #else /* CONFIG_BLK_DEV_ZONED */
 static inline unsigned int blk_queue_nr_zones(struct request_queue *q)