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;
 }
 
            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;
 
        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 */
        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;
 }
 
                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);