| From 04aef32d39cc4ef80087c0ce8ed113c6d64f1a6b Mon Sep 17 00:00:00 2001 |
| From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> |
| Date: Wed, 15 Jul 2009 12:29:06 +0800 |
| Subject: tracing/function: Fix the return value of ftrace_trace_onoff_callback() |
| |
| From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> |
| |
| commit 04aef32d39cc4ef80087c0ce8ed113c6d64f1a6b upstream. |
| |
| ftrace_trace_onoff_callback() will return an error even if we do the |
| right operation, for example: |
| |
| # echo _spin_*:traceon:10 > set_ftrace_filter |
| -bash: echo: write error: Invalid argument |
| # cat set_ftrace_filter |
| #### all functions enabled #### |
| _spin_trylock_bh:traceon:count=10 |
| _spin_unlock_irq:traceon:count=10 |
| _spin_unlock_bh:traceon:count=10 |
| _spin_lock_irq:traceon:count=10 |
| _spin_unlock:traceon:count=10 |
| _spin_trylock:traceon:count=10 |
| _spin_unlock_irqrestore:traceon:count=10 |
| _spin_lock_irqsave:traceon:count=10 |
| _spin_lock_bh:traceon:count=10 |
| _spin_lock:traceon:count=10 |
| |
| We want to set _spin_*:traceon:10 to set_ftrace_filter, it complains |
| with "Invalid argument", but the operation is successful. |
| |
| This is because ftrace_process_regex() returns the number of functions that |
| matched the pattern. If the number is not 0, this value is returned |
| by ftrace_regex_write() whereas we want to return the number of bytes |
| virtually written. |
| Also the file offset pointer is not updated in this case. |
| |
| If the number of matched functions is lower than the number of bytes written |
| by the user, this results to a reprocessing of the string given by the user with |
| a lower size, leading to a malformed ftrace regex and then a -EINVAL returned. |
| |
| So, this patch fixes it by returning 0 if no error occured. |
| The fix also applies on 2.6.30 |
| |
| Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> |
| Reviewed-by: Li Zefan <lizf@cn.fujitsu.com> |
| Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/trace/trace_functions.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/kernel/trace/trace_functions.c |
| +++ b/kernel/trace/trace_functions.c |
| @@ -364,7 +364,7 @@ ftrace_trace_onoff_callback(char *glob, |
| out_reg: |
| ret = register_ftrace_function_probe(glob, ops, count); |
| |
| - return ret; |
| + return ret < 0 ? ret : 0; |
| } |
| |
| static struct ftrace_func_command ftrace_traceon_cmd = { |