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@lst.de> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Link: https://lore.kernel.org/r/20210602065345.355274-23-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
262d431f90
commit
195b1956b8
@ -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)
|
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);
|
blk_mq_free_tag_set(&rbd_dev->tag_set);
|
||||||
put_disk(rbd_dev->disk);
|
|
||||||
rbd_dev->disk = NULL;
|
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;
|
rbd_dev->layout.object_size * rbd_dev->layout.stripe_count;
|
||||||
int err;
|
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));
|
memset(&rbd_dev->tag_set, 0, sizeof(rbd_dev->tag_set));
|
||||||
rbd_dev->tag_set.ops = &rbd_mq_ops;
|
rbd_dev->tag_set.ops = &rbd_mq_ops;
|
||||||
rbd_dev->tag_set.queue_depth = rbd_dev->opts->queue_depth;
|
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);
|
err = blk_mq_alloc_tag_set(&rbd_dev->tag_set);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_disk;
|
return err;
|
||||||
|
|
||||||
q = blk_mq_init_queue(&rbd_dev->tag_set);
|
disk = blk_mq_alloc_disk(&rbd_dev->tag_set, rbd_dev);
|
||||||
if (IS_ERR(q)) {
|
if (IS_ERR(disk)) {
|
||||||
err = PTR_ERR(q);
|
err = PTR_ERR(disk);
|
||||||
goto out_tag_set;
|
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);
|
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
|
||||||
/* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */
|
/* 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))
|
if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC))
|
||||||
blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, q);
|
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;
|
rbd_dev->disk = disk;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_tag_set:
|
out_tag_set:
|
||||||
blk_mq_free_tag_set(&rbd_dev->tag_set);
|
blk_mq_free_tag_set(&rbd_dev->tag_set);
|
||||||
out_disk:
|
|
||||||
put_disk(disk);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7088,8 +7074,6 @@ static ssize_t do_rbd_add(struct bus_type *bus,
|
|||||||
goto err_out_image_lock;
|
goto err_out_image_lock;
|
||||||
|
|
||||||
device_add_disk(&rbd_dev->dev, rbd_dev->disk, NULL);
|
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);
|
spin_lock(&rbd_dev_list_lock);
|
||||||
list_add_tail(&rbd_dev->node, &rbd_dev_list);
|
list_add_tail(&rbd_dev->node, &rbd_dev_list);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user