[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 22/30] rbd: use blk_mq_alloc_disk and blk_cleanup_disk



Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and
request_queue allocation.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
---
 drivers/block/rbd.c | 52 ++++++++++++++++-----------------------------
 1 file changed, 18 insertions(+), 34 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index bbb88eb009e0..531d390902dd 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4750,9 +4750,8 @@ static blk_status_t rbd_queue_rq(struct blk_mq_hw_ctx 
*hctx,
 
 static void rbd_free_disk(struct rbd_device *rbd_dev)
 {
-       blk_cleanup_queue(rbd_dev->disk->queue);
+       blk_cleanup_disk(rbd_dev->disk);
        blk_mq_free_tag_set(&rbd_dev->tag_set);
-       put_disk(rbd_dev->disk);
        rbd_dev->disk = NULL;
 }
 
@@ -4922,22 +4921,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
            rbd_dev->layout.object_size * rbd_dev->layout.stripe_count;
        int err;
 
-       /* create gendisk info */
-       disk = alloc_disk(single_major ?
-                         (1 << RBD_SINGLE_MAJOR_PART_SHIFT) :
-                         RBD_MINORS_PER_MAJOR);
-       if (!disk)
-               return -ENOMEM;
-
-       snprintf(disk->disk_name, sizeof(disk->disk_name), RBD_DRV_NAME "%d",
-                rbd_dev->dev_id);
-       disk->major = rbd_dev->major;
-       disk->first_minor = rbd_dev->minor;
-       if (single_major)
-               disk->flags |= GENHD_FL_EXT_DEVT;
-       disk->fops = &rbd_bd_ops;
-       disk->private_data = rbd_dev;
-
        memset(&rbd_dev->tag_set, 0, sizeof(rbd_dev->tag_set));
        rbd_dev->tag_set.ops = &rbd_mq_ops;
        rbd_dev->tag_set.queue_depth = rbd_dev->opts->queue_depth;
@@ -4948,13 +4931,26 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
 
        err = blk_mq_alloc_tag_set(&rbd_dev->tag_set);
        if (err)
-               goto out_disk;
+               return err;
 
-       q = blk_mq_init_queue(&rbd_dev->tag_set);
-       if (IS_ERR(q)) {
-               err = PTR_ERR(q);
+       disk = blk_mq_alloc_disk(&rbd_dev->tag_set, rbd_dev);
+       if (IS_ERR(disk)) {
+               err = PTR_ERR(disk);
                goto out_tag_set;
        }
+       q = disk->queue;
+
+       snprintf(disk->disk_name, sizeof(disk->disk_name), RBD_DRV_NAME "%d",
+                rbd_dev->dev_id);
+       disk->major = rbd_dev->major;
+       disk->first_minor = rbd_dev->minor;
+       if (single_major) {
+               disk->minors = (1 << RBD_SINGLE_MAJOR_PART_SHIFT);
+               disk->flags |= GENHD_FL_EXT_DEVT;
+       } else {
+               disk->minors = RBD_MINORS_PER_MAJOR;
+       }
+       disk->fops = &rbd_bd_ops;
 
        blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
        /* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */
@@ -4976,21 +4972,11 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
        if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC))
                blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, q);
 
-       /*
-        * disk_release() expects a queue ref from add_disk() and will
-        * put it.  Hold an extra ref until add_disk() is called.
-        */
-       WARN_ON(!blk_get_queue(q));
-       disk->queue = q;
-       q->queuedata = rbd_dev;
-
        rbd_dev->disk = disk;
 
        return 0;
 out_tag_set:
        blk_mq_free_tag_set(&rbd_dev->tag_set);
-out_disk:
-       put_disk(disk);
        return err;
 }
 
@@ -7088,8 +7074,6 @@ static ssize_t do_rbd_add(struct bus_type *bus,
                goto err_out_image_lock;
 
        device_add_disk(&rbd_dev->dev, rbd_dev->disk, NULL);
-       /* see rbd_init_disk() */
-       blk_put_queue(rbd_dev->disk->queue);
 
        spin_lock(&rbd_dev_list_lock);
        list_add_tail(&rbd_dev->node, &rbd_dev_list);
-- 
2.30.2




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.