mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: Kay Sievers <kay.sievers@vrfy.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
4443d07fcf
commit
000f2a4d8c
@ -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)
|
|||||||
{
|
{
|
||||||
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;
|
|||||||
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)
|
|||||||
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);
|
|||||||
|
|
||||||
EXPORT_SYMBOL(subsystem_register);
|
EXPORT_SYMBOL(subsystem_register);
|
||||||
EXPORT_SYMBOL(subsystem_unregister);
|
EXPORT_SYMBOL(subsystem_unregister);
|
||||||
EXPORT_SYMBOL(subsys_create_file);
|
|
||||||
|
Loading…
Reference in New Issue
Block a user