tracing_bprintk: Don't increment @pos in t_start()
authorLi Zefan <lizf@cn.fujitsu.com>
Wed, 24 Jun 2009 01:52:58 +0000 (09:52 +0800)
committerIngo Molnar <mingo@elte.hu>
Wed, 24 Jun 2009 09:02:50 +0000 (11:02 +0200)
It's wrong to increment @pos in t_start(), otherwise we'll lose
some entries when reading printk_formats, if the output is larger
than PAGE_SIZE.

Reported-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Reviewed-by: Liming Wang <liming.wang@windriver.com>
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <4A4186FA.1020106@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/trace/trace_printk.c

index 9bece9687b62a8d2ab6b59199017ef0ad7898b98..7b627811082736e6cdb973b21f6f6ca5b623954f 100644 (file)
@@ -155,25 +155,19 @@ int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap)
 EXPORT_SYMBOL_GPL(__ftrace_vprintk);
 
 static void *
-t_next(struct seq_file *m, void *v, loff_t *pos)
+t_start(struct seq_file *m, loff_t *pos)
 {
-       const char **fmt = m->private;
-       const char **next = fmt;
-
-       (*pos)++;
+       const char **fmt = __start___trace_bprintk_fmt + *pos;
 
        if ((unsigned long)fmt >= (unsigned long)__stop___trace_bprintk_fmt)
                return NULL;
-
-       next = fmt;
-       m->private = ++next;
-
        return fmt;
 }
 
-static void *t_start(struct seq_file *m, loff_t *pos)
+static void *t_next(struct seq_file *m, void * v, loff_t *pos)
 {
-       return t_next(m, NULL, pos);
+       (*pos)++;
+       return t_start(m, pos);
 }
 
 static int t_show(struct seq_file *m, void *v)
@@ -224,15 +218,7 @@ static const struct seq_operations show_format_seq_ops = {
 static int
 ftrace_formats_open(struct inode *inode, struct file *file)
 {
-       int ret;
-
-       ret = seq_open(file, &show_format_seq_ops);
-       if (!ret) {
-               struct seq_file *m = file->private_data;
-
-               m->private = __start___trace_bprintk_fmt;
-       }
-       return ret;
+       return seq_open(file, &show_format_seq_ops);
 }
 
 static const struct file_operations ftrace_formats_fops = {