Commit 220d18c7 authored by Andrew Morton's avatar Andrew Morton Committed by Greg Kroah-Hartman

[PATCH] sysfs backing store - prepare sysfs_file_operations helpers

From: Maneesh Soni <maneesh@in.ibm.com>

o The following patch provides dumb helpers to access the corresponding
  kobject, attribute or binary attribute given a dentry and prepare the
  sysfs_file_operation methods for using sysfs_dirents.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent e47c11be
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
static int static int
fill_read(struct dentry *dentry, char *buffer, loff_t off, size_t count) fill_read(struct dentry *dentry, char *buffer, loff_t off, size_t count)
{ {
struct bin_attribute * attr = dentry->d_fsdata; struct bin_attribute * attr = to_bin_attr(dentry);
struct kobject * kobj = dentry->d_parent->d_fsdata; struct kobject * kobj = to_kobj(dentry->d_parent);
return attr->read(kobj, buffer, off, count); return attr->read(kobj, buffer, off, count);
} }
...@@ -60,8 +60,8 @@ read(struct file * file, char __user * userbuf, size_t count, loff_t * off) ...@@ -60,8 +60,8 @@ read(struct file * file, char __user * userbuf, size_t count, loff_t * off)
static int static int
flush_write(struct dentry *dentry, char *buffer, loff_t offset, size_t count) flush_write(struct dentry *dentry, char *buffer, loff_t offset, size_t count)
{ {
struct bin_attribute *attr = dentry->d_fsdata; struct bin_attribute *attr = to_bin_attr(dentry->d_parent);
struct kobject *kobj = dentry->d_parent->d_fsdata; struct kobject *kobj = to_kobj(dentry);
return attr->write(kobj, buffer, offset, count); return attr->write(kobj, buffer, offset, count);
} }
...@@ -95,7 +95,7 @@ static ssize_t write(struct file * file, const char __user * userbuf, ...@@ -95,7 +95,7 @@ static ssize_t write(struct file * file, const char __user * userbuf,
static int open(struct inode * inode, struct file * file) static int open(struct inode * inode, struct file * file)
{ {
struct kobject *kobj = sysfs_get_kobject(file->f_dentry->d_parent); struct kobject *kobj = sysfs_get_kobject(file->f_dentry->d_parent);
struct bin_attribute * attr = file->f_dentry->d_fsdata; struct bin_attribute * attr = to_bin_attr(file->f_dentry);
int error = -EINVAL; int error = -EINVAL;
if (!kobj || !attr) if (!kobj || !attr)
...@@ -130,8 +130,8 @@ static int open(struct inode * inode, struct file * file) ...@@ -130,8 +130,8 @@ static int open(struct inode * inode, struct file * file)
static int release(struct inode * inode, struct file * file) static int release(struct inode * inode, struct file * file)
{ {
struct kobject * kobj = file->f_dentry->d_parent->d_fsdata; struct kobject * kobj = to_kobj(file->f_dentry->d_parent);
struct bin_attribute * attr = file->f_dentry->d_fsdata; struct bin_attribute * attr = to_bin_attr(file->f_dentry);
u8 * buffer = file->private_data; u8 * buffer = file->private_data;
if (kobj) if (kobj)
......
...@@ -67,7 +67,7 @@ struct sysfs_buffer { ...@@ -67,7 +67,7 @@ struct sysfs_buffer {
/** /**
* fill_read_buffer - allocate and fill buffer from object. * fill_read_buffer - allocate and fill buffer from object.
* @file: file pointer. * @dentry: dentry pointer.
* @buffer: data buffer for file. * @buffer: data buffer for file.
* *
* Allocate @buffer->page, if it hasn't been already, then call the * Allocate @buffer->page, if it hasn't been already, then call the
...@@ -75,10 +75,10 @@ struct sysfs_buffer { ...@@ -75,10 +75,10 @@ struct sysfs_buffer {
* data. * data.
* This is called only once, on the file's first read. * This is called only once, on the file's first read.
*/ */
static int fill_read_buffer(struct file * file, struct sysfs_buffer * buffer) static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer)
{ {
struct attribute * attr = file->f_dentry->d_fsdata; struct attribute * attr = to_attr(dentry);
struct kobject * kobj = file->f_dentry->d_parent->d_fsdata; struct kobject * kobj = to_kobj(dentry->d_parent);
struct sysfs_ops * ops = buffer->ops; struct sysfs_ops * ops = buffer->ops;
int ret = 0; int ret = 0;
ssize_t count; ssize_t count;
...@@ -150,7 +150,7 @@ sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos) ...@@ -150,7 +150,7 @@ sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos)
ssize_t retval = 0; ssize_t retval = 0;
if (!*ppos) { if (!*ppos) {
if ((retval = fill_read_buffer(file,buffer))) if ((retval = fill_read_buffer(file->f_dentry,buffer)))
return retval; return retval;
} }
pr_debug("%s: count = %d, ppos = %lld, buf = %s\n", pr_debug("%s: count = %d, ppos = %lld, buf = %s\n",
...@@ -197,10 +197,10 @@ fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t ...@@ -197,10 +197,10 @@ fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t
*/ */
static int static int
flush_write_buffer(struct file * file, struct sysfs_buffer * buffer, size_t count) flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count)
{ {
struct attribute * attr = file->f_dentry->d_fsdata; struct attribute * attr = to_attr(dentry);
struct kobject * kobj = file->f_dentry->d_parent->d_fsdata; struct kobject * kobj = to_kobj(dentry->d_parent);
struct sysfs_ops * ops = buffer->ops; struct sysfs_ops * ops = buffer->ops;
return ops->store(kobj,attr,buffer->page,count); return ops->store(kobj,attr,buffer->page,count);
...@@ -231,7 +231,7 @@ sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t ...@@ -231,7 +231,7 @@ sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t
count = fill_write_buffer(buffer,buf,count); count = fill_write_buffer(buffer,buf,count);
if (count > 0) if (count > 0)
count = flush_write_buffer(file,buffer,count); count = flush_write_buffer(file->f_dentry,buffer,count);
if (count > 0) if (count > 0)
*ppos += count; *ppos += count;
return count; return count;
...@@ -240,7 +240,7 @@ sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t ...@@ -240,7 +240,7 @@ sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t
static int check_perm(struct inode * inode, struct file * file) static int check_perm(struct inode * inode, struct file * file)
{ {
struct kobject *kobj = sysfs_get_kobject(file->f_dentry->d_parent); struct kobject *kobj = sysfs_get_kobject(file->f_dentry->d_parent);
struct attribute * attr = file->f_dentry->d_fsdata; struct attribute * attr = to_attr(file->f_dentry);
struct sysfs_buffer * buffer; struct sysfs_buffer * buffer;
struct sysfs_ops * ops = NULL; struct sysfs_ops * ops = NULL;
int error = 0; int error = 0;
...@@ -321,8 +321,8 @@ static int sysfs_open_file(struct inode * inode, struct file * filp) ...@@ -321,8 +321,8 @@ static int sysfs_open_file(struct inode * inode, struct file * filp)
static int sysfs_release(struct inode * inode, struct file * filp) static int sysfs_release(struct inode * inode, struct file * filp)
{ {
struct kobject * kobj = filp->f_dentry->d_parent->d_fsdata; struct kobject * kobj = to_kobj(filp->f_dentry->d_parent);
struct attribute * attr = filp->f_dentry->d_fsdata; struct attribute * attr = to_attr(filp->f_dentry);
struct sysfs_buffer * buffer = filp->private_data; struct sysfs_buffer * buffer = filp->private_data;
if (kobj) if (kobj)
......
...@@ -16,14 +16,30 @@ extern int sysfs_follow_link(struct dentry *, struct nameidata *); ...@@ -16,14 +16,30 @@ extern int sysfs_follow_link(struct dentry *, struct nameidata *);
extern void sysfs_put_link(struct dentry *, struct nameidata *); extern void sysfs_put_link(struct dentry *, struct nameidata *);
extern struct rw_semaphore sysfs_rename_sem; extern struct rw_semaphore sysfs_rename_sem;
static inline struct kobject * to_kobj(struct dentry * dentry)
{
return ((struct kobject *) dentry->d_fsdata);
}
static inline struct attribute * to_attr(struct dentry * dentry)
{
return ((struct attribute *) dentry->d_fsdata);
}
static inline struct bin_attribute * to_bin_attr(struct dentry * dentry)
{
return ((struct bin_attribute *) dentry->d_fsdata);
}
static inline struct kobject *sysfs_get_kobject(struct dentry *dentry) static inline struct kobject *sysfs_get_kobject(struct dentry *dentry)
{ {
struct kobject * kobj = NULL; struct kobject * kobj = NULL;
spin_lock(&dcache_lock); spin_lock(&dcache_lock);
if (!d_unhashed(dentry)) if (!d_unhashed(dentry))
kobj = kobject_get(dentry->d_fsdata); kobj = kobject_get(to_kobj(dentry));
spin_unlock(&dcache_lock); spin_unlock(&dcache_lock);
return kobj; return kobj;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment