diff options
author | Ming Lei <tom.leiming@gmail.com> | 2013-12-26 08:31:37 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-12 04:22:42 -0500 |
commit | 518d00b7498c5894be94545848d55e5b9c55749e (patch) | |
tree | 841f92409aca75ab2eadea1955d96c33b107395a | |
parent | 228fdc083b017eaf90e578fa86fb1ecfd5ffae87 (diff) |
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: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/block/null_blk.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c index a2e69d26266d..83a598ebb65a 100644 --- a/drivers/block/null_blk.c +++ b/drivers/block/null_blk.c | |||
@@ -425,10 +425,7 @@ static void null_del_dev(struct nullb *nullb) | |||
425 | list_del_init(&nullb->list); | 425 | list_del_init(&nullb->list); |
426 | 426 | ||
427 | del_gendisk(nullb->disk); | 427 | del_gendisk(nullb->disk); |
428 | if (queue_mode == NULL_Q_MQ) | 428 | blk_cleanup_queue(nullb->q); |
429 | blk_mq_free_queue(nullb->q); | ||
430 | else | ||
431 | blk_cleanup_queue(nullb->q); | ||
432 | put_disk(nullb->disk); | 429 | put_disk(nullb->disk); |
433 | kfree(nullb); | 430 | kfree(nullb); |
434 | } | 431 | } |
@@ -578,10 +575,7 @@ static int null_add_dev(void) | |||
578 | disk = nullb->disk = alloc_disk_node(1, home_node); | 575 | disk = nullb->disk = alloc_disk_node(1, home_node); |
579 | if (!disk) { | 576 | if (!disk) { |
580 | queue_fail: | 577 | queue_fail: |
581 | if (queue_mode == NULL_Q_MQ) | 578 | blk_cleanup_queue(nullb->q); |
582 | blk_mq_free_queue(nullb->q); | ||
583 | else | ||
584 | blk_cleanup_queue(nullb->q); | ||
585 | cleanup_queues(nullb); | 579 | cleanup_queues(nullb); |
586 | err: | 580 | err: |
587 | kfree(nullb); | 581 | kfree(nullb); |