null_blk: convert to blk_alloc_disk/blk_cleanup_disk
authorChristoph Hellwig <hch@lst.de>
Fri, 21 May 2021 05:51:15 +0000 (07:51 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 1 Jun 2021 13:42:24 +0000 (07:42 -0600)
Convert the null_blk driver to use the blk_alloc_disk and blk_cleanup_disk
helpers to simplify gendisk and request_queue allocation.  Note that the
blk-mq mode is left with its own allocations scheme, to be handled later.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Link: https://lore.kernel.org/r/20210521055116.1053587-26-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/null_blk/main.c

index 5f006d9e14729301d282732b4b192a205f05272b..d8e098f1e5b543d3b30593922562ce17a998bfa5 100644 (file)
@@ -1597,11 +1597,10 @@ static void null_del_dev(struct nullb *nullb)
                null_restart_queue_async(nullb);
        }
 
-       blk_cleanup_queue(nullb->q);
+       blk_cleanup_disk(nullb->disk);
        if (dev->queue_mode == NULL_Q_MQ &&
            nullb->tag_set == &nullb->__tag_set)
                blk_mq_free_tag_set(nullb->tag_set);
-       put_disk(nullb->disk);
        cleanup_queues(nullb);
        if (null_cache_active(nullb))
                null_free_device_storage(nullb->dev, true);
@@ -1700,22 +1699,19 @@ static int init_driver_queues(struct nullb *nullb)
 static int null_gendisk_register(struct nullb *nullb)
 {
        sector_t size = ((sector_t)nullb->dev->size * SZ_1M) >> SECTOR_SHIFT;
-       struct gendisk *disk;
+       struct gendisk *disk = nullb->disk;
 
-       disk = nullb->disk = alloc_disk_node(1, nullb->dev->home_node);
-       if (!disk)
-               return -ENOMEM;
        set_capacity(disk, size);
 
        disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
        disk->major             = null_major;
        disk->first_minor       = nullb->index;
+       disk->minors            = 1;
        if (queue_is_mq(nullb->q))
                disk->fops              = &null_rq_ops;
        else
                disk->fops              = &null_bio_ops;
        disk->private_data      = nullb;
-       disk->queue             = nullb->q;
        strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
 
        if (nullb->dev->zoned) {
@@ -1851,23 +1847,27 @@ static int null_add_dev(struct nullb_device *dev)
                        goto out_cleanup_queues;
 
                if (!null_setup_fault())
-                       goto out_cleanup_queues;
+                       goto out_cleanup_tags;
 
+               rv = -ENOMEM;
                nullb->tag_set->timeout = 5 * HZ;
                nullb->q = blk_mq_init_queue_data(nullb->tag_set, nullb);
-               if (IS_ERR(nullb->q)) {
-                       rv = -ENOMEM;
+               if (IS_ERR(nullb->q))
                        goto out_cleanup_tags;
-               }
+               nullb->disk = alloc_disk_node(1, nullb->dev->home_node);
+               if (!nullb->disk)
+                       goto out_cleanup_disk;
+               nullb->disk->queue = nullb->q;
        } else if (dev->queue_mode == NULL_Q_BIO) {
-               nullb->q = blk_alloc_queue(dev->home_node);
-               if (!nullb->q) {
-                       rv = -ENOMEM;
+               rv = -ENOMEM;
+               nullb->disk = blk_alloc_disk(nullb->dev->home_node);
+               if (!nullb->disk)
                        goto out_cleanup_queues;
-               }
+
+               nullb->q = nullb->disk->queue;
                rv = init_driver_queues(nullb);
                if (rv)
-                       goto out_cleanup_blk_queue;
+                       goto out_cleanup_disk;
        }
 
        if (dev->mbps) {
@@ -1883,7 +1883,7 @@ static int null_add_dev(struct nullb_device *dev)
        if (dev->zoned) {
                rv = null_init_zoned_dev(dev, nullb->q);
                if (rv)
-                       goto out_cleanup_blk_queue;
+                       goto out_cleanup_disk;
        }
 
        nullb->q->queuedata = nullb;
@@ -1921,8 +1921,8 @@ static int null_add_dev(struct nullb_device *dev)
        return 0;
 out_cleanup_zone:
        null_free_zoned_dev(dev);
-out_cleanup_blk_queue:
-       blk_cleanup_queue(nullb->q);
+out_cleanup_disk:
+       blk_cleanup_disk(nullb->disk);
 out_cleanup_tags:
        if (dev->queue_mode == NULL_Q_MQ && nullb->tag_set == &nullb->__tag_set)
                blk_mq_free_tag_set(nullb->tag_set);