lkml.org 
[lkml]   [2020]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 19/56] fs: dlm: fix configfs memory leak
    Date
    From: Alexander Aring <aahringo@redhat.com>

    [ Upstream commit 3d2825c8c6105b0f36f3ff72760799fa2e71420e ]

    This patch fixes the following memory detected by kmemleak and umount
    gfs2 filesystem which removed the last lockspace:

    unreferenced object 0xffff9264f482f600 (size 192):
    comm "dlm_controld", pid 325, jiffies 4294690276 (age 48.136s)
    hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 6e 6f 64 65 73 00 00 00 ........nodes...
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    backtrace:
    [<00000000060481d7>] make_space+0x41/0x130
    [<000000008d905d46>] configfs_mkdir+0x1a2/0x5f0
    [<00000000729502cf>] vfs_mkdir+0x155/0x210
    [<000000000369bcf1>] do_mkdirat+0x6d/0x110
    [<00000000cc478a33>] do_syscall_64+0x33/0x40
    [<00000000ce9ccf01>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    The patch just remembers the "nodes" entry pointer in space as I think
    it's created as subdirectory when parent "spaces" is created. In
    function drop_space() we will lost the pointer reference to nds because
    configfs_remove_default_groups(). However as this subdirectory is always
    available when "spaces" exists it will just be freed when "spaces" will be
    freed.

    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: David Teigland <teigland@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/dlm/config.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/fs/dlm/config.c b/fs/dlm/config.c
    index 1270551d24e38..f13d865244501 100644
    --- a/fs/dlm/config.c
    +++ b/fs/dlm/config.c
    @@ -218,6 +218,7 @@ struct dlm_space {
    struct list_head members;
    struct mutex members_lock;
    int members_count;
    + struct dlm_nodes *nds;
    };

    struct dlm_comms {
    @@ -426,6 +427,7 @@ static struct config_group *make_space(struct config_group *g, const char *name)
    INIT_LIST_HEAD(&sp->members);
    mutex_init(&sp->members_lock);
    sp->members_count = 0;
    + sp->nds = nds;
    return &sp->group;

    fail:
    @@ -447,6 +449,7 @@ static void drop_space(struct config_group *g, struct config_item *i)
    static void release_space(struct config_item *i)
    {
    struct dlm_space *sp = config_item_to_space(i);
    + kfree(sp->nds);
    kfree(sp);
    }

    --
    2.25.1
    \
     
     \ /
      Last update: 2020-10-18 21:39    [W:4.393 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site