lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20241219-psy-extensions-sysfs-v1-1-868fc6cb46d6@weissschuh.net>
Date: Thu, 19 Dec 2024 15:28:18 +0100
From: Thomas Weißschuh <linux@...ssschuh.net>
To: Sebastian Reichel <sre@...nel.org>, Armin Wolf <W_Armin@....de>
Cc: Sebastian Reichel <sebastian.reichel@...labora.com>, 
 linux-pm@...r.kernel.org, linux-kernel@...r.kernel.org, 
 Nathan Chancellor <nathan@...nel.org>, 
 Thomas Weißschuh <linux@...ssschuh.net>
Subject: [PATCH] power: supply: core: fix build of extension sysfs group if
 CONFIG_SYSFS=n

Add and use wrapper functions for the sysfs interaction.
Restore the compatibility of CONFIG_POWER_SUPPLY=y and CONFIG_SYSFS=n.

Reported-by: Nathan Chancellor <nathan@...nel.org>
Closes: https://lore.kernel.org/lkml/20241218195229.GA2796534@ax162/
Fixes: 288a2cabcf6b ("power: supply: core: add UAPI to discover currently used extensions")
Signed-off-by: Thomas Weißschuh <linux@...ssschuh.net>
---
Based on power-supply/for-next.
---
 drivers/power/supply/power_supply.h       | 12 +++++++++++-
 drivers/power/supply/power_supply_core.c  | 13 +++++--------
 drivers/power/supply/power_supply_sysfs.c | 15 ++++++++++++++-
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/drivers/power/supply/power_supply.h b/drivers/power/supply/power_supply.h
index 9ed749cd09369f0f13017847687509736b30aae8..8f6a2d44b996689b13e3ad4216e6f426d328b979 100644
--- a/drivers/power/supply/power_supply.h
+++ b/drivers/power/supply/power_supply.h
@@ -40,14 +40,24 @@ struct power_supply_ext_registration {
 
 extern void __init power_supply_init_attrs(void);
 extern int power_supply_uevent(const struct device *dev, struct kobj_uevent_env *env);
-extern const struct attribute_group power_supply_extension_group;
 extern const struct attribute_group *power_supply_attr_groups[];
+extern int power_supply_sysfs_add_extension(struct power_supply *psy,
+					    const struct power_supply_ext *ext,
+					    struct device *dev);
+extern void power_supply_sysfs_remove_extension(struct power_supply *psy,
+						const struct power_supply_ext *ext);
 
 #else
 
 static inline void power_supply_init_attrs(void) {}
 #define power_supply_attr_groups NULL
 #define power_supply_uevent NULL
+static inline int power_supply_sysfs_add_extension(struct power_supply *psy,
+						   const struct power_supply_ext *ext,
+						   struct device *dev)
+{ return 0; }
+static inline void power_supply_sysfs_remove_extension(struct power_supply *psy,
+						       const struct power_supply_ext *ext) {}
 
 #endif /* CONFIG_SYSFS */
 
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index 76ebaef403ed5cf0c00691dd9633bb12ce774fb1..eeeed1216e22595de75d1d2a482de4a5e6901773 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -1386,10 +1386,9 @@ int power_supply_register_extension(struct power_supply *psy, const struct power
 	reg->data = data;
 	list_add(&reg->list_head, &psy->extensions);
 
-	ret = sysfs_add_link_to_group(&psy->dev.kobj, power_supply_extension_group.name,
-				      &dev->kobj, ext->name);
+	ret = power_supply_sysfs_add_extension(psy, ext, dev);
 	if (ret)
-		goto sysfs_link_failed;
+		goto sysfs_add_failed;
 
 	ret = power_supply_update_sysfs_and_hwmon(psy);
 	if (ret)
@@ -1398,8 +1397,8 @@ int power_supply_register_extension(struct power_supply *psy, const struct power
 	return 0;
 
 sysfs_hwmon_failed:
-	sysfs_remove_link_from_group(&psy->dev.kobj, power_supply_extension_group.name, ext->name);
-sysfs_link_failed:
+	power_supply_sysfs_remove_extension(psy, ext);
+sysfs_add_failed:
 	list_del(&reg->list_head);
 	kfree(reg);
 	return ret;
@@ -1415,9 +1414,7 @@ void power_supply_unregister_extension(struct power_supply *psy, const struct po
 	power_supply_for_each_extension(reg, psy) {
 		if (reg->ext == ext) {
 			list_del(&reg->list_head);
-			sysfs_remove_link_from_group(&psy->dev.kobj,
-						     power_supply_extension_group.name,
-						     reg->ext->name);
+			power_supply_sysfs_remove_extension(psy, ext);
 			kfree(reg);
 			power_supply_update_sysfs_and_hwmon(psy);
 			return;
diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
index 261bf7bf6e22e3e9ac49074662220ed8db4aa207..9ce5eda2409387cfb55fbeacab1ced7b5ba5ceba 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -462,7 +462,7 @@ static struct attribute *power_supply_extension_attrs[] = {
 	NULL
 };
 
-const struct attribute_group power_supply_extension_group = {
+static const struct attribute_group power_supply_extension_group = {
 	.name = "extensions",
 	.attrs = power_supply_extension_attrs,
 };
@@ -624,3 +624,16 @@ int power_supply_charge_types_parse(unsigned int available_types, const char *bu
 	return -EINVAL;
 }
 EXPORT_SYMBOL_GPL(power_supply_charge_types_parse);
+
+int power_supply_sysfs_add_extension(struct power_supply *psy, const struct power_supply_ext *ext,
+				     struct device *dev)
+{
+	return sysfs_add_link_to_group(&psy->dev.kobj, power_supply_extension_group.name,
+				       &dev->kobj, ext->name);
+}
+
+void power_supply_sysfs_remove_extension(struct power_supply *psy,
+					 const struct power_supply_ext *ext)
+{
+	sysfs_remove_link_from_group(&psy->dev.kobj, power_supply_extension_group.name, ext->name);
+}

---
base-commit: 288a2cabcf6bb35532e8b2708829bdc2b85bc690
change-id: 20241219-psy-extensions-sysfs-91ef098587d5

Best regards,
-- 
Thomas Weißschuh <linux@...ssschuh.net>


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ