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>
This commit is contained in:
parent
228fdc083b
commit
518d00b749
|
@ -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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue