|
@@ -20,43 +20,6 @@
|
|
|
|
|
|
#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
|
|
|
* 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 kobject *kobj = attr_sd->s_parent->s_dir.kobj;
|
|
|
- struct sysfs_buffer * buffer;
|
|
|
- struct sysfs_ops * ops = NULL;
|
|
|
- int error;
|
|
|
+ struct sysfs_buffer *buffer;
|
|
|
+ struct sysfs_ops *ops;
|
|
|
+ int error = -EACCES;
|
|
|
|
|
|
/* need attr_sd for attr and ops, its parent for kobj */
|
|
|
if (!sysfs_get_active_two(attr_sd))
|
|
|
return -ENODEV;
|
|
|
|
|
|
- /* if the kobject has no ktype, then we assume that it is a subsystem
|
|
|
- * itself, and use ops for it.
|
|
|
- */
|
|
|
- if (kobj->ktype)
|
|
|
+ /* every kobject with an attribute needs a ktype assigned */
|
|
|
+ if (kobj->ktype && kobj->ktype->sysfs_ops)
|
|
|
ops = kobj->ktype->sysfs_ops;
|
|
|
- else
|
|
|
- ops = &subsys_sysfs_ops;
|
|
|
-
|
|
|
- error = -EACCES;
|
|
|
-
|
|
|
- /* No sysfs operations, either from having no subsystem,
|
|
|
- * or the subsystem have no operations.
|
|
|
- */
|
|
|
- if (!ops)
|
|
|
+ else {
|
|
|
+ printk(KERN_ERR "missing sysfs attribute operations for "
|
|
|
+ "kobject: %s\n", kobject_name(kobj));
|
|
|
+ WARN_ON(1);
|
|
|
goto err_out;
|
|
|
+ }
|
|
|
|
|
|
/* File needs write support.
|
|
|
* The inode's perms must say it's ok,
|