Commit d4acd722 authored by James Bottomley's avatar James Bottomley

[SCSI] sysfs: add filter function to groups

This patch allows the various users of attribute_groups to selectively
allow the appearance of group attributes.  The primary consumer of
this will be the transport classes in which we currently have
elaborate attribute selection algorithms to do this same thing.
Acked-by: default avatarGreg KH <greg@kroah.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent d52b3815
...@@ -16,25 +16,31 @@ ...@@ -16,25 +16,31 @@
#include "sysfs.h" #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) const struct attribute_group *grp)
{ {
struct attribute *const* attr; struct attribute *const* attr;
int i;
for (attr = grp->attrs; *attr; attr++) 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); 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) const struct attribute_group *grp)
{ {
struct attribute *const* attr; struct attribute *const* attr;
int error = 0; int error = 0, i;
for (attr = grp->attrs; *attr && !error; attr++) for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++)
error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR); if (!grp->is_visible ||
grp->is_visible(kobj, *attr, i))
error |=
sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
if (error) if (error)
remove_files(dir_sd, grp); remove_files(dir_sd, kobj, grp);
return error; return error;
} }
...@@ -54,7 +60,7 @@ int sysfs_create_group(struct kobject * kobj, ...@@ -54,7 +60,7 @@ int sysfs_create_group(struct kobject * kobj,
} else } else
sd = kobj->sd; sd = kobj->sd;
sysfs_get(sd); sysfs_get(sd);
error = create_files(sd, grp); error = create_files(sd, kobj, grp);
if (error) { if (error) {
if (grp->name) if (grp->name)
sysfs_remove_subdir(sd); sysfs_remove_subdir(sd);
...@@ -75,7 +81,7 @@ void sysfs_remove_group(struct kobject * kobj, ...@@ -75,7 +81,7 @@ void sysfs_remove_group(struct kobject * kobj,
} else } else
sd = sysfs_get(dir_sd); sd = sysfs_get(dir_sd);
remove_files(sd, grp); remove_files(sd, kobj, grp);
if (grp->name) if (grp->name)
sysfs_remove_subdir(sd); sysfs_remove_subdir(sd);
......
...@@ -32,6 +32,8 @@ struct attribute { ...@@ -32,6 +32,8 @@ struct attribute {
struct attribute_group { struct attribute_group {
const char *name; const char *name;
int (*is_visible)(struct kobject *,
struct attribute *, int);
struct attribute **attrs; struct attribute **attrs;
}; };
......
...@@ -472,7 +472,7 @@ param_sysfs_setup(struct module_kobject *mk, ...@@ -472,7 +472,7 @@ param_sysfs_setup(struct module_kobject *mk,
sizeof(mp->grp.attrs[0])); sizeof(mp->grp.attrs[0]));
size[1] = (valid_attrs + 1) * 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) if (!mp)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment