diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
| -rw-r--r-- | kernel/trace/trace_events.c | 100 | 
1 files changed, 48 insertions, 52 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 578f1f7d49a6..91951d038ba4 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -984,7 +984,7 @@ static void remove_subsystem(struct trace_subsystem_dir *dir)  		return;  	if (!--dir->nr_events) { -		tracefs_remove(dir->entry); +		eventfs_remove(dir->ef);  		list_del(&dir->list);  		__put_system_dir(dir);  	} @@ -992,20 +992,7 @@ static void remove_subsystem(struct trace_subsystem_dir *dir)  static void remove_event_file_dir(struct trace_event_file *file)  { -	struct dentry *dir = file->dir; -	struct dentry *child; - -	if (dir) { -		spin_lock(&dir->d_lock);	/* probably unneeded */ -		list_for_each_entry(child, &dir->d_subdirs, d_child) { -			if (d_really_is_positive(child))	/* probably unneeded */ -				d_inode(child)->i_private = NULL; -		} -		spin_unlock(&dir->d_lock); - -		tracefs_remove(dir); -	} - +	eventfs_remove(file->ef);  	list_del(&file->list);  	remove_subsystem(file->system);  	free_event_filter(file->filter); @@ -2103,9 +2090,10 @@ static const struct file_operations ftrace_set_event_notrace_pid_fops = {  };  static const struct file_operations ftrace_enable_fops = { -	.open = tracing_open_generic, +	.open = tracing_open_file_tr,  	.read = event_enable_read,  	.write = event_enable_write, +	.release = tracing_release_file_tr,  	.llseek = default_llseek,  }; @@ -2122,9 +2110,10 @@ static const struct file_operations ftrace_event_id_fops = {  };  static const struct file_operations ftrace_event_filter_fops = { -	.open = tracing_open_generic, +	.open = tracing_open_file_tr,  	.read = event_filter_read,  	.write = event_filter_write, +	.release = tracing_release_file_tr,  	.llseek = default_llseek,  }; @@ -2291,13 +2280,14 @@ create_new_subsystem(const char *name)  	return NULL;  } -static struct dentry * +static struct eventfs_file *  event_subsystem_dir(struct trace_array *tr, const char *name,  		    struct trace_event_file *file, struct dentry *parent)  {  	struct event_subsystem *system, *iter;  	struct trace_subsystem_dir *dir; -	struct dentry *entry; +	struct eventfs_file *ef; +	int res;  	/* First see if we did not already create this dir */  	list_for_each_entry(dir, &tr->systems, list) { @@ -2305,7 +2295,7 @@ event_subsystem_dir(struct trace_array *tr, const char *name,  		if (strcmp(system->name, name) == 0) {  			dir->nr_events++;  			file->system = dir; -			return dir->entry; +			return dir->ef;  		}  	} @@ -2329,13 +2319,14 @@ event_subsystem_dir(struct trace_array *tr, const char *name,  	} else  		__get_system(system); -	dir->entry = tracefs_create_dir(name, parent); -	if (!dir->entry) { +	ef = eventfs_add_subsystem_dir(name, parent); +	if (IS_ERR(ef)) {  		pr_warn("Failed to create system directory %s\n", name);  		__put_system(system);  		goto out_free;  	} +	dir->ef = ef;  	dir->tr = tr;  	dir->ref_count = 1;  	dir->nr_events = 1; @@ -2345,22 +2336,22 @@ event_subsystem_dir(struct trace_array *tr, const char *name,  	/* the ftrace system is special, do not create enable or filter files */  	if (strcmp(name, "ftrace") != 0) { -		entry = tracefs_create_file("filter", TRACE_MODE_WRITE, -					    dir->entry, dir, +		res = eventfs_add_file("filter", TRACE_MODE_WRITE, +					    dir->ef, dir,  					    &ftrace_subsystem_filter_fops); -		if (!entry) { +		if (res) {  			kfree(system->filter);  			system->filter = NULL;  			pr_warn("Could not create tracefs '%s/filter' entry\n", name);  		} -		trace_create_file("enable", TRACE_MODE_WRITE, dir->entry, dir, +		eventfs_add_file("enable", TRACE_MODE_WRITE, dir->ef, dir,  				  &ftrace_system_enable_fops);  	}  	list_add(&dir->list, &tr->systems); -	return dir->entry; +	return dir->ef;   out_free:  	kfree(dir); @@ -2413,36 +2404,40 @@ static int  event_create_dir(struct dentry *parent, struct trace_event_file *file)  {  	struct trace_event_call *call = file->event_call; +	struct eventfs_file *ef_subsystem = NULL;  	struct trace_array *tr = file->tr; -	struct dentry *d_events; +	struct eventfs_file *ef;  	const char *name;  	int ret;  	/*  	 * If the trace point header did not define TRACE_SYSTEM -	 * then the system would be called "TRACE_SYSTEM". +	 * then the system would be called "TRACE_SYSTEM". This should +	 * never happen.  	 */ -	if (strcmp(call->class->system, TRACE_SYSTEM) != 0) { -		d_events = event_subsystem_dir(tr, call->class->system, file, parent); -		if (!d_events) -			return -ENOMEM; -	} else -		d_events = parent; +	if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0)) +		return -ENODEV; + +	ef_subsystem = event_subsystem_dir(tr, call->class->system, file, parent); +	if (!ef_subsystem) +		return -ENOMEM;  	name = trace_event_name(call); -	file->dir = tracefs_create_dir(name, d_events); -	if (!file->dir) { +	ef = eventfs_add_dir(name, ef_subsystem); +	if (IS_ERR(ef)) {  		pr_warn("Could not create tracefs '%s' directory\n", name);  		return -1;  	} +	file->ef = ef; +  	if (call->class->reg && !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) -		trace_create_file("enable", TRACE_MODE_WRITE, file->dir, file, +		eventfs_add_file("enable", TRACE_MODE_WRITE, file->ef, file,  				  &ftrace_enable_fops);  #ifdef CONFIG_PERF_EVENTS  	if (call->event.type && call->class->reg) -		trace_create_file("id", TRACE_MODE_READ, file->dir, +		eventfs_add_file("id", TRACE_MODE_READ, file->ef,  				  (void *)(long)call->event.type,  				  &ftrace_event_id_fops);  #endif @@ -2458,27 +2453,27 @@ event_create_dir(struct dentry *parent, struct trace_event_file *file)  	 * triggers or filters.  	 */  	if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) { -		trace_create_file("filter", TRACE_MODE_WRITE, file->dir, +		eventfs_add_file("filter", TRACE_MODE_WRITE, file->ef,  				  file, &ftrace_event_filter_fops); -		trace_create_file("trigger", TRACE_MODE_WRITE, file->dir, +		eventfs_add_file("trigger", TRACE_MODE_WRITE, file->ef,  				  file, &event_trigger_fops);  	}  #ifdef CONFIG_HIST_TRIGGERS -	trace_create_file("hist", TRACE_MODE_READ, file->dir, file, +	eventfs_add_file("hist", TRACE_MODE_READ, file->ef, file,  			  &event_hist_fops);  #endif  #ifdef CONFIG_HIST_TRIGGERS_DEBUG -	trace_create_file("hist_debug", TRACE_MODE_READ, file->dir, file, +	eventfs_add_file("hist_debug", TRACE_MODE_READ, file->ef, file,  			  &event_hist_debug_fops);  #endif -	trace_create_file("format", TRACE_MODE_READ, file->dir, call, +	eventfs_add_file("format", TRACE_MODE_READ, file->ef, call,  			  &ftrace_event_format_fops);  #ifdef CONFIG_TRACE_EVENT_INJECT  	if (call->event.type && call->class->reg) -		trace_create_file("inject", 0200, file->dir, file, +		eventfs_add_file("inject", 0200, file->ef, file,  				  &event_inject_fops);  #endif @@ -3631,21 +3626,22 @@ create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)  {  	struct dentry *d_events;  	struct dentry *entry; +	int error = 0;  	entry = trace_create_file("set_event", TRACE_MODE_WRITE, parent,  				  tr, &ftrace_set_event_fops);  	if (!entry)  		return -ENOMEM; -	d_events = tracefs_create_dir("events", parent); -	if (!d_events) { +	d_events = eventfs_create_events_dir("events", parent); +	if (IS_ERR(d_events)) {  		pr_warn("Could not create tracefs 'events' directory\n");  		return -ENOMEM;  	} -	entry = trace_create_file("enable", TRACE_MODE_WRITE, d_events, +	error = eventfs_add_events_file("enable", TRACE_MODE_WRITE, d_events,  				  tr, &ftrace_tr_enable_fops); -	if (!entry) +	if (error)  		return -ENOMEM;  	/* There are not as crucial, just warn if they are not created */ @@ -3658,11 +3654,11 @@ create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)  			  &ftrace_set_event_notrace_pid_fops);  	/* ring buffer internal formats */ -	trace_create_file("header_page", TRACE_MODE_READ, d_events, +	eventfs_add_events_file("header_page", TRACE_MODE_READ, d_events,  				  ring_buffer_print_page_header,  				  &ftrace_show_header_fops); -	trace_create_file("header_event", TRACE_MODE_READ, d_events, +	eventfs_add_events_file("header_event", TRACE_MODE_READ, d_events,  				  ring_buffer_print_entry_header,  				  &ftrace_show_header_fops); @@ -3750,7 +3746,7 @@ int event_trace_del_tracer(struct trace_array *tr)  	down_write(&trace_event_sem);  	__trace_remove_event_dirs(tr); -	tracefs_remove(tr->event_dir); +	eventfs_remove_events_dir(tr->event_dir);  	up_write(&trace_event_sem);  	tr->event_dir = NULL;  |