Skip to content

Commit

Permalink
tracing: Prevent deleting instances when they are being read
Browse files Browse the repository at this point in the history
Add a ref count to the trace_array structure and prevent removal
of instances that have open descriptors.

Signed-off-by: Steven Rostedt <[email protected]>
  • Loading branch information
Steven Rostedt (Red Hat) authored and rostedt committed Mar 15, 2013
1 parent 121aaee commit a695cb5
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
23 changes: 23 additions & 0 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -2613,6 +2613,8 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
tracing_iter_reset(iter, cpu);
}

tr->ref++;

mutex_unlock(&trace_types_lock);

return iter;
Expand Down Expand Up @@ -2649,6 +2651,10 @@ static int tracing_release(struct inode *inode, struct file *file)
tr = iter->tr;

mutex_lock(&trace_types_lock);

WARN_ON(!tr->ref);
tr->ref--;

for_each_tracing_cpu(cpu) {
if (iter->buffer_iter[cpu])
ring_buffer_read_finish(iter->buffer_iter[cpu]);
Expand Down Expand Up @@ -4460,6 +4466,10 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
if (!info)
return -ENOMEM;

mutex_lock(&trace_types_lock);

tr->ref++;

info->iter.tr = tr;
info->iter.cpu_file = tc->cpu;
info->iter.trace = tr->current_trace;
Expand All @@ -4470,6 +4480,8 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)

filp->private_data = info;

mutex_unlock(&trace_types_lock);

return nonseekable_open(inode, filp);
}

Expand Down Expand Up @@ -4568,10 +4580,17 @@ static int tracing_buffers_release(struct inode *inode, struct file *file)
struct ftrace_buffer_info *info = file->private_data;
struct trace_iterator *iter = &info->iter;

mutex_lock(&trace_types_lock);

WARN_ON(!iter->tr->ref);
iter->tr->ref--;

if (info->spare)
ring_buffer_free_read_page(iter->trace_buffer->buffer, info->spare);
kfree(info);

mutex_unlock(&trace_types_lock);

return 0;
}

Expand Down Expand Up @@ -5411,6 +5430,10 @@ static int instance_delete(const char *name)
if (!found)
goto out_unlock;

ret = -EBUSY;
if (tr->ref)
goto out_unlock;

list_del(&tr->list);

event_trace_del_tracer(tr);
Expand Down
1 change: 1 addition & 0 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ struct trace_array {
struct list_head systems;
struct list_head events;
struct task_struct *waiter;
int ref;
};

enum {
Expand Down

0 comments on commit a695cb5

Please sign in to comment.