PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
                goto fail_stats;
 
-       if (blkcg_init_queue(q))
-               goto fail_ref;
-
        blk_queue_dma_alignment(q, 511);
        blk_set_default_limits(&q->limits);
        q->nr_requests = BLKDEV_DEFAULT_RQ;
 
        return q;
 
-fail_ref:
-       percpu_ref_exit(&q->q_usage_counter);
 fail_stats:
        blk_free_queue_stats(q->stats);
 fail_split:
 
                ioc_clear_queue(q);
                elevator_exit(q);
        }
-
-       /*
-        * Remove all references to @q from the block cgroup controller before
-        * restoring @q->queue_lock to avoid that restoring this pointer causes
-        * e.g. blkcg_print_blkgs() to crash.
-        */
-       blkcg_exit_queue(q);
 }
 
 /**
 
 #include "blk.h"
 #include "blk-mq-sched.h"
 #include "blk-rq-qos.h"
+#include "blk-cgroup.h"
 
 static struct kobject *block_depr;
 
 
        blk_mq_cancel_work_sync(disk->queue);
 
+       blkcg_exit_queue(disk->queue);
+
        disk_release_events(disk);
        kfree(disk->random);
        xa_destroy(&disk->part_tbl);
+
        disk->queue->disk = NULL;
        blk_put_queue(disk->queue);
 
        if (xa_insert(&disk->part_tbl, 0, disk->part0, GFP_KERNEL))
                goto out_destroy_part_tbl;
 
+       if (blkcg_init_queue(q))
+               goto out_erase_part0;
+
        rand_initialize_disk(disk);
        disk_to_dev(disk)->class = &block_class;
        disk_to_dev(disk)->type = &disk_type;
 #endif
        return disk;
 
+out_erase_part0:
+       xa_erase(&disk->part_tbl, 0);
 out_destroy_part_tbl:
        xa_destroy(&disk->part_tbl);
        disk->part0->bd_disk = NULL;