block: move q_usage_counter release into blk_queue_release
authorMing Lei <ming.lei@redhat.com>
Tue, 8 Mar 2022 05:51:57 +0000 (06:51 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Mar 2022 02:40:01 +0000 (19:40 -0700)
After blk_cleanup_queue() returns, disk may not be released yet, so
probably bio may still be submitted and ->q_usage_counter may be
touched, so far this way seems safe, but not good from API's viewpoint.

Move the release q_usage_counter into blk_queue_release().

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220308055200.735835-12-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-core.c
block/blk-sysfs.c

index 3fa2f08d3750b375481b9a7e9889098cdf7f6b02..a97918d107a01fae5724f9a6edd561cbba1571e5 100644 (file)
@@ -342,8 +342,6 @@ void blk_cleanup_queue(struct request_queue *q)
                blk_mq_sched_free_rqs(q);
        mutex_unlock(&q->sysfs_lock);
 
-       percpu_ref_exit(&q->q_usage_counter);
-
        /* @q is and will stay empty, shutdown and put */
        blk_put_queue(q);
 }
index 220085109d7f0076a580ca125c46e606d6d91dd2..af5a6d86073f1e50f66ba74075f459953ba2dfdf 100644 (file)
@@ -780,6 +780,8 @@ static void blk_release_queue(struct kobject *kobj)
 
        might_sleep();
 
+       percpu_ref_exit(&q->q_usage_counter);
+
        if (q->poll_stat)
                blk_stat_remove_callback(q, q->poll_cb);
        blk_stat_free_callback(q->poll_cb);