Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.25
[deliverable/linux.git] / fs / sysfs / group.c
CommitLineData
1da177e4
LT
1/*
2 * fs/sysfs/group.c - Operations for adding/removing multiple files at once.
3 *
4 * Copyright (c) 2003 Patrick Mochel
5 * Copyright (c) 2003 Open Source Development Lab
6 *
7 * This file is released undert the GPL v2.
8 *
9 */
10
11#include <linux/kobject.h>
12#include <linux/module.h>
13#include <linux/dcache.h>
5f45f1a7 14#include <linux/namei.h>
1da177e4
LT
15#include <linux/err.h>
16#include "sysfs.h"
17
18
d4acd722 19static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
608e266a 20 const struct attribute_group *grp)
1da177e4
LT
21{
22 struct attribute *const* attr;
d4acd722 23 int i;
1da177e4 24
d4acd722
JB
25 for (i = 0, attr = grp->attrs; *attr; i++, attr++)
26 if (!grp->is_visible ||
27 grp->is_visible(kobj, *attr, i))
28 sysfs_hash_and_remove(dir_sd, (*attr)->name);
1da177e4
LT
29}
30
d4acd722 31static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
608e266a 32 const struct attribute_group *grp)
1da177e4
LT
33{
34 struct attribute *const* attr;
d4acd722 35 int error = 0, i;
1da177e4 36
d4acd722
JB
37 for (i = 0, attr = grp->attrs; *attr && !error; i++, 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);
1da177e4 42 if (error)
d4acd722 43 remove_files(dir_sd, kobj, grp);
1da177e4
LT
44 return error;
45}
46
47
48int sysfs_create_group(struct kobject * kobj,
49 const struct attribute_group * grp)
50{
608e266a 51 struct sysfs_dirent *sd;
1da177e4
LT
52 int error;
53
608e266a 54 BUG_ON(!kobj || !kobj->sd);
1da177e4
LT
55
56 if (grp->name) {
608e266a 57 error = sysfs_create_subdir(kobj, grp->name, &sd);
1da177e4
LT
58 if (error)
59 return error;
60 } else
608e266a
TH
61 sd = kobj->sd;
62 sysfs_get(sd);
d4acd722 63 error = create_files(sd, kobj, grp);
608e266a 64 if (error) {
1da177e4 65 if (grp->name)
608e266a 66 sysfs_remove_subdir(sd);
1da177e4 67 }
608e266a 68 sysfs_put(sd);
1da177e4
LT
69 return error;
70}
71
72void sysfs_remove_group(struct kobject * kobj,
73 const struct attribute_group * grp)
74{
608e266a
TH
75 struct sysfs_dirent *dir_sd = kobj->sd;
76 struct sysfs_dirent *sd;
1da177e4 77
057f6c01 78 if (grp->name) {
608e266a 79 sd = sysfs_get_dirent(dir_sd, grp->name);
969affd2
GKH
80 if (!sd) {
81 printk(KERN_WARNING "sysfs group %p not found for "
82 "kobject '%s'\n", grp, kobject_name(kobj));
83 WARN_ON(!sd);
84 return;
85 }
608e266a
TH
86 } else
87 sd = sysfs_get(dir_sd);
1da177e4 88
d4acd722 89 remove_files(sd, kobj, grp);
1da177e4 90 if (grp->name)
608e266a
TH
91 sysfs_remove_subdir(sd);
92
93 sysfs_put(sd);
1da177e4
LT
94}
95
96
97EXPORT_SYMBOL_GPL(sysfs_create_group);
98EXPORT_SYMBOL_GPL(sysfs_remove_group);
This page took 0.509871 seconds and 5 git commands to generate.