Commit 5ca7546fe317 ("block: move rq_qos_exit() into disk_release()") moves rq_qos_exit() to disk_release(), but only done for blk-mq queue. However, now rq qos can be created via blkcg_init_queue() for bio based queue, so we need to call rq_qos_exit() for bio queue too. In theory, so far, rq_qos is only implemented for request based queue, and we should only add it for blk-mq queue. However, if using blk-mq during allocating queue may not be known, fix the rq qos leak issue by always releasing rq qos for both two kinds of queues. Reported-by: Yi Zhang <yi.zhang@xxxxxxxxxx> Tested-by: Yi Zhang <yi.zhang@xxxxxxxxxx> Fixes: 285d5731a0cb ('Revert "block: release rq qos structures for queue without disk"') Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> --- block/genhd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 556d6e4b38d9..6e7ca8c302aa 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1120,9 +1120,10 @@ static const struct attribute_group *disk_attr_groups[] = { NULL }; -static void disk_release_mq(struct request_queue *q) +static void disk_release_queue(struct request_queue *q) { - blk_mq_cancel_work_sync(q); + if (queue_is_mq(q)) + blk_mq_cancel_work_sync(q); /* * There can't be any non non-passthrough bios in flight here, but @@ -1166,8 +1167,7 @@ static void disk_release(struct device *dev) might_sleep(); WARN_ON_ONCE(disk_live(disk)); - if (queue_is_mq(disk->queue)) - disk_release_mq(disk->queue); + disk_release_queue(disk->queue); blkcg_exit_queue(disk->queue); -- 2.31.1