summaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c117
1 files changed, 65 insertions, 52 deletions
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
307int 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
307int call_filter_check_discard(struct trace_event_call *call, void *rec, 318int 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
4141int tracing_open_generic(struct inode *inode, struct file *filp) 4152int 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)
4159int tracing_open_generic_tr(struct inode *inode, struct file *filp) 4173int 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
5052static int tracing_saved_tgids_open(struct inode *inode, struct file *filp) 5062static 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
5129static int tracing_saved_cmdlines_open(struct inode *inode, struct file *filp) 5142static 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
5294static int tracing_eval_map_open(struct inode *inode, struct file *filp) 5310static 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) {