From 66de6df62a15478e32cb14dd34be1f4bff07dab0 Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Wed, 31 Oct 2007 09:38:04 -0500 Subject: [PATCH] --- yaml --- r: 77099 b: refs/heads/master c: d4acd722b7bb5f48b9fc3848e8c2a845b100d84f h: refs/heads/master i: 77097: 9267d28a9ce59680359a0de49bbec01abdd2e983 77095: faeb050c1df20efc9e73b79d3b5f1407e2a35862 v: v3 --- [refs] | 2 +- trunk/fs/sysfs/group.c | 26 ++++++++++++++++---------- trunk/include/linux/sysfs.h | 2 ++ trunk/kernel/params.c | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index be97ce5d5172..8a83a19d403d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d52b3815a52456dcf1a45fbc344e23bb643b2bda +refs/heads/master: d4acd722b7bb5f48b9fc3848e8c2a845b100d84f diff --git a/trunk/fs/sysfs/group.c b/trunk/fs/sysfs/group.c index d1972374655a..0871c3dadce1 100644 --- a/trunk/fs/sysfs/group.c +++ b/trunk/fs/sysfs/group.c @@ -16,25 +16,31 @@ #include "sysfs.h" -static void remove_files(struct sysfs_dirent *dir_sd, +static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj, const struct attribute_group *grp) { struct attribute *const* attr; + int i; - for (attr = grp->attrs; *attr; attr++) - sysfs_hash_and_remove(dir_sd, (*attr)->name); + for (i = 0, attr = grp->attrs; *attr; i++, attr++) + if (!grp->is_visible || + grp->is_visible(kobj, *attr, i)) + sysfs_hash_and_remove(dir_sd, (*attr)->name); } -static int create_files(struct sysfs_dirent *dir_sd, +static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj, const struct attribute_group *grp) { struct attribute *const* attr; - int error = 0; + int error = 0, i; - for (attr = grp->attrs; *attr && !error; attr++) - error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR); + for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) + if (!grp->is_visible || + grp->is_visible(kobj, *attr, i)) + error |= + sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR); if (error) - remove_files(dir_sd, grp); + remove_files(dir_sd, kobj, grp); return error; } @@ -54,7 +60,7 @@ int sysfs_create_group(struct kobject * kobj, } else sd = kobj->sd; sysfs_get(sd); - error = create_files(sd, grp); + error = create_files(sd, kobj, grp); if (error) { if (grp->name) sysfs_remove_subdir(sd); @@ -75,7 +81,7 @@ void sysfs_remove_group(struct kobject * kobj, } else sd = sysfs_get(dir_sd); - remove_files(sd, grp); + remove_files(sd, kobj, grp); if (grp->name) sysfs_remove_subdir(sd); diff --git a/trunk/include/linux/sysfs.h b/trunk/include/linux/sysfs.h index 149ab62329e2..802710438a9e 100644 --- a/trunk/include/linux/sysfs.h +++ b/trunk/include/linux/sysfs.h @@ -32,6 +32,8 @@ struct attribute { struct attribute_group { const char *name; + int (*is_visible)(struct kobject *, + struct attribute *, int); struct attribute **attrs; }; diff --git a/trunk/kernel/params.c b/trunk/kernel/params.c index 7686417ee00e..dfef46474e55 100644 --- a/trunk/kernel/params.c +++ b/trunk/kernel/params.c @@ -472,7 +472,7 @@ param_sysfs_setup(struct module_kobject *mk, sizeof(mp->grp.attrs[0])); size[1] = (valid_attrs + 1) * sizeof(mp->grp.attrs[0]); - mp = kmalloc(size[0] + size[1], GFP_KERNEL); + mp = kzalloc(size[0] + size[1], GFP_KERNEL); if (!mp) return ERR_PTR(-ENOMEM);