blk-mq: new multi-queue block IO queueing mechanism
[linux-2.6-block.git] / block / blk-sysfs.c
index 3aa5b195f4dd45e7519e9053cf1593197efc86bd..4f8c4d90ec7350613d8de5a815326a337e875a6e 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/bio.h>
 #include <linux/blkdev.h>
 #include <linux/blktrace_api.h>
+#include <linux/blk-mq.h>
 
 #include "blk.h"
 #include "blk-cgroup.h"
@@ -542,6 +543,11 @@ static void blk_release_queue(struct kobject *kobj)
        if (q->queue_tags)
                __blk_queue_free_tags(q);
 
+       percpu_counter_destroy(&q->mq_usage_counter);
+
+       if (q->mq_ops)
+               blk_mq_free_queue(q);
+
        blk_trace_shutdown(q);
 
        bdi_destroy(&q->backing_dev_info);
@@ -575,6 +581,7 @@ int blk_register_queue(struct gendisk *disk)
         * bypass from queue allocation.
         */
        blk_queue_bypass_end(q);
+       queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q);
 
        ret = blk_trace_init_sysfs(dev);
        if (ret)
@@ -588,6 +595,9 @@ int blk_register_queue(struct gendisk *disk)
 
        kobject_uevent(&q->kobj, KOBJ_ADD);
 
+       if (q->mq_ops)
+               blk_mq_register_disk(disk);
+
        if (!q->request_fn)
                return 0;
 
@@ -610,6 +620,9 @@ void blk_unregister_queue(struct gendisk *disk)
        if (WARN_ON(!q))
                return;
 
+       if (q->mq_ops)
+               blk_mq_unregister_disk(disk);
+
        if (q->request_fn)
                elv_unregister_queue(q);