|
@@ -118,9 +118,11 @@ int trace_event_raw_init(struct ftrace_event_call *call)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(trace_event_raw_init);
|
|
EXPORT_SYMBOL_GPL(trace_event_raw_init);
|
|
|
|
|
|
-static void ftrace_event_enable_disable(struct ftrace_event_call *call,
|
|
|
|
|
|
+static int ftrace_event_enable_disable(struct ftrace_event_call *call,
|
|
int enable)
|
|
int enable)
|
|
{
|
|
{
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
switch (enable) {
|
|
switch (enable) {
|
|
case 0:
|
|
case 0:
|
|
if (call->enabled) {
|
|
if (call->enabled) {
|
|
@@ -131,12 +133,20 @@ static void ftrace_event_enable_disable(struct ftrace_event_call *call,
|
|
break;
|
|
break;
|
|
case 1:
|
|
case 1:
|
|
if (!call->enabled) {
|
|
if (!call->enabled) {
|
|
- call->enabled = 1;
|
|
|
|
tracing_start_cmdline_record();
|
|
tracing_start_cmdline_record();
|
|
- call->regfunc(call);
|
|
|
|
|
|
+ ret = call->regfunc(call);
|
|
|
|
+ if (ret) {
|
|
|
|
+ tracing_stop_cmdline_record();
|
|
|
|
+ pr_info("event trace: Could not enable event "
|
|
|
|
+ "%s\n", call->name);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ call->enabled = 1;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static void ftrace_clear_events(void)
|
|
static void ftrace_clear_events(void)
|
|
@@ -415,7 +425,7 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|
case 0:
|
|
case 0:
|
|
case 1:
|
|
case 1:
|
|
mutex_lock(&event_mutex);
|
|
mutex_lock(&event_mutex);
|
|
- ftrace_event_enable_disable(call, val);
|
|
|
|
|
|
+ ret = ftrace_event_enable_disable(call, val);
|
|
mutex_unlock(&event_mutex);
|
|
mutex_unlock(&event_mutex);
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -425,7 +435,7 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|
|
|
|
|
*ppos += cnt;
|
|
*ppos += cnt;
|
|
|
|
|
|
- return cnt;
|
|
|
|
|
|
+ return ret ? ret : cnt;
|
|
}
|
|
}
|
|
|
|
|
|
static ssize_t
|
|
static ssize_t
|