diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
| -rw-r--r-- | kernel/trace/ftrace.c | 36 | 
1 files changed, 22 insertions, 14 deletions
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index e51a1bcb7bed..1e6640f80454 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1690,7 +1690,7 @@ ftrace_regex_lseek(struct file *file, loff_t offset, int origin)  static int ftrace_match(char *str, char *regex, int len, int type)  {  	int matched = 0; -	char *ptr; +	int slen;  	switch (type) {  	case MATCH_FULL: @@ -1706,8 +1706,8 @@ static int ftrace_match(char *str, char *regex, int len, int type)  			matched = 1;  		break;  	case MATCH_END_ONLY: -		ptr = strstr(str, regex); -		if (ptr && (ptr[len] == 0)) +		slen = strlen(str); +		if (slen >= len && memcmp(str + slen - len, regex, len) == 0)  			matched = 1;  		break;  	} @@ -1724,7 +1724,7 @@ ftrace_match_record(struct dyn_ftrace *rec, char *regex, int len, int type)  	return ftrace_match(str, regex, len, type);  } -static void ftrace_match_records(char *buff, int len, int enable) +static int ftrace_match_records(char *buff, int len, int enable)  {  	unsigned int search_len;  	struct ftrace_page *pg; @@ -1733,6 +1733,7 @@ static void ftrace_match_records(char *buff, int len, int enable)  	char *search;  	int type;  	int not; +	int found = 0;  	flag = enable ? FTRACE_FL_FILTER : FTRACE_FL_NOTRACE;  	type = filter_parse_regex(buff, len, &search, ¬); @@ -1750,6 +1751,7 @@ static void ftrace_match_records(char *buff, int len, int enable)  				rec->flags &= ~flag;  			else  				rec->flags |= flag; +			found = 1;  		}  		/*  		 * Only enable filtering if we have a function that @@ -1759,6 +1761,8 @@ static void ftrace_match_records(char *buff, int len, int enable)  			ftrace_filtered = 1;  	} while_for_each_ftrace_rec();  	mutex_unlock(&ftrace_lock); + +	return found;  }  static int @@ -1780,7 +1784,7 @@ ftrace_match_module_record(struct dyn_ftrace *rec, char *mod,  		return 1;  } -static void ftrace_match_module_records(char *buff, char *mod, int enable) +static int ftrace_match_module_records(char *buff, char *mod, int enable)  {  	unsigned search_len = 0;  	struct ftrace_page *pg; @@ -1789,6 +1793,7 @@ static void ftrace_match_module_records(char *buff, char *mod, int enable)  	char *search = buff;  	unsigned long flag;  	int not = 0; +	int found = 0;  	flag = enable ? FTRACE_FL_FILTER : FTRACE_FL_NOTRACE; @@ -1819,12 +1824,15 @@ static void ftrace_match_module_records(char *buff, char *mod, int enable)  				rec->flags &= ~flag;  			else  				rec->flags |= flag; +			found = 1;  		}  		if (enable && (rec->flags & FTRACE_FL_FILTER))  			ftrace_filtered = 1;  	} while_for_each_ftrace_rec();  	mutex_unlock(&ftrace_lock); + +	return found;  }  /* @@ -1853,8 +1861,9 @@ ftrace_mod_callback(char *func, char *cmd, char *param, int enable)  	if (!strlen(mod))  		return -EINVAL; -	ftrace_match_module_records(func, mod, enable); -	return 0; +	if (ftrace_match_module_records(func, mod, enable)) +		return 0; +	return -EINVAL;  }  static struct ftrace_func_command ftrace_mod_cmd = { @@ -2151,8 +2160,9 @@ static int ftrace_process_regex(char *buff, int len, int enable)  	func = strsep(&next, ":");  	if (!next) { -		ftrace_match_records(func, len, enable); -		return 0; +		if (ftrace_match_records(func, len, enable)) +			return 0; +		return ret;  	}  	/* command found */ @@ -2198,10 +2208,9 @@ ftrace_regex_write(struct file *file, const char __user *ubuf,  	    !trace_parser_cont(parser)) {  		ret = ftrace_process_regex(parser->buffer,  					   parser->idx, enable); +		trace_parser_clear(parser);  		if (ret)  			goto out_unlock; - -		trace_parser_clear(parser);  	}  	ret = read; @@ -2543,10 +2552,9 @@ ftrace_set_func(unsigned long *array, int *idx, char *buffer)  					exists = true;  					break;  				} -			if (!exists) { +			if (!exists)  				array[(*idx)++] = rec->ip; -				found = 1; -			} +			found = 1;  		}  	} while_for_each_ftrace_rec(); | 
