diff options
-rw-r--r-- | kernel/trace/ftrace.c | 7 | ||||
-rw-r--r-- | kernel/trace/trace.c | 117 | ||||
-rw-r--r-- | kernel/trace/trace.h | 1 | ||||
-rw-r--r-- | kernel/trace/trace_dynevent.c | 4 | ||||
-rw-r--r-- | kernel/trace/trace_events.c | 10 | ||||
-rw-r--r-- | kernel/trace/trace_events_hist.c | 2 |
6 files changed, 81 insertions, 60 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 32c2eb167de0..8b765a55e01c 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -3547,7 +3547,7 @@ ftrace_regex_open(struct ftrace_ops *ops, int flag, | |||
3547 | if (unlikely(ftrace_disabled)) | 3547 | if (unlikely(ftrace_disabled)) |
3548 | return -ENODEV; | 3548 | return -ENODEV; |
3549 | 3549 | ||
3550 | if (tr && trace_array_get(tr) < 0) | 3550 | if (tracing_check_open_get_tr(tr)) |
3551 | return -ENODEV; | 3551 | return -ENODEV; |
3552 | 3552 | ||
3553 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); | 3553 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); |
@@ -6546,8 +6546,9 @@ ftrace_pid_open(struct inode *inode, struct file *file) | |||
6546 | struct seq_file *m; | 6546 | struct seq_file *m; |
6547 | int ret = 0; | 6547 | int ret = 0; |
6548 | 6548 | ||
6549 | if (trace_array_get(tr) < 0) | 6549 | ret = tracing_check_open_get_tr(tr); |
6550 | return -ENODEV; | 6550 | if (ret) |
6551 | return ret; | ||
6551 | 6552 | ||
6552 | if ((file->f_mode & FMODE_WRITE) && | 6553 | if ((file->f_mode & FMODE_WRITE) && |
6553 | (file->f_flags & O_TRUNC)) | 6554 | (file->f_flags & O_TRUNC)) |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 94f1b9124939..26ee280f852b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -304,6 +304,17 @@ void trace_array_put(struct trace_array *this_tr) | |||
304 | mutex_unlock(&trace_types_lock); | 304 | mutex_unlock(&trace_types_lock); |
305 | } | 305 | } |
306 | 306 | ||
307 | int tracing_check_open_get_tr(struct trace_array *tr) | ||
308 | { | ||
309 | if (tracing_disabled) | ||
310 | return -ENODEV; | ||
311 | |||
312 | if (tr && trace_array_get(tr) < 0) | ||
313 | return -ENODEV; | ||
314 | |||
315 | return 0; | ||
316 | } | ||
317 | |||
307 | int call_filter_check_discard(struct trace_event_call *call, void *rec, | 318 | int call_filter_check_discard(struct trace_event_call *call, void *rec, |
308 | struct ring_buffer *buffer, | 319 | struct ring_buffer *buffer, |
309 | struct ring_buffer_event *event) | 320 | struct ring_buffer_event *event) |
@@ -4140,8 +4151,11 @@ release: | |||
4140 | 4151 | ||
4141 | int tracing_open_generic(struct inode *inode, struct file *filp) | 4152 | int tracing_open_generic(struct inode *inode, struct file *filp) |
4142 | { | 4153 | { |
4143 | if (tracing_disabled) | 4154 | int ret; |
4144 | return -ENODEV; | 4155 | |
4156 | ret = tracing_check_open_get_tr(NULL); | ||
4157 | if (ret) | ||
4158 | return ret; | ||
4145 | 4159 | ||
4146 | filp->private_data = inode->i_private; | 4160 | filp->private_data = inode->i_private; |
4147 | return 0; | 4161 | return 0; |
@@ -4159,12 +4173,11 @@ bool tracing_is_disabled(void) | |||
4159 | int tracing_open_generic_tr(struct inode *inode, struct file *filp) | 4173 | int tracing_open_generic_tr(struct inode *inode, struct file *filp) |
4160 | { | 4174 | { |
4161 | struct trace_array *tr = inode->i_private; | 4175 | struct trace_array *tr = inode->i_private; |
4176 | int ret; | ||
4162 | 4177 | ||
4163 | if (tracing_disabled) | 4178 | ret = tracing_check_open_get_tr(tr); |
4164 | return -ENODEV; | 4179 | if (ret) |
4165 | 4180 | return ret; | |
4166 | if (trace_array_get(tr) < 0) | ||
4167 | return -ENODEV; | ||
4168 | 4181 | ||
4169 | filp->private_data = inode->i_private; | 4182 | filp->private_data = inode->i_private; |
4170 | 4183 | ||
@@ -4233,10 +4246,11 @@ static int tracing_open(struct inode *inode, struct file *file) | |||
4233 | { | 4246 | { |
4234 | struct trace_array *tr = inode->i_private; | 4247 | struct trace_array *tr = inode->i_private; |
4235 | struct trace_iterator *iter; | 4248 | struct trace_iterator *iter; |
4236 | int ret = 0; | 4249 | int ret; |
4237 | 4250 | ||
4238 | if (trace_array_get(tr) < 0) | 4251 | ret = tracing_check_open_get_tr(tr); |
4239 | return -ENODEV; | 4252 | if (ret) |
4253 | return ret; | ||
4240 | 4254 | ||
4241 | /* If this file was open for write, then erase contents */ | 4255 | /* If this file was open for write, then erase contents */ |
4242 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { | 4256 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { |
@@ -4352,11 +4366,9 @@ static int show_traces_open(struct inode *inode, struct file *file) | |||
4352 | struct seq_file *m; | 4366 | struct seq_file *m; |
4353 | int ret; | 4367 | int ret; |
4354 | 4368 | ||
4355 | if (tracing_disabled) | 4369 | ret = tracing_check_open_get_tr(tr); |
4356 | return -ENODEV; | 4370 | if (ret) |
4357 | 4371 | return ret; | |
4358 | if (trace_array_get(tr) < 0) | ||
4359 | return -ENODEV; | ||
4360 | 4372 | ||
4361 | ret = seq_open(file, &show_traces_seq_ops); | 4373 | ret = seq_open(file, &show_traces_seq_ops); |
4362 | if (ret) { | 4374 | if (ret) { |
@@ -4710,11 +4722,9 @@ static int tracing_trace_options_open(struct inode *inode, struct file *file) | |||
4710 | struct trace_array *tr = inode->i_private; | 4722 | struct trace_array *tr = inode->i_private; |
4711 | int ret; | 4723 | int ret; |
4712 | 4724 | ||
4713 | if (tracing_disabled) | 4725 | ret = tracing_check_open_get_tr(tr); |
4714 | return -ENODEV; | 4726 | if (ret) |
4715 | 4727 | return ret; | |
4716 | if (trace_array_get(tr) < 0) | ||
4717 | return -ENODEV; | ||
4718 | 4728 | ||
4719 | ret = single_open(file, tracing_trace_options_show, inode->i_private); | 4729 | ret = single_open(file, tracing_trace_options_show, inode->i_private); |
4720 | if (ret < 0) | 4730 | if (ret < 0) |
@@ -5051,8 +5061,11 @@ static const struct seq_operations tracing_saved_tgids_seq_ops = { | |||
5051 | 5061 | ||
5052 | static int tracing_saved_tgids_open(struct inode *inode, struct file *filp) | 5062 | static int tracing_saved_tgids_open(struct inode *inode, struct file *filp) |
5053 | { | 5063 | { |
5054 | if (tracing_disabled) | 5064 | int ret; |
5055 | return -ENODEV; | 5065 | |
5066 | ret = tracing_check_open_get_tr(NULL); | ||
5067 | if (ret) | ||
5068 | return ret; | ||
5056 | 5069 | ||
5057 | return seq_open(filp, &tracing_saved_tgids_seq_ops); | 5070 | return seq_open(filp, &tracing_saved_tgids_seq_ops); |
5058 | } | 5071 | } |
@@ -5128,8 +5141,11 @@ static const struct seq_operations tracing_saved_cmdlines_seq_ops = { | |||
5128 | 5141 | ||
5129 | static int tracing_saved_cmdlines_open(struct inode *inode, struct file *filp) | 5142 | static int tracing_saved_cmdlines_open(struct inode *inode, struct file *filp) |
5130 | { | 5143 | { |
5131 | if (tracing_disabled) | 5144 | int ret; |
5132 | return -ENODEV; | 5145 | |
5146 | ret = tracing_check_open_get_tr(NULL); | ||
5147 | if (ret) | ||
5148 | return ret; | ||
5133 | 5149 | ||
5134 | return seq_open(filp, &tracing_saved_cmdlines_seq_ops); | 5150 | return seq_open(filp, &tracing_saved_cmdlines_seq_ops); |
5135 | } | 5151 | } |
@@ -5293,8 +5309,11 @@ static const struct seq_operations tracing_eval_map_seq_ops = { | |||
5293 | 5309 | ||
5294 | static int tracing_eval_map_open(struct inode *inode, struct file *filp) | 5310 | static int tracing_eval_map_open(struct inode *inode, struct file *filp) |
5295 | { | 5311 | { |
5296 | if (tracing_disabled) | 5312 | int ret; |
5297 | return -ENODEV; | 5313 | |
5314 | ret = tracing_check_open_get_tr(NULL); | ||
5315 | if (ret) | ||
5316 | return ret; | ||
5298 | 5317 | ||
5299 | return seq_open(filp, &tracing_eval_map_seq_ops); | 5318 | return seq_open(filp, &tracing_eval_map_seq_ops); |
5300 | } | 5319 | } |
@@ -5817,13 +5836,11 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp) | |||
5817 | { | 5836 | { |
5818 | struct trace_array *tr = inode->i_private; | 5837 | struct trace_array *tr = inode->i_private; |
5819 | struct trace_iterator *iter; | 5838 | struct trace_iterator *iter; |
5820 | int ret = 0; | 5839 | int ret; |
5821 | |||
5822 | if (tracing_disabled) | ||
5823 | return -ENODEV; | ||
5824 | 5840 | ||
5825 | if (trace_array_get(tr) < 0) | 5841 | ret = tracing_check_open_get_tr(tr); |
5826 | return -ENODEV; | 5842 | if (ret) |
5843 | return ret; | ||
5827 | 5844 | ||
5828 | mutex_lock(&trace_types_lock); | 5845 | mutex_lock(&trace_types_lock); |
5829 | 5846 | ||
@@ -6560,11 +6577,9 @@ static int tracing_clock_open(struct inode *inode, struct file *file) | |||
6560 | struct trace_array *tr = inode->i_private; | 6577 | struct trace_array *tr = inode->i_private; |
6561 | int ret; | 6578 | int ret; |
6562 | 6579 | ||
6563 | if (tracing_disabled) | 6580 | ret = tracing_check_open_get_tr(tr); |
6564 | return -ENODEV; | 6581 | if (ret) |
6565 | 6582 | return ret; | |
6566 | if (trace_array_get(tr)) | ||
6567 | return -ENODEV; | ||
6568 | 6583 | ||
6569 | ret = single_open(file, tracing_clock_show, inode->i_private); | 6584 | ret = single_open(file, tracing_clock_show, inode->i_private); |
6570 | if (ret < 0) | 6585 | if (ret < 0) |
@@ -6594,11 +6609,9 @@ static int tracing_time_stamp_mode_open(struct inode *inode, struct file *file) | |||
6594 | struct trace_array *tr = inode->i_private; | 6609 | struct trace_array *tr = inode->i_private; |
6595 | int ret; | 6610 | int ret; |
6596 | 6611 | ||
6597 | if (tracing_disabled) | 6612 | ret = tracing_check_open_get_tr(tr); |
6598 | return -ENODEV; | 6613 | if (ret) |
6599 | 6614 | return ret; | |
6600 | if (trace_array_get(tr)) | ||
6601 | return -ENODEV; | ||
6602 | 6615 | ||
6603 | ret = single_open(file, tracing_time_stamp_mode_show, inode->i_private); | 6616 | ret = single_open(file, tracing_time_stamp_mode_show, inode->i_private); |
6604 | if (ret < 0) | 6617 | if (ret < 0) |
@@ -6651,10 +6664,11 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file) | |||
6651 | struct trace_array *tr = inode->i_private; | 6664 | struct trace_array *tr = inode->i_private; |
6652 | struct trace_iterator *iter; | 6665 | struct trace_iterator *iter; |
6653 | struct seq_file *m; | 6666 | struct seq_file *m; |
6654 | int ret = 0; | 6667 | int ret; |
6655 | 6668 | ||
6656 | if (trace_array_get(tr) < 0) | 6669 | ret = tracing_check_open_get_tr(tr); |
6657 | return -ENODEV; | 6670 | if (ret) |
6671 | return ret; | ||
6658 | 6672 | ||
6659 | if (file->f_mode & FMODE_READ) { | 6673 | if (file->f_mode & FMODE_READ) { |
6660 | iter = __tracing_open(inode, file, true); | 6674 | iter = __tracing_open(inode, file, true); |
@@ -7118,8 +7132,9 @@ static int tracing_err_log_open(struct inode *inode, struct file *file) | |||
7118 | struct trace_array *tr = inode->i_private; | 7132 | struct trace_array *tr = inode->i_private; |
7119 | int ret = 0; | 7133 | int ret = 0; |
7120 | 7134 | ||
7121 | if (trace_array_get(tr) < 0) | 7135 | ret = tracing_check_open_get_tr(tr); |
7122 | return -ENODEV; | 7136 | if (ret) |
7137 | return ret; | ||
7123 | 7138 | ||
7124 | /* If this file was opened for write, then erase contents */ | 7139 | /* If this file was opened for write, then erase contents */ |
7125 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) | 7140 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) |
@@ -7170,11 +7185,9 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp) | |||
7170 | struct ftrace_buffer_info *info; | 7185 | struct ftrace_buffer_info *info; |
7171 | int ret; | 7186 | int ret; |
7172 | 7187 | ||
7173 | if (tracing_disabled) | 7188 | ret = tracing_check_open_get_tr(tr); |
7174 | return -ENODEV; | 7189 | if (ret) |
7175 | 7190 | return ret; | |
7176 | if (trace_array_get(tr) < 0) | ||
7177 | return -ENODEV; | ||
7178 | 7191 | ||
7179 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 7192 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
7180 | if (!info) { | 7193 | if (!info) { |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 854dbf4050f8..d685c61085c0 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -338,6 +338,7 @@ extern struct mutex trace_types_lock; | |||
338 | 338 | ||
339 | extern int trace_array_get(struct trace_array *tr); | 339 | extern int trace_array_get(struct trace_array *tr); |
340 | extern void trace_array_put(struct trace_array *tr); | 340 | extern void trace_array_put(struct trace_array *tr); |
341 | extern int tracing_check_open_get_tr(struct trace_array *tr); | ||
341 | 342 | ||
342 | extern int tracing_set_time_stamp_abs(struct trace_array *tr, bool abs); | 343 | extern int tracing_set_time_stamp_abs(struct trace_array *tr, bool abs); |
343 | extern int tracing_set_clock(struct trace_array *tr, const char *clockstr); | 344 | extern int tracing_set_clock(struct trace_array *tr, const char *clockstr); |
diff --git a/kernel/trace/trace_dynevent.c b/kernel/trace/trace_dynevent.c index a41fed46c285..89779eb84a07 100644 --- a/kernel/trace/trace_dynevent.c +++ b/kernel/trace/trace_dynevent.c | |||
@@ -174,6 +174,10 @@ static int dyn_event_open(struct inode *inode, struct file *file) | |||
174 | { | 174 | { |
175 | int ret; | 175 | int ret; |
176 | 176 | ||
177 | ret = tracing_check_open_get_tr(NULL); | ||
178 | if (ret) | ||
179 | return ret; | ||
180 | |||
177 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { | 181 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { |
178 | ret = dyn_events_release_all(NULL); | 182 | ret = dyn_events_release_all(NULL); |
179 | if (ret < 0) | 183 | if (ret < 0) |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 9613a757c902..71ab0a3660f4 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -1794,8 +1794,9 @@ ftrace_event_set_open(struct inode *inode, struct file *file) | |||
1794 | struct trace_array *tr = inode->i_private; | 1794 | struct trace_array *tr = inode->i_private; |
1795 | int ret; | 1795 | int ret; |
1796 | 1796 | ||
1797 | if (trace_array_get(tr) < 0) | 1797 | ret = tracing_check_open_get_tr(tr); |
1798 | return -ENODEV; | 1798 | if (ret) |
1799 | return ret; | ||
1799 | 1800 | ||
1800 | if ((file->f_mode & FMODE_WRITE) && | 1801 | if ((file->f_mode & FMODE_WRITE) && |
1801 | (file->f_flags & O_TRUNC)) | 1802 | (file->f_flags & O_TRUNC)) |
@@ -1814,8 +1815,9 @@ ftrace_event_set_pid_open(struct inode *inode, struct file *file) | |||
1814 | struct trace_array *tr = inode->i_private; | 1815 | struct trace_array *tr = inode->i_private; |
1815 | int ret; | 1816 | int ret; |
1816 | 1817 | ||
1817 | if (trace_array_get(tr) < 0) | 1818 | ret = tracing_check_open_get_tr(tr); |
1818 | return -ENODEV; | 1819 | if (ret) |
1820 | return ret; | ||
1819 | 1821 | ||
1820 | if ((file->f_mode & FMODE_WRITE) && | 1822 | if ((file->f_mode & FMODE_WRITE) && |
1821 | (file->f_flags & O_TRUNC)) | 1823 | (file->f_flags & O_TRUNC)) |
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 9468bd8d44a2..dd18d76bf1bd 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c | |||
@@ -1680,7 +1680,7 @@ static int save_hist_vars(struct hist_trigger_data *hist_data) | |||
1680 | if (var_data) | 1680 | if (var_data) |
1681 | return 0; | 1681 | return 0; |
1682 | 1682 | ||
1683 | if (trace_array_get(tr) < 0) | 1683 | if (tracing_check_open_get_tr(tr)) |
1684 | return -ENODEV; | 1684 | return -ENODEV; |
1685 | 1685 | ||
1686 | var_data = kzalloc(sizeof(*var_data), GFP_KERNEL); | 1686 | var_data = kzalloc(sizeof(*var_data), GFP_KERNEL); |