diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/proc/generic.c | 98 |
1 files changed, 47 insertions, 51 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 5453f1c0b70c..a6a1cb5d589d 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -71,59 +71,55 @@ __proc_file_read(struct file *file, char __user *buf, size_t nbytes, count = min_t(size_t, PROC_BLOCK_SIZE, nbytes); start = NULL; - if (dp->read_proc) { - /* - * How to be a proc read function - * ------------------------------ - * Prototype: - * int f(char *buffer, char **start, off_t offset, - * int count, int *peof, void *dat) - * - * Assume that the buffer is "count" bytes in size. - * - * If you know you have supplied all the data you - * have, set *peof. - * - * You have three ways to return data: - * 0) Leave *start = NULL. (This is the default.) - * Put the data of the requested offset at that - * offset within the buffer. Return the number (n) - * of bytes there are from the beginning of the - * buffer up to the last byte of data. If the - * number of supplied bytes (= n - offset) is - * greater than zero and you didn't signal eof - * and the reader is prepared to take more data - * you will be called again with the requested - * offset advanced by the number of bytes - * absorbed. This interface is useful for files - * no larger than the buffer. - * 1) Set *start = an unsigned long value less than - * the buffer address but greater than zero. - * Put the data of the requested offset at the - * beginning of the buffer. Return the number of - * bytes of data placed there. If this number is - * greater than zero and you didn't signal eof - * and the reader is prepared to take more data - * you will be called again with the requested - * offset advanced by *start. This interface is - * useful when you have a large file consisting - * of a series of blocks which you want to count - * and return as wholes. - * (Hack by Paul.Russell@rustcorp.com.au) - * 2) Set *start = an address within the buffer. - * Put the data of the requested offset at *start. - * Return the number of bytes of data placed there. - * If this number is greater than zero and you - * didn't signal eof and the reader is prepared to - * take more data you will be called again with the - * requested offset advanced by the number of bytes - * absorbed. - */ - n = dp->read_proc(page, &start, *ppos, - count, &eof, dp->data); - } else + if (!dp->read_proc) break; + /* How to be a proc read function + * ------------------------------ + * Prototype: + * int f(char *buffer, char **start, off_t offset, + * int count, int *peof, void *dat) + * + * Assume that the buffer is "count" bytes in size. + * + * If you know you have supplied all the data you have, set + * *peof. + * + * You have three ways to return data: + * + * 0) Leave *start = NULL. (This is the default.) Put the + * data of the requested offset at that offset within the + * buffer. Return the number (n) of bytes there are from + * the beginning of the buffer up to the last byte of data. + * If the number of supplied bytes (= n - offset) is greater + * than zero and you didn't signal eof and the reader is + * prepared to take more data you will be called again with + * the requested offset advanced by the number of bytes + * absorbed. This interface is useful for files no larger + * than the buffer. + * + * 1) Set *start = an unsigned long value less than the buffer + * address but greater than zero. Put the data of the + * requested offset at the beginning of the buffer. Return + * the number of bytes of data placed there. If this number + * is greater than zero and you didn't signal eof and the + * reader is prepared to take more data you will be called + * again with the requested offset advanced by *start. This + * interface is useful when you have a large file consisting + * of a series of blocks which you want to count and return + * as wholes. + * (Hack by Paul.Russell@rustcorp.com.au) + * + * 2) Set *start = an address within the buffer. Put the data + * of the requested offset at *start. Return the number of + * bytes of data placed there. If this number is greater + * than zero and you didn't signal eof and the reader is + * prepared to take more data you will be called again with + * the requested offset advanced by the number of bytes + * absorbed. + */ + n = dp->read_proc(page, &start, *ppos, count, &eof, dp->data); + if (n == 0) /* end of file */ break; if (n < 0) { /* error */ |