lkml.org 
[lkml]   [2023]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -next] block: fix blktrace debugfs entries leak
    Date
    From: Yu Kuai <yukuai3@huawei.com>

    Commit 99d055b4fd4b ("block: remove per-disk debugfs files in
    blk_unregister_queue") moves blk_trace_shutdown() from
    blk_release_queue() to blk_unregister_queue(), this is safe if blktrace
    is created through sysfs, however, there are some regression in corner
    cases:

    1) for scsi, passthrough io can still be issued after del_gendisk, and
    blktrace debugfs entries will be removed immediately after
    del_gendisk(), therefor passthrough io can't be tracked and blktrace
    will complain:

    failed read of /sys/kernel/debug/block/sdb/trace0: 5/Input/output error

    2) blktrace can still be enabled after del_gendisk() through ioctl if the
    disk is opened before del_gendisk(), and if blktrace is not shutdown
    through ioctl before closing the disk, debugfs entries will be
    leaked.

    It seems 1) is not important, while 2) needs to be fixed apparently.

    Fix this problem by shutdown blktrace in blk_free_queue(),
    disk_release() is not used because scsi sg support blktrace without
    gendisk, and this is safe because queue is not freed yet, and
    blk_trace_shutdown() is reentrant.

    Fixes: 99d055b4fd4b ("block: remove per-disk debugfs files in blk_unregister_queue")
    Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    ---
    block/blk-core.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/block/blk-core.c b/block/blk-core.c
    index 00c74330fa92..a0c949533a5d 100644
    --- a/block/blk-core.c
    +++ b/block/blk-core.c
    @@ -263,6 +263,10 @@ static void blk_free_queue_rcu(struct rcu_head *rcu_head)

    static void blk_free_queue(struct request_queue *q)
    {
    + mutex_lock(&q->debugfs_mutex);
    + blk_trace_shutdown(q);
    + mutex_unlock(&q->debugfs_mutex);
    +
    blk_free_queue_stats(q->stats);
    if (queue_is_mq(q))
    blk_mq_release(q);
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-05-11 09:01    [W:2.602 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site