if (!uninit_q)
                return ERR_PTR(-ENOMEM);
 
-       q = blk_mq_init_allocated_queue(set, uninit_q);
+       /*
+        * Initialize the queue without an elevator. device_add_disk() will do
+        * the initialization.
+        */
+       q = blk_mq_init_allocated_queue(set, uninit_q, false);
        if (IS_ERR(q))
                blk_cleanup_queue(uninit_q);
 
 }
 
 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
-                                                 struct request_queue *q)
+                                                 struct request_queue *q,
+                                                 bool elevator_init)
 {
        /* mark the queue as mq asap */
        q->mq_ops = set->ops;
        blk_mq_add_queue_tag_set(set, q);
        blk_mq_map_swqueue(q);
 
-       elevator_init_mq(q);
+       if (elevator_init)
+               elevator_init_mq(q);
 
        return q;
 
 
        if (!e)
                return;
 
+       blk_mq_freeze_queue(q);
+       blk_mq_quiesce_queue(q);
+
        err = blk_mq_init_sched(q, e);
+
+       blk_mq_unquiesce_queue(q);
+       blk_mq_unfreeze_queue(q);
+
        if (err) {
                pr_warn("\"%s\" elevator initialization failed, "
                        "falling back to \"none\"\n", e->elevator_name);
 
        dev_t devt;
        int retval;
 
+       /*
+        * The disk queue should now be all set with enough information about
+        * the device for the elevator code to pick an adequate default
+        * elevator if one is needed, that is, for devices requesting queue
+        * registration.
+        */
+       if (register_queue)
+               elevator_init_mq(disk->queue);
+
        /* minors == 0 indicates to use ext devt from part0 and should
         * be accompanied with EXT_DEVT flag.  Make sure all
         * parameters make sense.
 
        if (err)
                goto out_kfree_tag_set;
 
-       q = blk_mq_init_allocated_queue(md->tag_set, md->queue);
+       q = blk_mq_init_allocated_queue(md->tag_set, md->queue, true);
        if (IS_ERR(q)) {
                err = PTR_ERR(q);
                goto out_tag_set;
 
 
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
-                                                 struct request_queue *q);
+                                                 struct request_queue *q,
+                                                 bool elevator_init);
 struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
                                                const struct blk_mq_ops *ops,
                                                unsigned int queue_depth,