提交 000f2a4d 编写于 作者: K Kay Sievers 提交者: Greg Kroah-Hartman

Driver Core: kill subsys_attribute and default sysfs ops

Remove the no longer needed subsys_attributes, they are all converted to
the more sensical kobj_attributes.

There is no longer a magic fallback in sysfs attribute operations, all
kobjects which create simple attributes need explicitely a ktype
assigned, which tells the core what was intended here.
Signed-off-by: NKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 4443d07f
...@@ -20,43 +20,6 @@ ...@@ -20,43 +20,6 @@
#include "sysfs.h" #include "sysfs.h"
#define to_sattr(a) container_of(a,struct subsys_attribute, attr)
/*
* Subsystem file operations.
* These operations allow subsystems to have files that can be
* read/written.
*/
static ssize_t
subsys_attr_show(struct kobject * kobj, struct attribute * attr, char * page)
{
struct kset *kset = to_kset(kobj);
struct subsys_attribute * sattr = to_sattr(attr);
ssize_t ret = -EIO;
if (sattr->show)
ret = sattr->show(kset, page);
return ret;
}
static ssize_t
subsys_attr_store(struct kobject * kobj, struct attribute * attr,
const char * page, size_t count)
{
struct kset *kset = to_kset(kobj);
struct subsys_attribute * sattr = to_sattr(attr);
ssize_t ret = -EIO;
if (sattr->store)
ret = sattr->store(kset, page, count);
return ret;
}
static struct sysfs_ops subsys_sysfs_ops = {
.show = subsys_attr_show,
.store = subsys_attr_store,
};
/* /*
* There's one sysfs_buffer for each open file and one * There's one sysfs_buffer for each open file and one
* sysfs_open_dirent for each sysfs_dirent with one or more open * 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,29 +317,23 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
{ {
struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata; struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata;
struct kobject *kobj = attr_sd->s_parent->s_dir.kobj; struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
struct sysfs_buffer * buffer; struct sysfs_buffer *buffer;
struct sysfs_ops * ops = NULL; struct sysfs_ops *ops;
int error; int error = -EACCES;
/* need attr_sd for attr and ops, its parent for kobj */ /* need attr_sd for attr and ops, its parent for kobj */
if (!sysfs_get_active_two(attr_sd)) if (!sysfs_get_active_two(attr_sd))
return -ENODEV; return -ENODEV;
/* if the kobject has no ktype, then we assume that it is a subsystem /* every kobject with an attribute needs a ktype assigned */
* itself, and use ops for it. if (kobj->ktype && kobj->ktype->sysfs_ops)
*/
if (kobj->ktype)
ops = kobj->ktype->sysfs_ops; ops = kobj->ktype->sysfs_ops;
else else {
ops = &subsys_sysfs_ops; printk(KERN_ERR "missing sysfs attribute operations for "
"kobject: %s\n", kobject_name(kobj));
error = -EACCES; WARN_ON(1);
/* No sysfs operations, either from having no subsystem,
* or the subsystem have no operations.
*/
if (!ops)
goto err_out; goto err_out;
}
/* File needs write support. /* File needs write support.
* The inode's perms must say it's ok, * The inode's perms must say it's ok,
......
...@@ -216,15 +216,6 @@ extern struct kset *firmware_kset; ...@@ -216,15 +216,6 @@ extern struct kset *firmware_kset;
extern int __must_check subsystem_register(struct kset *); extern int __must_check subsystem_register(struct kset *);
extern void subsystem_unregister(struct kset *); extern void subsystem_unregister(struct kset *);
struct subsys_attribute {
struct attribute attr;
ssize_t (*show)(struct kset *, char *);
ssize_t (*store)(struct kset *, const char *, size_t);
};
extern int __must_check subsys_create_file(struct kset *,
struct subsys_attribute *);
#if defined(CONFIG_HOTPLUG) #if defined(CONFIG_HOTPLUG)
int kobject_uevent(struct kobject *kobj, enum kobject_action action); int kobject_uevent(struct kobject *kobj, enum kobject_action action);
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
......
...@@ -810,26 +810,6 @@ void subsystem_unregister(struct kset *s) ...@@ -810,26 +810,6 @@ void subsystem_unregister(struct kset *s)
kset_unregister(s); kset_unregister(s);
} }
/**
* subsystem_create_file - export sysfs attribute file.
* @s: subsystem.
* @a: subsystem attribute descriptor.
*/
int subsys_create_file(struct kset *s, struct subsys_attribute *a)
{
int error = 0;
if (!s || !a)
return -EINVAL;
if (kset_get(s)) {
error = sysfs_create_file(&s->kobj, &a->attr);
kset_put(s);
}
return error;
}
static void kset_release(struct kobject *kobj) static void kset_release(struct kobject *kobj)
{ {
struct kset *kset = container_of(kobj, struct kset, kobj); struct kset *kset = container_of(kobj, struct kset, kobj);
...@@ -927,4 +907,3 @@ EXPORT_SYMBOL(kset_unregister); ...@@ -927,4 +907,3 @@ EXPORT_SYMBOL(kset_unregister);
EXPORT_SYMBOL(subsystem_register); EXPORT_SYMBOL(subsystem_register);
EXPORT_SYMBOL(subsystem_unregister); EXPORT_SYMBOL(subsystem_unregister);
EXPORT_SYMBOL(subsys_create_file);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册