tracing: only truncate ftrace files when O_TRUNC is set
authorSteven Rostedt <srostedt@redhat.com>
Thu, 23 Jul 2009 03:29:30 +0000 (23:29 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 23 Jul 2009 14:07:18 +0000 (10:07 -0400)
The current code will truncate the ftrace files contents if O_APPEND
is not set and the file is opened in write mode. This is incorrect.
It should only truncate the file if O_TRUNC is set. Otherwise
if one of these files is opened by a C program with fopen "r+",
it will incorrectly truncate the file.

Reported-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ftrace.c
kernel/trace/trace.c
kernel/trace/trace_events.c

index 1f3ec2a..1e1d23c 100644 (file)
@@ -1662,7 +1662,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable)
 
        mutex_lock(&ftrace_regex_lock);
        if ((file->f_mode & FMODE_WRITE) &&
-           !(file->f_flags & O_APPEND))
+           (file->f_flags & O_TRUNC))
                ftrace_filter_reset(enable);
 
        if (file->f_mode & FMODE_READ) {
@@ -2577,7 +2577,7 @@ ftrace_graph_open(struct inode *inode, struct file *file)
 
        mutex_lock(&graph_lock);
        if ((file->f_mode & FMODE_WRITE) &&
-           !(file->f_flags & O_APPEND)) {
+           (file->f_flags & O_TRUNC)) {
                ftrace_graph_count = 0;
                memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs));
        }
index 8bc8d8a..d8ef285 100644 (file)
@@ -2031,7 +2031,7 @@ static int tracing_open(struct inode *inode, struct file *file)
 
        /* If this file was open for write, then erase contents */
        if ((file->f_mode & FMODE_WRITE) &&
-           !(file->f_flags & O_APPEND)) {
+           (file->f_flags & O_TRUNC)) {
                long cpu = (long) inode->i_private;
 
                if (cpu == TRACE_PIPE_ALL_CPU)
index 53c8fd3..23d2972 100644 (file)
@@ -376,7 +376,7 @@ ftrace_event_seq_open(struct inode *inode, struct file *file)
        const struct seq_operations *seq_ops;
 
        if ((file->f_mode & FMODE_WRITE) &&
-           !(file->f_flags & O_APPEND))
+           (file->f_flags & O_TRUNC))
                ftrace_clear_events();
 
        seq_ops = inode->i_private;