diff options
-rw-r--r-- | Documentation/filesystems/sysfs.txt | 9 | ||||
-rw-r--r-- | fs/sysfs/file.c | 5 |
2 files changed, 9 insertions, 5 deletions
diff --git a/Documentation/filesystems/sysfs.txt b/Documentation/filesystems/sysfs.txt index 4598ef7b622b..7f27b8f840d0 100644 --- a/Documentation/filesystems/sysfs.txt +++ b/Documentation/filesystems/sysfs.txt | |||
@@ -176,8 +176,10 @@ implementations: | |||
176 | Recall that an attribute should only be exporting one value, or an | 176 | Recall that an attribute should only be exporting one value, or an |
177 | array of similar values, so this shouldn't be that expensive. | 177 | array of similar values, so this shouldn't be that expensive. |
178 | 178 | ||
179 | This allows userspace to do partial reads and seeks arbitrarily over | 179 | This allows userspace to do partial reads and forward seeks |
180 | the entire file at will. | 180 | arbitrarily over the entire file at will. If userspace seeks back to |
181 | zero or does a pread(2) with an offset of '0' the show() method will | ||
182 | be called again, rearmed, to fill the buffer. | ||
181 | 183 | ||
182 | - On write(2), sysfs expects the entire buffer to be passed during the | 184 | - On write(2), sysfs expects the entire buffer to be passed during the |
183 | first write. Sysfs then passes the entire buffer to the store() | 185 | first write. Sysfs then passes the entire buffer to the store() |
@@ -192,6 +194,9 @@ implementations: | |||
192 | 194 | ||
193 | Other notes: | 195 | Other notes: |
194 | 196 | ||
197 | - Writing causes the show() method to be rearmed regardless of current | ||
198 | file position. | ||
199 | |||
195 | - The buffer will always be PAGE_SIZE bytes in length. On i386, this | 200 | - The buffer will always be PAGE_SIZE bytes in length. On i386, this |
196 | is 4096. | 201 | is 4096. |
197 | 202 | ||
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 |