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.
Unified · Split
| @@ -1662,7 +1662,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) · 1661 unmodified lines | ||
| 1662 | 1662 | |
| 1663 | 1663 | mutex_lock(&ftrace_regex_lock); |
| 1664 | 1664 | if ((file->f_mode & FMODE_WRITE) && |
| 1665 | − !(file->f_flags & O_APPEND)) | |
| 1665 | + (file->f_flags & O_TRUNC)) | |
| 1666 | 1666 | ftrace_filter_reset(enable); |
| 1667 | 1667 | |
| 1668 | 1668 | if (file->f_mode & FMODE_READ) { |
| @@ -2577,7 +2577,7 @@ ftrace_graph_open(struct inode *inode, struct file *file) · 908 unmodified lines | ||
| 2577 | 2577 | |
| 2578 | 2578 | mutex_lock(&graph_lock); |
| 2579 | 2579 | if ((file->f_mode & FMODE_WRITE) && |
| 2580 | − !(file->f_flags & O_APPEND)) { | |
| 2580 | + (file->f_flags & O_TRUNC)) { | |
| 2581 | 2581 | ftrace_graph_count = 0; |
| 2582 | 2582 | memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs)); |
| 2583 | 2583 | } |
| @@ -2031,7 +2031,7 @@ static int tracing_open(struct inode *inode, struct file *file) · 2030 unmodified lines | ||
| 2031 | 2031 | |
| 2032 | 2032 | /* If this file was open for write, then erase contents */ |
| 2033 | 2033 | if ((file->f_mode & FMODE_WRITE) && |
| 2034 | − !(file->f_flags & O_APPEND)) { | |
| 2034 | + (file->f_flags & O_TRUNC)) { | |
| 2035 | 2035 | long cpu = (long) inode->i_private; |
| 2036 | 2036 | |
| 2037 | 2037 | if (cpu == TRACE_PIPE_ALL_CPU) |
| @@ -376,7 +376,7 @@ ftrace_event_seq_open(struct inode *inode, struct file *file) · 375 unmodified lines | ||
| 376 | 376 | const struct seq_operations *seq_ops; |
| 377 | 377 | |
| 378 | 378 | if ((file->f_mode & FMODE_WRITE) && |
| 379 | − !(file->f_flags & O_APPEND)) | |
| 379 | + (file->f_flags & O_TRUNC)) | |
| 380 | 380 | ftrace_clear_events(); |
| 381 | 381 | |
| 382 | 382 | seq_ops = inode->i_private; |