diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/seq_file.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/seq_file.c b/fs/seq_file.c index e8e51db4989d..bbb19be260ce 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c | |||
@@ -177,21 +177,23 @@ EXPORT_SYMBOL(seq_read); | |||
177 | 177 | ||
178 | static int traverse(struct seq_file *m, loff_t offset) | 178 | static int traverse(struct seq_file *m, loff_t offset) |
179 | { | 179 | { |
180 | loff_t pos = 0; | 180 | loff_t pos = 0, index; |
181 | int error = 0; | 181 | int error = 0; |
182 | void *p; | 182 | void *p; |
183 | 183 | ||
184 | m->version = 0; | 184 | m->version = 0; |
185 | m->index = 0; | 185 | index = 0; |
186 | m->count = m->from = 0; | 186 | m->count = m->from = 0; |
187 | if (!offset) | 187 | if (!offset) { |
188 | m->index = index; | ||
188 | return 0; | 189 | return 0; |
190 | } | ||
189 | if (!m->buf) { | 191 | if (!m->buf) { |
190 | m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); | 192 | m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); |
191 | if (!m->buf) | 193 | if (!m->buf) |
192 | return -ENOMEM; | 194 | return -ENOMEM; |
193 | } | 195 | } |
194 | p = m->op->start(m, &m->index); | 196 | p = m->op->start(m, &index); |
195 | while (p) { | 197 | while (p) { |
196 | error = PTR_ERR(p); | 198 | error = PTR_ERR(p); |
197 | if (IS_ERR(p)) | 199 | if (IS_ERR(p)) |
@@ -204,15 +206,17 @@ static int traverse(struct seq_file *m, loff_t offset) | |||
204 | if (pos + m->count > offset) { | 206 | if (pos + m->count > offset) { |
205 | m->from = offset - pos; | 207 | m->from = offset - pos; |
206 | m->count -= m->from; | 208 | m->count -= m->from; |
209 | m->index = index; | ||
207 | break; | 210 | break; |
208 | } | 211 | } |
209 | pos += m->count; | 212 | pos += m->count; |
210 | m->count = 0; | 213 | m->count = 0; |
211 | if (pos == offset) { | 214 | if (pos == offset) { |
212 | m->index++; | 215 | index++; |
216 | m->index = index; | ||
213 | break; | 217 | break; |
214 | } | 218 | } |
215 | p = m->op->next(m, p, &m->index); | 219 | p = m->op->next(m, p, &index); |
216 | } | 220 | } |
217 | m->op->stop(m, p); | 221 | m->op->stop(m, p); |
218 | return error; | 222 | return error; |