@@ -394,61 +394,54 @@ int ubiblock_create(struct ubi_volume_info *vi)
394
394
dev -> vol_id = vi -> vol_id ;
395
395
dev -> leb_size = vi -> usable_leb_size ;
396
396
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
+
397
412
/* 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 ;
403
417
}
404
418
405
419
gd -> fops = & ubiblock_ops ;
406
420
gd -> major = ubiblock_major ;
421
+ gd -> minors = 1 ;
407
422
gd -> first_minor = idr_alloc (& ubiblock_minor_idr , dev , 0 , 0 , GFP_KERNEL );
408
423
if (gd -> first_minor < 0 ) {
409
424
dev_err (disk_to_dev (gd ),
410
425
"block: dynamic minor allocation failed" );
411
426
ret = - ENODEV ;
412
- goto out_put_disk ;
427
+ goto out_cleanup_disk ;
413
428
}
414
429
gd -> private_data = dev ;
415
430
sprintf (gd -> disk_name , "ubiblock%d_%d" , dev -> ubi_num , dev -> vol_id );
416
431
set_capacity (gd , disk_capacity );
417
432
dev -> gd = gd ;
418
433
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 ;
439
435
blk_queue_max_segments (dev -> rq , UBI_MAX_SG_COUNT );
440
436
441
- dev -> rq -> queuedata = dev ;
442
- dev -> gd -> queue = dev -> rq ;
443
-
444
437
/*
445
438
* Create one workqueue per volume (per registered block device).
446
439
* Rembember workqueues are cheap, they're not threads.
447
440
*/
448
441
dev -> wq = alloc_workqueue ("%s" , 0 , 0 , gd -> disk_name );
449
442
if (!dev -> wq ) {
450
443
ret = - ENOMEM ;
451
- goto out_free_queue ;
444
+ goto out_remove_minor ;
452
445
}
453
446
454
447
list_add_tail (& dev -> list , & ubiblock_devices );
@@ -460,14 +453,12 @@ int ubiblock_create(struct ubi_volume_info *vi)
460
453
mutex_unlock (& devices_mutex );
461
454
return 0 ;
462
455
463
- out_free_queue :
464
- blk_cleanup_queue (dev -> rq );
465
- out_free_tags :
466
- blk_mq_free_tag_set (& dev -> tag_set );
467
456
out_remove_minor :
468
457
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 );
471
462
out_free_dev :
472
463
kfree (dev );
473
464
out_unlock :
@@ -483,11 +474,10 @@ static void ubiblock_cleanup(struct ubiblock *dev)
483
474
/* Flush pending work */
484
475
destroy_workqueue (dev -> wq );
485
476
/* Finally destroy the blk queue */
486
- blk_cleanup_queue (dev -> rq );
487
- blk_mq_free_tag_set (& dev -> tag_set );
488
477
dev_info (disk_to_dev (dev -> gd ), "released" );
478
+ blk_cleanup_disk (dev -> gd );
479
+ blk_mq_free_tag_set (& dev -> tag_set );
489
480
idr_remove (& ubiblock_minor_idr , dev -> gd -> first_minor );
490
- put_disk (dev -> gd );
491
481
}
492
482
493
483
int ubiblock_remove (struct ubi_volume_info * vi )
0 commit comments