diff options
author | Christoph Hellwig <hch@lst.de> | 2014-05-26 05:45:02 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-05-26 19:21:51 -0400 |
commit | 19c5d84f14d2b01fe4c24e1444142f69e6dc08f6 (patch) | |
tree | f69523d38d3d2c7dc9942291f2e06a72577b8c8a /block | |
parent | c22d9d8a60646a1521ae12a2176f58da19afa186 (diff) |
blk-mq: idle all hardware contexts before freeing a queue
Without this we can leak the active_queues reference if a command is
freed while it is considered active.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 9bc075335d06..62082c5daae7 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -1844,6 +1844,7 @@ void blk_mq_free_queue(struct request_queue *q) | |||
1844 | blk_mq_del_queue_tag_set(q); | 1844 | blk_mq_del_queue_tag_set(q); |
1845 | 1845 | ||
1846 | queue_for_each_hw_ctx(q, hctx, i) { | 1846 | queue_for_each_hw_ctx(q, hctx, i) { |
1847 | blk_mq_tag_idle(hctx); | ||
1847 | kfree(hctx->ctxs); | 1848 | kfree(hctx->ctxs); |
1848 | blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier); | 1849 | blk_mq_unregister_cpu_notifier(&hctx->cpu_notifier); |
1849 | if (q->mq_ops->exit_hctx) | 1850 | if (q->mq_ops->exit_hctx) |