Skip to content

Commit 77567b2

Browse files
Christoph Hellwigaxboe
authored andcommitted
ubi: 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 <[email protected]> Reviewed-by: Chaitanya Kulkarni <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 3b62c14 commit 77567b2

File tree

1 file changed

+29
-39
lines changed

1 file changed

+29
-39
lines changed

drivers/mtd/ubi/block.c

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -394,61 +394,54 @@ int ubiblock_create(struct ubi_volume_info *vi)
394394
dev->vol_id = vi->vol_id;
395395
dev->leb_size = vi->usable_leb_size;
396396

397+
dev->tag_set.ops = &ubiblock_mq_ops;
398+
dev->tag_set.queue_depth = 64;
399+
dev->tag_set.numa_node = NUMA_NO_NODE;
400+
dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
401+
dev->tag_set.cmd_size = sizeof(struct ubiblock_pdu);
402+
dev->tag_set.driver_data = dev;
403+
dev->tag_set.nr_hw_queues = 1;
404+
405+
ret = blk_mq_alloc_tag_set(&dev->tag_set);
406+
if (ret) {
407+
dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
408+
goto out_free_dev;;
409+
}
410+
411+
397412
/* Initialize the gendisk of this ubiblock device */
398-
gd = alloc_disk(1);
399-
if (!gd) {
400-
pr_err("UBI: block: alloc_disk failed\n");
401-
ret = -ENODEV;
402-
goto out_free_dev;
413+
gd = blk_mq_alloc_disk(&dev->tag_set, dev);
414+
if (IS_ERR(gd)) {
415+
ret = PTR_ERR(gd);
416+
goto out_free_tags;
403417
}
404418

405419
gd->fops = &ubiblock_ops;
406420
gd->major = ubiblock_major;
421+
gd->minors = 1;
407422
gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, 0, 0, GFP_KERNEL);
408423
if (gd->first_minor < 0) {
409424
dev_err(disk_to_dev(gd),
410425
"block: dynamic minor allocation failed");
411426
ret = -ENODEV;
412-
goto out_put_disk;
427+
goto out_cleanup_disk;
413428
}
414429
gd->private_data = dev;
415430
sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
416431
set_capacity(gd, disk_capacity);
417432
dev->gd = gd;
418433

419-
dev->tag_set.ops = &ubiblock_mq_ops;
420-
dev->tag_set.queue_depth = 64;
421-
dev->tag_set.numa_node = NUMA_NO_NODE;
422-
dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
423-
dev->tag_set.cmd_size = sizeof(struct ubiblock_pdu);
424-
dev->tag_set.driver_data = dev;
425-
dev->tag_set.nr_hw_queues = 1;
426-
427-
ret = blk_mq_alloc_tag_set(&dev->tag_set);
428-
if (ret) {
429-
dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
430-
goto out_remove_minor;
431-
}
432-
433-
dev->rq = blk_mq_init_queue(&dev->tag_set);
434-
if (IS_ERR(dev->rq)) {
435-
dev_err(disk_to_dev(gd), "blk_mq_init_queue failed");
436-
ret = PTR_ERR(dev->rq);
437-
goto out_free_tags;
438-
}
434+
dev->rq = gd->queue;
439435
blk_queue_max_segments(dev->rq, UBI_MAX_SG_COUNT);
440436

441-
dev->rq->queuedata = dev;
442-
dev->gd->queue = dev->rq;
443-
444437
/*
445438
* Create one workqueue per volume (per registered block device).
446439
* Rembember workqueues are cheap, they're not threads.
447440
*/
448441
dev->wq = alloc_workqueue("%s", 0, 0, gd->disk_name);
449442
if (!dev->wq) {
450443
ret = -ENOMEM;
451-
goto out_free_queue;
444+
goto out_remove_minor;
452445
}
453446

454447
list_add_tail(&dev->list, &ubiblock_devices);
@@ -460,14 +453,12 @@ int ubiblock_create(struct ubi_volume_info *vi)
460453
mutex_unlock(&devices_mutex);
461454
return 0;
462455

463-
out_free_queue:
464-
blk_cleanup_queue(dev->rq);
465-
out_free_tags:
466-
blk_mq_free_tag_set(&dev->tag_set);
467456
out_remove_minor:
468457
idr_remove(&ubiblock_minor_idr, gd->first_minor);
469-
out_put_disk:
470-
put_disk(dev->gd);
458+
out_cleanup_disk:
459+
blk_cleanup_disk(dev->gd);
460+
out_free_tags:
461+
blk_mq_free_tag_set(&dev->tag_set);
471462
out_free_dev:
472463
kfree(dev);
473464
out_unlock:
@@ -483,11 +474,10 @@ static void ubiblock_cleanup(struct ubiblock *dev)
483474
/* Flush pending work */
484475
destroy_workqueue(dev->wq);
485476
/* Finally destroy the blk queue */
486-
blk_cleanup_queue(dev->rq);
487-
blk_mq_free_tag_set(&dev->tag_set);
488477
dev_info(disk_to_dev(dev->gd), "released");
478+
blk_cleanup_disk(dev->gd);
479+
blk_mq_free_tag_set(&dev->tag_set);
489480
idr_remove(&ubiblock_minor_idr, dev->gd->first_minor);
490-
put_disk(dev->gd);
491481
}
492482

493483
int ubiblock_remove(struct ubi_volume_info *vi)

0 commit comments

Comments
 (0)