Skip to content

Commit 4b91b77

Browse files
kuu-rtgregkh
authored andcommitted
platform/x86: think-lmi: Fix sysfs group cleanup
commit 4f30f94 upstream. Many error paths in tlmi_sysfs_init() lead to sysfs groups being removed when they were not even created. Fix this by letting the kobject core manage these groups through their kobj_type's defult_groups. Fixes: a40cd7e ("platform/x86: think-lmi: Add WMI interface support on Lenovo platforms") Cc: stable@vger.kernel.org Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Kurt Borja <kuurtb@gmail.com> Link: https://lore.kernel.org/r/20250630-lmi-fix-v3-3-ce4f81c9c481@gmail.com Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 98002f1 commit 4b91b77

1 file changed

Lines changed: 4 additions & 39 deletions

File tree

drivers/platform/x86/think-lmi.c

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,7 @@ static const struct attribute_group auth_attr_group = {
916916
.is_visible = auth_attr_is_visible,
917917
.attrs = auth_attrs,
918918
};
919+
__ATTRIBUTE_GROUPS(auth_attr);
919920

920921
/* ---- Attributes sysfs --------------------------------------------------------- */
921922
static ssize_t display_name_show(struct kobject *kobj, struct kobj_attribute *attr,
@@ -1119,6 +1120,7 @@ static const struct attribute_group tlmi_attr_group = {
11191120
.is_visible = attr_is_visible,
11201121
.attrs = tlmi_attrs,
11211122
};
1123+
__ATTRIBUTE_GROUPS(tlmi_attr);
11221124

11231125
static void tlmi_attr_setting_release(struct kobject *kobj)
11241126
{
@@ -1138,11 +1140,13 @@ static void tlmi_pwd_setting_release(struct kobject *kobj)
11381140
static const struct kobj_type tlmi_attr_setting_ktype = {
11391141
.release = &tlmi_attr_setting_release,
11401142
.sysfs_ops = &kobj_sysfs_ops,
1143+
.default_groups = tlmi_attr_groups,
11411144
};
11421145

11431146
static const struct kobj_type tlmi_pwd_setting_ktype = {
11441147
.release = &tlmi_pwd_setting_release,
11451148
.sysfs_ops = &kobj_sysfs_ops,
1149+
.default_groups = auth_attr_groups,
11461150
};
11471151

11481152
static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *attr,
@@ -1213,14 +1217,8 @@ static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd);
12131217
static void tlmi_release_attr(void)
12141218
{
12151219
struct kobject *pos, *n;
1216-
int i;
12171220

12181221
/* Attribute structures */
1219-
for (i = 0; i < TLMI_SETTINGS_COUNT; i++) {
1220-
if (tlmi_priv.setting[i]) {
1221-
sysfs_remove_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group);
1222-
}
1223-
}
12241222
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
12251223
if (tlmi_priv.can_debug_cmd && debug_support)
12261224
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &debug_cmd.attr);
@@ -1235,15 +1233,6 @@ static void tlmi_release_attr(void)
12351233
kfree(tlmi_priv.pwd_admin->save_signature);
12361234

12371235
/* Authentication structures */
1238-
sysfs_remove_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group);
1239-
sysfs_remove_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group);
1240-
1241-
if (tlmi_priv.opcode_support) {
1242-
sysfs_remove_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group);
1243-
sysfs_remove_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group);
1244-
sysfs_remove_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group);
1245-
}
1246-
12471236
list_for_each_entry_safe(pos, n, &tlmi_priv.authentication_kset->list, entry)
12481237
kobject_put(pos);
12491238

@@ -1314,10 +1303,6 @@ static int tlmi_sysfs_init(void)
13141303
NULL, "%s", tlmi_priv.setting[i]->display_name);
13151304
if (ret)
13161305
goto fail_create_attr;
1317-
1318-
ret = sysfs_create_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group);
1319-
if (ret)
1320-
goto fail_create_attr;
13211306
}
13221307

13231308
ret = sysfs_create_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
@@ -1337,50 +1322,30 @@ static int tlmi_sysfs_init(void)
13371322
if (ret)
13381323
goto fail_create_attr;
13391324

1340-
ret = sysfs_create_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group);
1341-
if (ret)
1342-
goto fail_create_attr;
1343-
13441325
tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset;
13451326
ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype,
13461327
NULL, "%s", "Power-on");
13471328
if (ret)
13481329
goto fail_create_attr;
13491330

1350-
ret = sysfs_create_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group);
1351-
if (ret)
1352-
goto fail_create_attr;
1353-
13541331
if (tlmi_priv.opcode_support) {
13551332
tlmi_priv.pwd_system->kobj.kset = tlmi_priv.authentication_kset;
13561333
ret = kobject_init_and_add(&tlmi_priv.pwd_system->kobj, &tlmi_pwd_setting_ktype,
13571334
NULL, "%s", "System");
13581335
if (ret)
13591336
goto fail_create_attr;
13601337

1361-
ret = sysfs_create_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group);
1362-
if (ret)
1363-
goto fail_create_attr;
1364-
13651338
tlmi_priv.pwd_hdd->kobj.kset = tlmi_priv.authentication_kset;
13661339
ret = kobject_init_and_add(&tlmi_priv.pwd_hdd->kobj, &tlmi_pwd_setting_ktype,
13671340
NULL, "%s", "HDD");
13681341
if (ret)
13691342
goto fail_create_attr;
13701343

1371-
ret = sysfs_create_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group);
1372-
if (ret)
1373-
goto fail_create_attr;
1374-
13751344
tlmi_priv.pwd_nvme->kobj.kset = tlmi_priv.authentication_kset;
13761345
ret = kobject_init_and_add(&tlmi_priv.pwd_nvme->kobj, &tlmi_pwd_setting_ktype,
13771346
NULL, "%s", "NVMe");
13781347
if (ret)
13791348
goto fail_create_attr;
1380-
1381-
ret = sysfs_create_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group);
1382-
if (ret)
1383-
goto fail_create_attr;
13841349
}
13851350

13861351
return ret;

0 commit comments

Comments
 (0)