Block: fix unbalanced bypass-disable in blk_register_queue
authorAlan Stern <[email protected]>
Tue, 9 Sep 2014 15:50:58 +0000 (11:50 -0400)
committerJens Axboe <[email protected]>
Tue, 9 Sep 2014 16:44:24 +0000 (10:44 -0600)
When a queue is registered, the block layer turns off the bypass
setting (because bypass is enabled when the queue is created).  This
doesn't work well for queues that are unregistered and then registered
again; we get a WARNING because of the unbalanced calls to
blk_queue_bypass_end().

This patch fixes the problem by making blk_register_queue() call
blk_queue_bypass_end() only the first time the queue is registered.

Signed-off-by: Alan Stern <[email protected]>
Acked-by: Tejun Heo <[email protected]>
CC: James Bottomley <[email protected]>
CC: Jens Axboe <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
block/blk-sysfs.c

index 4db5abf96b9ec1595a822efebfb9df9776af6477..17f5c84ce7bfb588a5a34bc244a7ac38067b4391 100644 (file)
@@ -554,8 +554,10 @@ int blk_register_queue(struct gendisk *disk)
         * Initialization must be complete by now.  Finish the initial
         * bypass from queue allocation.
         */
-       queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q);
-       blk_queue_bypass_end(q);
+       if (!blk_queue_init_done(q)) {
+               queue_flag_set_unlocked(QUEUE_FLAG_INIT_DONE, q);
+               blk_queue_bypass_end(q);
+       }
 
        ret = blk_trace_init_sysfs(dev);
        if (ret)