fs: fix bug about seq_read read nothing
PATCH 1/1 fs: fix bug about seq_read read nothing
When i used seq_file to read a proc file, i got a bug of seq_read. If show() skip the first element or the size of first element is 0, and the size of second element is larger than the seq_file->size at the same time, seq_read will return 0, so nothing can be read from the proc file.
So, if seq_read will return because it finds the element is biger than the m->buf, it must make sure either some date was filled to m->buf by show(), or some data was flushed to the user buf before, if not,it should increase the m->buf until it can read this element.
Signed-off-by Bian Naimeng <[email protected]>
--- fs/seq_file.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
fs/seq_file.c +11 -1
@@ -107,6 +107,7 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)if (!size) goto Done; } +First_record:/* we need at least one record in buffer */ while (1 ) { pos = m->index;
@@ -145,8 +146,17 @@ Fill: err = m->op->show (m, p);if (m->count == m->size || err) { m->count = offs; -if (likely (err <=0 )) +if (err <0 )break ; +/* If no data flush to the user buf and nothing was read +* by show() before,it should increase the m->buf until +* it can read this element. +*/ +if (err ==0 && m->count ==0 && copied ==0 ) { + m->index = next; + m->op->stop (m, p); + goto First_record; + } } pos = next; }
Signature · 1 line
1.5.4.rc3