forked from luck/tmp_suning_uos_patched
fs: dlm: fix memory leak when fenced
[ 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>
This commit is contained in:
parent
eda609d864
commit
2ebbe3a620
|
@ -79,6 +79,9 @@ struct dlm_cluster {
|
||||||
unsigned int cl_new_rsb_count;
|
unsigned int cl_new_rsb_count;
|
||||||
unsigned int cl_recover_callbacks;
|
unsigned int cl_recover_callbacks;
|
||||||
char cl_cluster_name[DLM_LOCKSPACE_LEN];
|
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)
|
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)
|
if (!cl || !sps || !cms)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
cl->sps = sps;
|
||||||
|
cl->cms = cms;
|
||||||
|
|
||||||
config_group_init_type_name(&cl->group, name, &cluster_type);
|
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(&sps->ss_group, "spaces", &spaces_type);
|
||||||
config_group_init_type_name(&cms->cs_group, "comms", &comms_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)
|
static void release_cluster(struct config_item *i)
|
||||||
{
|
{
|
||||||
struct dlm_cluster *cl = config_item_to_cluster(i);
|
struct dlm_cluster *cl = config_item_to_cluster(i);
|
||||||
|
|
||||||
|
kfree(cl->sps);
|
||||||
|
kfree(cl->cms);
|
||||||
kfree(cl);
|
kfree(cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user