Commit 34d9715a authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe

block: wake up all tasks blocked in get_request()

Once blk_set_queue_dying() is done in blk_cleanup_queue(), we call
blk_freeze_queue() and wait for q->q_usage_counter becoming zero. But
if there are tasks blocked in get_request(), q->q_usage_counter can
never become zero. So we have to wake up all these tasks in
blk_set_queue_dying() first.

Fixes: 3ef28e83 ("block: generic request_queue reference counting")
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 4358a844
...@@ -637,8 +637,8 @@ void blk_set_queue_dying(struct request_queue *q) ...@@ -637,8 +637,8 @@ void blk_set_queue_dying(struct request_queue *q)
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
blk_queue_for_each_rl(rl, q) { blk_queue_for_each_rl(rl, q) {
if (rl->rq_pool) { if (rl->rq_pool) {
wake_up(&rl->wait[BLK_RW_SYNC]); wake_up_all(&rl->wait[BLK_RW_SYNC]);
wake_up(&rl->wait[BLK_RW_ASYNC]); wake_up_all(&rl->wait[BLK_RW_ASYNC]);
} }
} }
spin_unlock_irq(q->queue_lock); spin_unlock_irq(q->queue_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment