summary refs log tree commit diff
path: root/fs/sysfs
diff options
context:
space:
mode:
authorSourabh Jain <sourabhjain@linux.ibm.com>2019-12-11 21:39:06 +0530
committerMichael Ellerman <mpe@ellerman.id.au>2020-02-19 21:07:09 +1100
commit9255782f70614c89b1a15ec6997c4b72ce9e630a (patch)
treee170801c0010faf3b1fed320fedcf7c52d01b25f /fs/sysfs
parentf52153ab383f04a45c38d8a7f55a4249477b20df (diff)
downloadlinux-9255782f70614c89b1a15ec6997c4b72ce9e630a.tar.gz
sysfs: Wrap __compat_only_sysfs_link_entry_to_kobj function to change the symlink name
The __compat_only_sysfs_link_entry_to_kobj function creates a symlink
to a kobject but doesn't provide an option to change the symlink file
name.

This patch adds a wrapper function compat_only_sysfs_link_entry_to_kobj
that extends the __compat_only_sysfs_link_entry_to_kobj functionality
which allows function caller to customize the symlink name.

Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
[mpe: Fix compile error when CONFIG_SYSFS=n]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20191211160910.21656-3-sourabhjain@linux.ibm.com
Diffstat (limited to 'fs/sysfs')
-rw-r--r--fs/sysfs/group.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index c4ab045926b7..1e2a096057bc 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -425,6 +425,25 @@ int __compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 				      struct kobject *target_kobj,
 				      const char *target_name)
 {
+	return compat_only_sysfs_link_entry_to_kobj(kobj, target_kobj,
+						    target_name, NULL);
+}
+EXPORT_SYMBOL_GPL(__compat_only_sysfs_link_entry_to_kobj);
+
+/**
+ * compat_only_sysfs_link_entry_to_kobj - add a symlink to a kobject pointing
+ * to a group or an attribute
+ * @kobj:		The kobject containing the group.
+ * @target_kobj:	The target kobject.
+ * @target_name:	The name of the target group or attribute.
+ * @symlink_name:	The name of the symlink file (target_name will be
+ *			considered if symlink_name is NULL).
+ */
+int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
+					 struct kobject *target_kobj,
+					 const char *target_name,
+					 const char *symlink_name)
+{
 	struct kernfs_node *target;
 	struct kernfs_node *entry;
 	struct kernfs_node *link;
@@ -448,12 +467,15 @@ int __compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 		return -ENOENT;
 	}
 
-	link = kernfs_create_link(kobj->sd, target_name, entry);
+	if (!symlink_name)
+		symlink_name = target_name;
+
+	link = kernfs_create_link(kobj->sd, symlink_name, entry);
 	if (PTR_ERR(link) == -EEXIST)
-		sysfs_warn_dup(kobj->sd, target_name);
+		sysfs_warn_dup(kobj->sd, symlink_name);
 
 	kernfs_put(entry);
 	kernfs_put(target);
 	return PTR_ERR_OR_ZERO(link);
 }
-EXPORT_SYMBOL_GPL(__compat_only_sysfs_link_entry_to_kobj);
+EXPORT_SYMBOL_GPL(compat_only_sysfs_link_entry_to_kobj);