aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/sysfs/file.c63
-rw-r--r--include/linux/kobject.h9
-rw-r--r--lib/kobject.c21
3 files changed, 10 insertions, 83 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 387a63662793..8acf82bba44c 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -20,43 +20,6 @@
20 20
21#include "sysfs.h" 21#include "sysfs.h"
22 22
23#define to_sattr(a) container_of(a,struct subsys_attribute, attr)
24
25/*
26 * Subsystem file operations.
27 * These operations allow subsystems to have files that can be
28 * read/written.
29 */
30static ssize_t
31subsys_attr_show(struct kobject * kobj, struct attribute * attr, char * page)
32{
33 struct kset *kset = to_kset(kobj);
34 struct subsys_attribute * sattr = to_sattr(attr);
35 ssize_t ret = -EIO;
36
37 if (sattr->show)
38 ret = sattr->show(kset, page);
39 return ret;
40}
41
42static ssize_t
43subsys_attr_store(struct kobject * kobj, struct attribute * attr,
44 const char * page, size_t count)
45{
46 struct kset *kset = to_kset(kobj);
47 struct subsys_attribute * sattr = to_sattr(attr);
48 ssize_t ret = -EIO;
49
50 if (sattr->store)
51 ret = sattr->store(kset, page, count);
52 return ret;
53}
54
55static struct sysfs_ops subsys_sysfs_ops = {
56 .show = subsys_attr_show,
57 .store = subsys_attr_store,
58};
59
60/* 23/*
61 * There's one sysfs_buffer for each open file and one 24 * There's one sysfs_buffer for each open file and one
62 * sysfs_open_dirent for each sysfs_dirent with one or more open 25 * sysfs_open_dirent for each sysfs_dirent with one or more open
@@ -354,29 +317,23 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
354{ 317{
355 struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata; 318 struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata;
356 struct kobject *kobj = attr_sd->s_parent->s_dir.kobj; 319 struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
357 struct sysfs_buffer * buffer; 320 struct sysfs_buffer *buffer;
358 struct sysfs_ops * ops = NULL; 321 struct sysfs_ops *ops;
359 int error; 322 int error = -EACCES;
360 323
361 /* need attr_sd for attr and ops, its parent for kobj */ 324 /* need attr_sd for attr and ops, its parent for kobj */
362 if (!sysfs_get_active_two(attr_sd)) 325 if (!sysfs_get_active_two(attr_sd))
363 return -ENODEV; 326 return -ENODEV;
364 327
365 /* if the kobject has no ktype, then we assume that it is a subsystem 328 /* every kobject with an attribute needs a ktype assigned */
366 * itself, and use ops for it. 329 if (kobj->ktype && kobj->ktype->sysfs_ops)
367 */
368 if (kobj->ktype)
369 ops = kobj->ktype->sysfs_ops; 330 ops = kobj->ktype->sysfs_ops;
370 else 331 else {
371 ops = &subsys_sysfs_ops; 332 printk(KERN_ERR "missing sysfs attribute operations for "
372 333 "kobject: %s\n", kobject_name(kobj));
373 error = -EACCES; 334 WARN_ON(1);
374
375 /* No sysfs operations, either from having no subsystem,
376 * or the subsystem have no operations.
377 */
378 if (!ops)
379 goto err_out; 335 goto err_out;
336 }
380 337
381 /* File needs write support. 338 /* File needs write support.
382 * The inode's perms must say it's ok, 339 * The inode's perms must say it's ok,
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index 29dc444e3361..29841bb5badb 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -216,15 +216,6 @@ extern struct kset *firmware_kset;
216extern int __must_check subsystem_register(struct kset *); 216extern int __must_check subsystem_register(struct kset *);
217extern void subsystem_unregister(struct kset *); 217extern void subsystem_unregister(struct kset *);
218 218
219struct subsys_attribute {
220 struct attribute attr;
221 ssize_t (*show)(struct kset *, char *);
222 ssize_t (*store)(struct kset *, const char *, size_t);
223};
224
225extern int __must_check subsys_create_file(struct kset *,
226 struct subsys_attribute *);
227
228#if defined(CONFIG_HOTPLUG) 219#if defined(CONFIG_HOTPLUG)
229int kobject_uevent(struct kobject *kobj, enum kobject_action action); 220int kobject_uevent(struct kobject *kobj, enum kobject_action action);
230int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, 221int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
diff --git a/lib/kobject.c b/lib/kobject.c
index 99f6354a5751..c742ac25228a 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -810,26 +810,6 @@ void subsystem_unregister(struct kset *s)
810 kset_unregister(s); 810 kset_unregister(s);
811} 811}
812 812
813/**
814 * subsystem_create_file - export sysfs attribute file.
815 * @s: subsystem.
816 * @a: subsystem attribute descriptor.
817 */
818
819int subsys_create_file(struct kset *s, struct subsys_attribute *a)
820{
821 int error = 0;
822
823 if (!s || !a)
824 return -EINVAL;
825
826 if (kset_get(s)) {
827 error = sysfs_create_file(&s->kobj, &a->attr);
828 kset_put(s);
829 }
830 return error;
831}
832
833static void kset_release(struct kobject *kobj) 813static void kset_release(struct kobject *kobj)
834{ 814{
835 struct kset *kset = container_of(kobj, struct kset, kobj); 815 struct kset *kset = container_of(kobj, struct kset, kobj);
@@ -927,4 +907,3 @@ EXPORT_SYMBOL(kset_unregister);
927 907
928EXPORT_SYMBOL(subsystem_register); 908EXPORT_SYMBOL(subsystem_register);
929EXPORT_SYMBOL(subsystem_unregister); 909EXPORT_SYMBOL(subsystem_unregister);
930EXPORT_SYMBOL(subsys_create_file);