diff options
Diffstat (limited to 'fs/proc')
-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, | |||
71 | count = min_t(size_t, PROC_BLOCK_SIZE, nbytes); | 71 | count = min_t(size_t, PROC_BLOCK_SIZE, nbytes); |
72 | 72 | ||
73 | start = NULL; | 73 | start = NULL; |
74 | if (dp->read_proc) { | 74 | if (!dp->read_proc) |
75 | /* | ||
76 | * How to be a proc read function | ||
77 | * ------------------------------ | ||
78 | * Prototype: | ||
79 | * int f(char *buffer, char **start, off_t offset, | ||
80 | * int count, int *peof, void *dat) | ||
81 | * | ||
82 | * Assume that the buffer is "count" bytes in size. | ||
83 | * | ||
84 | * If you know you have supplied all the data you | ||
85 | * have, set *peof. | ||
86 | * | ||
87 | * You have three ways to return data: | ||
88 | * 0) Leave *start = NULL. (This is the default.) | ||
89 | * Put the data of the requested offset at that | ||
90 | * offset within the buffer. Return the number (n) | ||
91 | * of bytes there are from the beginning of the | ||
92 | * buffer up to the last byte of data. If the | ||
93 | * number of supplied bytes (= n - offset) is | ||
94 | * greater than zero and you didn't signal eof | ||
95 | * and the reader is prepared to take more data | ||
96 | * you will be called again with the requested | ||
97 | * offset advanced by the number of bytes | ||
98 | * absorbed. This interface is useful for files | ||
99 | * no larger than the buffer. | ||
100 | * 1) Set *start = an unsigned long value less than | ||
101 | * the buffer address but greater than zero. | ||
102 | * Put the data of the requested offset at the | ||
103 | * beginning of the buffer. Return the number of | ||
104 | * bytes of data placed there. If this number is | ||
105 | * greater than zero and you didn't signal eof | ||
106 | * and the reader is prepared to take more data | ||
107 | * you will be called again with the requested | ||
108 | * offset advanced by *start. This interface is | ||
109 | * useful when you have a large file consisting | ||
110 | * of a series of blocks which you want to count | ||
111 | * and return as wholes. | ||
112 | * (Hack by Paul.Russell@rustcorp.com.au) | ||
113 | * 2) Set *start = an address within the buffer. | ||
114 | * Put the data of the requested offset at *start. | ||
115 | * Return the number of bytes of data placed there. | ||
116 | * If this number is greater than zero and you | ||
117 | * didn't signal eof and the reader is prepared to | ||
118 | * take more data you will be called again with the | ||
119 | * requested offset advanced by the number of bytes | ||
120 | * absorbed. | ||
121 | */ | ||
122 | n = dp->read_proc(page, &start, *ppos, | ||
123 | count, &eof, dp->data); | ||
124 | } else | ||
125 | break; | 75 | break; |
126 | 76 | ||
77 | /* How to be a proc read function | ||
78 | * ------------------------------ | ||
79 | * Prototype: | ||
80 | * int f(char *buffer, char **start, off_t offset, | ||
81 | * int count, int *peof, void *dat) | ||
82 | * | ||
83 | * Assume that the buffer is "count" bytes in size. | ||
84 | * | ||
85 | * If you know you have supplied all the data you have, set | ||
86 | * *peof. | ||
87 | * | ||
88 | * You have three ways to return data: | ||
89 | * | ||
90 | * 0) Leave *start = NULL. (This is the default.) Put the | ||
91 | * data of the requested offset at that offset within the | ||
92 | * buffer. Return the number (n) of bytes there are from | ||
93 | * the beginning of the buffer up to the last byte of data. | ||
94 | * If the number of supplied bytes (= n - offset) is greater | ||
95 | * than zero and you didn't signal eof and the reader is | ||
96 | * prepared to take more data you will be called again with | ||
97 | * the requested offset advanced by the number of bytes | ||
98 | * absorbed. This interface is useful for files no larger | ||
99 | * than the buffer. | ||
100 | * | ||
101 | * 1) Set *start = an unsigned long value less than the buffer | ||
102 | * address but greater than zero. Put the data of the | ||
103 | * requested offset at the beginning of the buffer. Return | ||
104 | * the number of bytes of data placed there. If this number | ||
105 | * is greater than zero and you didn't signal eof and the | ||
106 | * reader is prepared to take more data you will be called | ||
107 | * again with the requested offset advanced by *start. This | ||
108 | * interface is useful when you have a large file consisting | ||
109 | * of a series of blocks which you want to count and return | ||
110 | * as wholes. | ||
111 | * (Hack by Paul.Russell@rustcorp.com.au) | ||
112 | * | ||
113 | * 2) Set *start = an address within the buffer. Put the data | ||
114 | * of the requested offset at *start. Return the number of | ||
115 | * bytes of data placed there. If this number is greater | ||
116 | * than zero and you didn't signal eof and the reader is | ||
117 | * prepared to take more data you will be called again with | ||
118 | * the requested offset advanced by the number of bytes | ||
119 | * absorbed. | ||
120 | */ | ||
121 | n = dp->read_proc(page, &start, *ppos, count, &eof, dp->data); | ||
122 | |||
127 | if (n == 0) /* end of file */ | 123 | if (n == 0) /* end of file */ |
128 | break; | 124 | break; |
129 | if (n < 0) { /* error */ | 125 | if (n < 0) { /* error */ |