md->disk->private_data = NULL;
                spin_unlock(&_minor_lock);
                del_gendisk(md->disk);
-               put_disk(md->disk);
        }
 
-       if (md->queue) {
+       if (md->queue)
                dm_queue_destroy_keyslot_manager(md->queue);
-               blk_cleanup_queue(md->queue);
-       }
+
+       if (md->disk)
+               blk_cleanup_disk(md->disk);
 
        cleanup_srcu_struct(&md->io_barrier);
 
         * established. If request-based table is loaded: blk-mq will
         * override accordingly.
         */
-       md->queue = blk_alloc_queue(numa_node_id);
-       if (!md->queue)
-               goto bad;
-
-       md->disk = alloc_disk_node(1, md->numa_node_id);
+       md->disk = blk_alloc_disk(md->numa_node_id);
        if (!md->disk)
                goto bad;
+       md->queue = md->disk->queue;
 
        init_waitqueue_head(&md->wait);
        INIT_WORK(&md->work, dm_wq_work);
 
        md->disk->major = _major;
        md->disk->first_minor = minor;
+       md->disk->minors = 1;
        md->disk->fops = &dm_blk_dops;
        md->disk->queue = md->queue;
        md->disk->private_data = md;