Commit 518d00b7 authored by Ming Lei's avatar Ming Lei Committed by Linus Torvalds

block: null_blk: fix queue leak inside removing device

When queue_mode is NULL_Q_MQ and null_blk is being removed,
blk_cleanup_queue() isn't called to cleanup queue, so the queue
allocated won't be freed.

This patch calls blk_cleanup_queue() for MQ to drain all pending
requests first and release the reference counter of queue kobject, then
blk_mq_free_queue() will be called in queue kobject's release handler
when queue kobject's reference counter drops to zero.
Signed-off-by: default avatarMing Lei <tom.leiming@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 228fdc08
...@@ -425,10 +425,7 @@ static void null_del_dev(struct nullb *nullb) ...@@ -425,10 +425,7 @@ static void null_del_dev(struct nullb *nullb)
list_del_init(&nullb->list); list_del_init(&nullb->list);
del_gendisk(nullb->disk); del_gendisk(nullb->disk);
if (queue_mode == NULL_Q_MQ) blk_cleanup_queue(nullb->q);
blk_mq_free_queue(nullb->q);
else
blk_cleanup_queue(nullb->q);
put_disk(nullb->disk); put_disk(nullb->disk);
kfree(nullb); kfree(nullb);
} }
...@@ -578,10 +575,7 @@ static int null_add_dev(void) ...@@ -578,10 +575,7 @@ static int null_add_dev(void)
disk = nullb->disk = alloc_disk_node(1, home_node); disk = nullb->disk = alloc_disk_node(1, home_node);
if (!disk) { if (!disk) {
queue_fail: queue_fail:
if (queue_mode == NULL_Q_MQ) blk_cleanup_queue(nullb->q);
blk_mq_free_queue(nullb->q);
else
blk_cleanup_queue(nullb->q);
cleanup_queues(nullb); cleanup_queues(nullb);
err: err:
kfree(nullb); kfree(nullb);
......
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