diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 368a4d50cc30..f919a2e21bf3 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -989,7 +989,7 @@ static ssize_t | |||
989 | event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, | 989 | event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, |
990 | loff_t *ppos) | 990 | loff_t *ppos) |
991 | { | 991 | { |
992 | struct ftrace_event_call *call; | 992 | struct ftrace_event_file *file; |
993 | struct trace_seq *s; | 993 | struct trace_seq *s; |
994 | int r = -ENODEV; | 994 | int r = -ENODEV; |
995 | 995 | ||
@@ -1004,12 +1004,12 @@ event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, | |||
1004 | trace_seq_init(s); | 1004 | trace_seq_init(s); |
1005 | 1005 | ||
1006 | mutex_lock(&event_mutex); | 1006 | mutex_lock(&event_mutex); |
1007 | call = event_file_data(filp); | 1007 | file = event_file_data(filp); |
1008 | if (call) | 1008 | if (file) |
1009 | print_event_filter(call, s); | 1009 | print_event_filter(file, s); |
1010 | mutex_unlock(&event_mutex); | 1010 | mutex_unlock(&event_mutex); |
1011 | 1011 | ||
1012 | if (call) | 1012 | if (file) |
1013 | r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); | 1013 | r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); |
1014 | 1014 | ||
1015 | kfree(s); | 1015 | kfree(s); |
@@ -1021,7 +1021,7 @@ static ssize_t | |||
1021 | event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, | 1021 | event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, |
1022 | loff_t *ppos) | 1022 | loff_t *ppos) |
1023 | { | 1023 | { |
1024 | struct ftrace_event_call *call; | 1024 | struct ftrace_event_file *file; |
1025 | char *buf; | 1025 | char *buf; |
1026 | int err = -ENODEV; | 1026 | int err = -ENODEV; |
1027 | 1027 | ||
@@ -1039,9 +1039,9 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
1039 | buf[cnt] = '\0'; | 1039 | buf[cnt] = '\0'; |
1040 | 1040 | ||
1041 | mutex_lock(&event_mutex); | 1041 | mutex_lock(&event_mutex); |
1042 | call = event_file_data(filp); | 1042 | file = event_file_data(filp); |
1043 | if (call) | 1043 | if (file) |
1044 | err = apply_event_filter(call, buf); | 1044 | err = apply_event_filter(file, buf); |
1045 | mutex_unlock(&event_mutex); | 1045 | mutex_unlock(&event_mutex); |
1046 | 1046 | ||
1047 | free_page((unsigned long) buf); | 1047 | free_page((unsigned long) buf); |
@@ -1062,6 +1062,9 @@ static int subsystem_open(struct inode *inode, struct file *filp) | |||
1062 | struct trace_array *tr; | 1062 | struct trace_array *tr; |
1063 | int ret; | 1063 | int ret; |
1064 | 1064 | ||
1065 | if (tracing_is_disabled()) | ||
1066 | return -ENODEV; | ||
1067 | |||
1065 | /* Make sure the system still exists */ | 1068 | /* Make sure the system still exists */ |
1066 | mutex_lock(&trace_types_lock); | 1069 | mutex_lock(&trace_types_lock); |
1067 | mutex_lock(&event_mutex); | 1070 | mutex_lock(&event_mutex); |
@@ -1108,6 +1111,9 @@ static int system_tr_open(struct inode *inode, struct file *filp) | |||
1108 | struct trace_array *tr = inode->i_private; | 1111 | struct trace_array *tr = inode->i_private; |
1109 | int ret; | 1112 | int ret; |
1110 | 1113 | ||
1114 | if (tracing_is_disabled()) | ||
1115 | return -ENODEV; | ||
1116 | |||
1111 | if (trace_array_get(tr) < 0) | 1117 | if (trace_array_get(tr) < 0) |
1112 | return -ENODEV; | 1118 | return -ENODEV; |
1113 | 1119 | ||
@@ -1124,11 +1130,12 @@ static int system_tr_open(struct inode *inode, struct file *filp) | |||
1124 | if (ret < 0) { | 1130 | if (ret < 0) { |
1125 | trace_array_put(tr); | 1131 | trace_array_put(tr); |
1126 | kfree(dir); | 1132 | kfree(dir); |
1133 | return ret; | ||
1127 | } | 1134 | } |
1128 | 1135 | ||
1129 | filp->private_data = dir; | 1136 | filp->private_data = dir; |
1130 | 1137 | ||
1131 | return ret; | 1138 | return 0; |
1132 | } | 1139 | } |
1133 | 1140 | ||
1134 | static int subsystem_release(struct inode *inode, struct file *file) | 1141 | static int subsystem_release(struct inode *inode, struct file *file) |
@@ -1539,7 +1546,7 @@ event_create_dir(struct dentry *parent, struct ftrace_event_file *file) | |||
1539 | return -1; | 1546 | return -1; |
1540 | } | 1547 | } |
1541 | } | 1548 | } |
1542 | trace_create_file("filter", 0644, file->dir, call, | 1549 | trace_create_file("filter", 0644, file->dir, file, |
1543 | &ftrace_event_filter_fops); | 1550 | &ftrace_event_filter_fops); |
1544 | 1551 | ||
1545 | trace_create_file("format", 0444, file->dir, call, | 1552 | trace_create_file("format", 0444, file->dir, call, |
@@ -1577,6 +1584,7 @@ static void event_remove(struct ftrace_event_call *call) | |||
1577 | if (file->event_call != call) | 1584 | if (file->event_call != call) |
1578 | continue; | 1585 | continue; |
1579 | ftrace_event_enable_disable(file, 0); | 1586 | ftrace_event_enable_disable(file, 0); |
1587 | destroy_preds(file); | ||
1580 | /* | 1588 | /* |
1581 | * The do_for_each_event_file() is | 1589 | * The do_for_each_event_file() is |
1582 | * a double loop. After finding the call for this | 1590 | * a double loop. After finding the call for this |
@@ -1700,7 +1708,7 @@ static void __trace_remove_event_call(struct ftrace_event_call *call) | |||
1700 | { | 1708 | { |
1701 | event_remove(call); | 1709 | event_remove(call); |
1702 | trace_destroy_fields(call); | 1710 | trace_destroy_fields(call); |
1703 | destroy_preds(call); | 1711 | destroy_call_preds(call); |
1704 | } | 1712 | } |
1705 | 1713 | ||
1706 | static int probe_remove_event_call(struct ftrace_event_call *call) | 1714 | static int probe_remove_event_call(struct ftrace_event_call *call) |