forked from Minki/linux
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)
|
||||
{
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user