| From 8a861e30cc0cbde16b352e13337b2d81e19189db Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Jun 2021 09:45:16 -0400 |
| Subject: fs: dlm: fix memory leak when fenced |
| |
| From: Alexander Aring <aahringo@redhat.com> |
| |
| [ Upstream commit 700ab1c363c7b54c9ea3222379b33fc00ab02f7b ] |
| |
| I got some kmemleak report when a node was fenced. The user space tool |
| dlm_controld will therefore run some rmdir() in dlm configfs which was |
| triggering some memleaks. This patch stores the sps and cms attributes |
| which stores some handling for subdirectories of the configfs cluster |
| entry and free them if they get released as the parent directory gets |
| freed. |
| |
| unreferenced object 0xffff88810d9e3e00 (size 192): |
| comm "dlm_controld", pid 342, jiffies 4294698126 (age 55438.801s) |
| hex dump (first 32 bytes): |
| 00 00 00 00 00 00 00 00 73 70 61 63 65 73 00 00 ........spaces.. |
| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ |
| backtrace: |
| [<00000000db8b640b>] make_cluster+0x5d/0x360 |
| [<000000006a571db4>] configfs_mkdir+0x274/0x730 |
| [<00000000b094501c>] vfs_mkdir+0x27e/0x340 |
| [<0000000058b0adaf>] do_mkdirat+0xff/0x1b0 |
| [<00000000d1ffd156>] do_syscall_64+0x40/0x80 |
| [<00000000ab1408c8>] entry_SYSCALL_64_after_hwframe+0x44/0xae |
| unreferenced object 0xffff88810d9e3a00 (size 192): |
| comm "dlm_controld", pid 342, jiffies 4294698126 (age 55438.801s) |
| hex dump (first 32 bytes): |
| 00 00 00 00 00 00 00 00 63 6f 6d 6d 73 00 00 00 ........comms... |
| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ |
| backtrace: |
| [<00000000a7ef6ad2>] make_cluster+0x82/0x360 |
| [<000000006a571db4>] configfs_mkdir+0x274/0x730 |
| [<00000000b094501c>] vfs_mkdir+0x27e/0x340 |
| [<0000000058b0adaf>] do_mkdirat+0xff/0x1b0 |
| [<00000000d1ffd156>] do_syscall_64+0x40/0x80 |
| [<00000000ab1408c8>] entry_SYSCALL_64_after_hwframe+0x44/0xae |
| |
| 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 | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| diff --git a/fs/dlm/config.c b/fs/dlm/config.c |
| index 73e6643903af..18a8ffcea0aa 100644 |
| --- a/fs/dlm/config.c |
| +++ b/fs/dlm/config.c |
| @@ -79,6 +79,9 @@ struct dlm_cluster { |
| unsigned int cl_new_rsb_count; |
| unsigned int cl_recover_callbacks; |
| char cl_cluster_name[DLM_LOCKSPACE_LEN]; |
| + |
| + struct dlm_spaces *sps; |
| + struct dlm_comms *cms; |
| }; |
| |
| static struct dlm_cluster *config_item_to_cluster(struct config_item *i) |
| @@ -379,6 +382,9 @@ static struct config_group *make_cluster(struct config_group *g, |
| if (!cl || !sps || !cms) |
| goto fail; |
| |
| + cl->sps = sps; |
| + cl->cms = cms; |
| + |
| config_group_init_type_name(&cl->group, name, &cluster_type); |
| config_group_init_type_name(&sps->ss_group, "spaces", &spaces_type); |
| config_group_init_type_name(&cms->cs_group, "comms", &comms_type); |
| @@ -428,6 +434,9 @@ static void drop_cluster(struct config_group *g, struct config_item *i) |
| static void release_cluster(struct config_item *i) |
| { |
| struct dlm_cluster *cl = config_item_to_cluster(i); |
| + |
| + kfree(cl->sps); |
| + kfree(cl->cms); |
| kfree(cl); |
| } |
| |
| -- |
| 2.30.2 |
| |