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

[PATCH 09/30] mtd_blkdevs: use blk_mq_alloc_disk



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

Signed-off-by: Christoph Hellwig <hch@xxxxxx>
---
 drivers/mtd/mtd_blkdevs.c | 48 ++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index fb8e12d590a1..5dc4c966ea73 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -30,11 +30,9 @@ static void blktrans_dev_release(struct kref *kref)
        struct mtd_blktrans_dev *dev =
                container_of(kref, struct mtd_blktrans_dev, ref);
 
-       dev->disk->private_data = NULL;
-       blk_cleanup_queue(dev->rq);
+       blk_cleanup_disk(dev->disk);
        blk_mq_free_tag_set(dev->tag_set);
        kfree(dev->tag_set);
-       put_disk(dev->disk);
        list_del(&dev->list);
        kfree(dev);
 }
@@ -354,7 +352,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        if (new->devnum > (MINORMASK >> tr->part_bits) ||
            (tr->part_bits && new->devnum >= 27 * 26)) {
                mutex_unlock(&blktrans_ref_mutex);
-               goto error1;
+               return ret;
        }
 
        list_add_tail(&new->list, &tr->devs);
@@ -366,17 +364,28 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        if (!tr->writesect)
                new->readonly = 1;
 
-       /* Create gendisk */
        ret = -ENOMEM;
-       gd = alloc_disk(1 << tr->part_bits);
+       new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
+       if (!new->tag_set)
+               goto out_list_del;
 
-       if (!gd)
-               goto error2;
+       ret = blk_mq_alloc_sq_tag_set(new->tag_set, &mtd_mq_ops, 2,
+                       BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
+       if (ret)
+               goto out_kfree_tag_set;
+
+       /* Create gendisk */
+       gd = blk_mq_alloc_disk(new->tag_set, new);
+       if (IS_ERR(gd)) {
+               ret = PTR_ERR(gd);
+               goto out_free_tag_set;
+       }
 
        new->disk = gd;
        gd->private_data = new;
        gd->major = tr->major;
        gd->first_minor = (new->devnum) << tr->part_bits;
+       gd->minors = 1 << tr->part_bits;
        gd->fops = &mtd_block_ops;
 
        if (tr->part_bits)
@@ -398,22 +407,9 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        spin_lock_init(&new->queue_lock);
        INIT_LIST_HEAD(&new->rq_list);
 
-       new->tag_set = kzalloc(sizeof(*new->tag_set), GFP_KERNEL);
-       if (!new->tag_set)
-               goto error3;
-
-       new->rq = blk_mq_init_sq_queue(new->tag_set, &mtd_mq_ops, 2,
-                               BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
-       if (IS_ERR(new->rq)) {
-               ret = PTR_ERR(new->rq);
-               new->rq = NULL;
-               goto error4;
-       }
-
        if (tr->flush)
                blk_queue_write_cache(new->rq, true, false);
 
-       new->rq->queuedata = new;
        blk_queue_logical_block_size(new->rq, tr->blksize);
 
        blk_queue_flag_set(QUEUE_FLAG_NONROT, new->rq);
@@ -437,13 +433,13 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
                WARN_ON(ret);
        }
        return 0;
-error4:
+
+out_free_tag_set:
+       blk_mq_free_tag_set(new->tag_set);
+out_kfree_tag_set:
        kfree(new->tag_set);
-error3:
-       put_disk(new->disk);
-error2:
+out_list_del:
        list_del(&new->list);
-error1:
        return ret;
 }
 
-- 
2.30.2




 


Rackspace

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