aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_events.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2013-07-26 13:25:43 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-29 12:47:33 -0400
commitb86d0ba62decb830aed2fa525e7557857d3199f2 (patch)
tree8c4a067276d1fd1801ebddf3a202d21945deccf0 /kernel/trace/trace_events.c
parent70c91fb9a74e7937ef76a542a86c1551d5df4281 (diff)
tracing: Change f_start() to take event_mutex and verify i_private != NULL
commit c5a44a1200c6eda2202434f25325e8ad19533fca upstream. trace_format_open() and trace_format_seq_ops are racy, nothing protects ftrace_event_call from trace_remove_event_call(). Change f_start() to take event_mutex and verify i_private != NULL, change f_stop() to drop this lock. This fixes nothing, but now we can change debugfs_remove("format") callers to nullify ->i_private and fix the the problem. Note: the usage of event_mutex is sub-optimal but simple, we can change this later. Link: http://lkml.kernel.org/r/20130726172543.GA3622@redhat.com Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r--kernel/trace/trace_events.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 285589354cb7..09782d623c93 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -838,7 +838,7 @@ enum {
838 838
839static void *f_next(struct seq_file *m, void *v, loff_t *pos) 839static void *f_next(struct seq_file *m, void *v, loff_t *pos)
840{ 840{
841 struct ftrace_event_call *call = m->private; 841 struct ftrace_event_call *call = event_file_data(m->private);
842 struct ftrace_event_field *field; 842 struct ftrace_event_field *field;
843 struct list_head *common_head = &ftrace_common_fields; 843 struct list_head *common_head = &ftrace_common_fields;
844 struct list_head *head = trace_get_fields(call); 844 struct list_head *head = trace_get_fields(call);
@@ -882,6 +882,11 @@ static void *f_start(struct seq_file *m, loff_t *pos)
882 loff_t l = 0; 882 loff_t l = 0;
883 void *p; 883 void *p;
884 884
885 /* ->stop() is called even if ->start() fails */
886 mutex_lock(&event_mutex);
887 if (!event_file_data(m->private))
888 return ERR_PTR(-ENODEV);
889
885 /* Start by showing the header */ 890 /* Start by showing the header */
886 if (!*pos) 891 if (!*pos)
887 return (void *)FORMAT_HEADER; 892 return (void *)FORMAT_HEADER;
@@ -896,7 +901,7 @@ static void *f_start(struct seq_file *m, loff_t *pos)
896 901
897static int f_show(struct seq_file *m, void *v) 902static int f_show(struct seq_file *m, void *v)
898{ 903{
899 struct ftrace_event_call *call = m->private; 904 struct ftrace_event_call *call = event_file_data(m->private);
900 struct ftrace_event_field *field; 905 struct ftrace_event_field *field;
901 const char *array_descriptor; 906 const char *array_descriptor;
902 907
@@ -947,6 +952,7 @@ static int f_show(struct seq_file *m, void *v)
947 952
948static void f_stop(struct seq_file *m, void *p) 953static void f_stop(struct seq_file *m, void *p)
949{ 954{
955 mutex_unlock(&event_mutex);
950} 956}
951 957
952static const struct seq_operations trace_format_seq_ops = { 958static const struct seq_operations trace_format_seq_ops = {
@@ -958,7 +964,6 @@ static const struct seq_operations trace_format_seq_ops = {
958 964
959static int trace_format_open(struct inode *inode, struct file *file) 965static int trace_format_open(struct inode *inode, struct file *file)
960{ 966{
961 struct ftrace_event_call *call = inode->i_private;
962 struct seq_file *m; 967 struct seq_file *m;
963 int ret; 968 int ret;
964 969
@@ -967,7 +972,7 @@ static int trace_format_open(struct inode *inode, struct file *file)
967 return ret; 972 return ret;
968 973
969 m = file->private_data; 974 m = file->private_data;
970 m->private = call; 975 m->private = file;
971 976
972 return 0; 977 return 0;
973} 978}