]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
sysfs: attribute_group: enable const variants of is_visible()
authorThomas Weißschuh <linux@weissschuh.net>
Wed, 29 Oct 2025 08:12:13 +0000 (09:12 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Nov 2025 14:16:35 +0000 (15:16 +0100)
When constifying instances of struct attribute, for consistency the
corresponding .is_visible() callback should be adapted, too.
Introduce a temporary transition mechanism until all callbacks are
converted.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Link: https://patch.msgid.link/20251029-sysfs-const-attr-prep-v5-4-ea7d745acff4@weissschuh.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/sysfs/group.c
include/linux/sysfs.h

index e142bac4f9f806a6ab80a25e37904bd6847c2ef8..e1e639f515a0fd4b013f2e25de8bd21557f174c2 100644 (file)
@@ -36,6 +36,9 @@ static umode_t __first_visible(const struct attribute_group *grp, struct kobject
        if (grp->attrs && grp->attrs[0] && grp->is_visible)
                return grp->is_visible(kobj, grp->attrs[0], 0);
 
+       if (grp->attrs && grp->attrs[0] && grp->is_visible_const)
+               return grp->is_visible_const(kobj, grp->attrs[0], 0);
+
        if (grp->bin_attrs && grp->bin_attrs[0] && grp->is_bin_visible)
                return grp->is_bin_visible(kobj, grp->bin_attrs[0], 0);
 
@@ -61,8 +64,11 @@ static int create_files(struct kernfs_node *parent, struct kobject *kobj,
                         */
                        if (update)
                                kernfs_remove_by_name(parent, (*attr)->name);
-                       if (grp->is_visible) {
-                               mode = grp->is_visible(kobj, *attr, i);
+                       if (grp->is_visible || grp->is_visible_const) {
+                               if (grp->is_visible)
+                                       mode = grp->is_visible(kobj, *attr, i);
+                               else
+                                       mode = grp->is_visible_const(kobj, *attr, i);
                                mode &= ~SYSFS_GROUP_INVISIBLE;
                                if (!mode)
                                        continue;
index 9cef5bf24ba71b45f9b8b6f20d3f9b1fa460fe4e..592886ed6ca9e0c9aa66622cc799a73fa4e796dc 100644 (file)
@@ -104,8 +104,12 @@ do {                                                       \
  */
 struct attribute_group {
        const char              *name;
-       umode_t                 (*is_visible)(struct kobject *,
-                                             struct attribute *, int);
+       __SYSFS_FUNCTION_ALTERNATIVE(
+               umode_t                 (*is_visible)(struct kobject *,
+                                                     struct attribute *, int);
+               umode_t                 (*is_visible_const)(struct kobject *,
+                                                           const struct attribute *, int);
+       );
        umode_t                 (*is_bin_visible)(struct kobject *,
                                                  const struct bin_attribute *, int);
        size_t                  (*bin_size)(struct kobject *,