lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 169/207] block: call blk_mq_exit_queue from disk_release for never added disks
    Date
    From: Christoph Hellwig <hch@lst.de>

    commit c5db2cfc6274692d821d33b59acb6ff615e350c1 upstream.

    To undo the all initialization from blk_mq_init_allocated_queue in case
    of a probe failure where add_disk is never called we have to call
    blk_mq_exit_queue from put_disk.

    This relies on the fact that drivers always call blk_mq_free_tag_set
    after calling put_disk in the probe error path if they have a gendisk
    at all.

    We should be doing this in general, but can't do it for the normal
    teardown case (yet) as the tagset can be gone by the time the disk is
    released once it was added. I hope to sort this out properly eventually
    but for now this isolated hack will do it.

    Fixes: 6f8191fdf41d ("block: simplify disk shutdown")
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20220720130541.1323531-2-hch@lst.de
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    block/genhd.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    --- a/block/genhd.c
    +++ b/block/genhd.c
    @@ -1158,6 +1158,18 @@ static void disk_release(struct device *
    might_sleep();
    WARN_ON_ONCE(disk_live(disk));

    + /*
    + * To undo the all initialization from blk_mq_init_allocated_queue in
    + * case of a probe failure where add_disk is never called we have to
    + * call blk_mq_exit_queue here. We can't do this for the more common
    + * teardown case (yet) as the tagset can be gone by the time the disk
    + * is released once it was added.
    + */
    + if (queue_is_mq(disk->queue) &&
    + test_bit(GD_OWNS_QUEUE, &disk->state) &&
    + !test_bit(GD_ADDED, &disk->state))
    + blk_mq_exit_queue(disk->queue);
    +
    blkcg_exit_queue(disk->queue);

    disk_release_events(disk);
    @@ -1422,6 +1434,9 @@ EXPORT_SYMBOL(__blk_alloc_disk);
    * This decrements the refcount for the struct gendisk. When this reaches 0
    * we'll have disk_release() called.
    *
    + * Note: for blk-mq disk put_disk must be called before freeing the tag_set
    + * when handling probe errors (that is before add_disk() is called).
    + *
    * Context: Any context, but the last reference must not be dropped from
    * atomic context.
    */

    \
     
     \ /
      Last update: 2022-09-26 14:02    [W:4.151 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site