Messages in this thread | | | Date | Tue, 08 Dec 2009 18:03:46 +0800 | From | Li Zefan <> | Subject | Re: [PATCH 05/13] ftrace: Call trace_parser_clear() properly |
| |
Frederic Weisbecker wrote: > On Tue, Dec 08, 2009 at 11:15:30AM +0800, Li Zefan wrote: >> I found a weird behavior: >> >> # echo 'fuse:*' > set_ftrace_filter >> bash: echo: write error: Invalid argument >> # cat set_ftrace_filter >> fuse_dev_fasync >> fuse_dev_poll >> fuse_copy_do >> >> We should call trace_parser_clear() no matter ftrace_process_regex() >> returns 0 or -errno. >> >> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> >> --- >> kernel/trace/ftrace.c | 3 +-- >> 1 files changed, 1 insertions(+), 2 deletions(-) >> >> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c >> index 08a3fb5..ff8aecd 100644 >> --- a/kernel/trace/ftrace.c >> +++ b/kernel/trace/ftrace.c >> @@ -2208,10 +2208,9 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, >> !trace_parser_cont(parser)) { >> ret = ftrace_process_regex(parser->buffer, >> parser->idx, enable); >> + trace_parser_clear(parser); >> if (ret) >> goto out_unlock; >> - >> - trace_parser_clear(parser); >> } > > > I'm missing something. How that can happen. Anytime we reopen > the file, the parser is re-allocated. >
It happened at file closing..
static int ftrace_regex_release(struct inode *inode, struct file *file, int enable) { ... parser = &iter->parser; if (trace_parser_loaded(parser)) { parser->buffer[parser->idx] = 0; /* here ! */ ftrace_match_records(parser->buffer, parser->idx, enable); } ... }
> I guess that happens if you open in rw mode? But not using the > example in the changelog?
I've confirmed that example I was using can reveal this bug.
| |