aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/file.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-04-07 18:35:01 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-19 22:10:29 -0400
commit2424b5dd062cbe3e0578ae7b11a1b360ad22f451 (patch)
tree75b6d67412969074237a371947280b419c5d43db /fs/sysfs/file.c
parentb844eba292b477cda14582bfc6f535deed57a82d (diff)
sysfs: refill attribute buffer when reading from offset 0
Requiring userspace to close and re-open sysfs attributes has been the policy since before 2.6.12. It allows userspace to get a consistent snapshot of kernel state and consume it with incremental reads and seeks. Now, if the file position is zero the kernel assumes userspace wants to see the new value. The application for this change is to allow a userspace RAID metadata handler to check the state of an array without causing any memory allocations. Thus not causing writeback to a raid array that might be blocked waiting for userspace to take action. Cc: Neil Brown <neilb@suse.de> Acked-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/file.c')
-rw-r--r--fs/sysfs/file.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index a859c32ff93a..ade9a7e6a757 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -129,7 +129,7 @@ sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos)
129 ssize_t retval = 0; 129 ssize_t retval = 0;
130 130
131 mutex_lock(&buffer->mutex); 131 mutex_lock(&buffer->mutex);
132 if (buffer->needs_read_fill) { 132 if (buffer->needs_read_fill || *ppos == 0) {
133 retval = fill_read_buffer(file->f_path.dentry,buffer); 133 retval = fill_read_buffer(file->f_path.dentry,buffer);
134 if (retval) 134 if (retval)
135 goto out; 135 goto out;
@@ -410,8 +410,7 @@ static int sysfs_release(struct inode *inode, struct file *filp)
410 * return POLLERR|POLLPRI, and select will return the fd whether 410 * return POLLERR|POLLPRI, and select will return the fd whether
411 * it is waiting for read, write, or exceptions. 411 * it is waiting for read, write, or exceptions.
412 * Once poll/select indicates that the value has changed, you 412 * Once poll/select indicates that the value has changed, you
413 * need to close and re-open the file, as simply seeking and reading 413 * need to close and re-open the file, or seek to 0 and read again.
414 * again will not get new data, or reset the state of 'poll'.
415 * Reminder: this only works for attributes which actively support 414 * Reminder: this only works for attributes which actively support
416 * it, and it is not possible to test an attribute from userspace 415 * it, and it is not possible to test an attribute from userspace
417 * to see if it supports poll (Neither 'poll' nor 'select' return 416 * to see if it supports poll (Neither 'poll' nor 'select' return