return file;
 }
 
+/**
+ * trace_get_event_file - Find and return a trace event file
+ * @instance: The name of the trace instance containing the event
+ * @system: The name of the system containing the event
+ * @event: The name of the event
+ *
+ * Return a trace event file given the trace instance name, trace
+ * system, and trace event name.  If the instance name is NULL, it
+ * refers to the top-level trace array.
+ *
+ * This function will look it up and return it if found, after calling
+ * trace_array_get() to prevent the instance from going away, and
+ * increment the event's module refcount to prevent it from being
+ * removed.
+ *
+ * To release the file, call trace_put_event_file(), which will call
+ * trace_array_put() and decrement the event's module refcount.
+ *
+ * Return: The trace event on success, ERR_PTR otherwise.
+ */
+struct trace_event_file *trace_get_event_file(const char *instance,
+                                             const char *system,
+                                             const char *event)
+{
+       struct trace_array *tr = top_trace_array();
+       struct trace_event_file *file = NULL;
+       int ret = -EINVAL;
+
+       if (instance) {
+               tr = trace_array_find_get(instance);
+               if (!tr)
+                       return ERR_PTR(-ENOENT);
+       } else {
+               ret = trace_array_get(tr);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
+       mutex_lock(&event_mutex);
+
+       file = find_event_file(tr, system, event);
+       if (!file) {
+               trace_array_put(tr);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       /* Don't let event modules unload while in use */
+       ret = try_module_get(file->event_call->mod);
+       if (!ret) {
+               trace_array_put(tr);
+               ret = -EBUSY;
+               goto out;
+       }
+
+       ret = 0;
+ out:
+       mutex_unlock(&event_mutex);
+
+       if (ret)
+               file = ERR_PTR(ret);
+
+       return file;
+}
+EXPORT_SYMBOL_GPL(trace_get_event_file);
+
+/**
+ * trace_put_event_file - Release a file from trace_get_event_file()
+ * @file: The trace event file
+ *
+ * If a file was retrieved using trace_get_event_file(), this should
+ * be called when it's no longer needed.  It will cancel the previous
+ * trace_array_get() called by that function, and decrement the
+ * event's module refcount.
+ */
+void trace_put_event_file(struct trace_event_file *file)
+{
+       mutex_lock(&event_mutex);
+       module_put(file->event_call->mod);
+       mutex_unlock(&event_mutex);
+
+       trace_array_put(file->tr);
+}
+EXPORT_SYMBOL_GPL(trace_put_event_file);
+
 #ifdef CONFIG_DYNAMIC_FTRACE
 
 /* Avoid typos */