|
@@ -911,26 +911,33 @@ probe_event_enable(struct trace_uprobe *tu, struct ftrace_event_file *file,
|
|
|
tu->tp.flags |= TP_FLAG_PROFILE;
|
|
|
}
|
|
|
|
|
|
- ret = uprobe_buffer_enable();
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
WARN_ON(!uprobe_filter_is_empty(&tu->filter));
|
|
|
|
|
|
if (enabled)
|
|
|
return 0;
|
|
|
|
|
|
+ ret = uprobe_buffer_enable();
|
|
|
+ if (ret)
|
|
|
+ goto err_flags;
|
|
|
+
|
|
|
tu->consumer.filter = filter;
|
|
|
ret = uprobe_register(tu->inode, tu->offset, &tu->consumer);
|
|
|
- if (ret) {
|
|
|
- if (file) {
|
|
|
- list_del(&link->list);
|
|
|
- kfree(link);
|
|
|
- tu->tp.flags &= ~TP_FLAG_TRACE;
|
|
|
- } else
|
|
|
- tu->tp.flags &= ~TP_FLAG_PROFILE;
|
|
|
- }
|
|
|
+ if (ret)
|
|
|
+ goto err_buffer;
|
|
|
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ err_buffer:
|
|
|
+ uprobe_buffer_disable();
|
|
|
+
|
|
|
+ err_flags:
|
|
|
+ if (file) {
|
|
|
+ list_del(&link->list);
|
|
|
+ kfree(link);
|
|
|
+ tu->tp.flags &= ~TP_FLAG_TRACE;
|
|
|
+ } else {
|
|
|
+ tu->tp.flags &= ~TP_FLAG_PROFILE;
|
|
|
+ }
|
|
|
return ret;
|
|
|
}
|
|
|
|