aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/sysfs')
-rw-r--r--fs/sysfs/file.c11
-rw-r--r--fs/sysfs/group.c26
2 files changed, 25 insertions, 12 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 8acf82bba44c..a271c87c4472 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -523,7 +523,11 @@ int sysfs_add_file_to_group(struct kobject *kobj,
523 struct sysfs_dirent *dir_sd; 523 struct sysfs_dirent *dir_sd;
524 int error; 524 int error;
525 525
526 dir_sd = sysfs_get_dirent(kobj->sd, group); 526 if (group)
527 dir_sd = sysfs_get_dirent(kobj->sd, group);
528 else
529 dir_sd = sysfs_get(kobj->sd);
530
527 if (!dir_sd) 531 if (!dir_sd)
528 return -ENOENT; 532 return -ENOENT;
529 533
@@ -611,7 +615,10 @@ void sysfs_remove_file_from_group(struct kobject *kobj,
611{ 615{
612 struct sysfs_dirent *dir_sd; 616 struct sysfs_dirent *dir_sd;
613 617
614 dir_sd = sysfs_get_dirent(kobj->sd, group); 618 if (group)
619 dir_sd = sysfs_get_dirent(kobj->sd, group);
620 else
621 dir_sd = sysfs_get(kobj->sd);
615 if (dir_sd) { 622 if (dir_sd) {
616 sysfs_hash_and_remove(dir_sd, attr->name); 623 sysfs_hash_and_remove(dir_sd, attr->name);
617 sysfs_put(dir_sd); 624 sysfs_put(dir_sd);
diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index d1972374655a..0871c3dadce1 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -16,25 +16,31 @@
16#include "sysfs.h" 16#include "sysfs.h"
17 17
18 18
19static void remove_files(struct sysfs_dirent *dir_sd, 19static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
20 const struct attribute_group *grp) 20 const struct attribute_group *grp)
21{ 21{
22 struct attribute *const* attr; 22 struct attribute *const* attr;
23 int i;
23 24
24 for (attr = grp->attrs; *attr; attr++) 25 for (i = 0, attr = grp->attrs; *attr; i++, attr++)
25 sysfs_hash_and_remove(dir_sd, (*attr)->name); 26 if (!grp->is_visible ||
27 grp->is_visible(kobj, *attr, i))
28 sysfs_hash_and_remove(dir_sd, (*attr)->name);
26} 29}
27 30
28static int create_files(struct sysfs_dirent *dir_sd, 31static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
29 const struct attribute_group *grp) 32 const struct attribute_group *grp)
30{ 33{
31 struct attribute *const* attr; 34 struct attribute *const* attr;
32 int error = 0; 35 int error = 0, i;
33 36
34 for (attr = grp->attrs; *attr && !error; attr++) 37 for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++)
35 error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR); 38 if (!grp->is_visible ||
39 grp->is_visible(kobj, *attr, i))
40 error |=
41 sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
36 if (error) 42 if (error)
37 remove_files(dir_sd, grp); 43 remove_files(dir_sd, kobj, grp);
38 return error; 44 return error;
39} 45}
40 46
@@ -54,7 +60,7 @@ int sysfs_create_group(struct kobject * kobj,
54 } else 60 } else
55 sd = kobj->sd; 61 sd = kobj->sd;
56 sysfs_get(sd); 62 sysfs_get(sd);
57 error = create_files(sd, grp); 63 error = create_files(sd, kobj, grp);
58 if (error) { 64 if (error) {
59 if (grp->name) 65 if (grp->name)
60 sysfs_remove_subdir(sd); 66 sysfs_remove_subdir(sd);
@@ -75,7 +81,7 @@ void sysfs_remove_group(struct kobject * kobj,
75 } else 81 } else
76 sd = sysfs_get(dir_sd); 82 sd = sysfs_get(dir_sd);
77 83
78 remove_files(sd, grp); 84 remove_files(sd, kobj, grp);
79 if (grp->name) 85 if (grp->name)
80 sysfs_remove_subdir(sd); 86 sysfs_remove_subdir(sd);
81 87