diff options
| author | Jim Cromie <jim.cromie@gmail.com> | 2012-12-05 16:48:27 -0500 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-17 12:19:09 -0800 | 
| commit | 18c216c53b29f15b17c4c05a46395fc90ebb6f0c (patch) | |
| tree | 0f01e8fd2346ec6c82eaace95e6831440bc39a03 /lib/dynamic_debug.c | |
| parent | 7a555613eb77c69eb6e48b61bc5f72dd42fa1780 (diff) | |
| download | olio-linux-3.10-18c216c53b29f15b17c4c05a46395fc90ebb6f0c.tar.xz olio-linux-3.10-18c216c53b29f15b17c4c05a46395fc90ebb6f0c.zip  | |
dynamic_debug: add pr_errs before -EINVALs
Ma noted that dynamic-debug is silent about many query errors, so add
pr_err()s to explain those errors, and tweak a few others.  Also parse
flags 1st, so that match-spec errs are slightly clearer.
CC: Jianpeng Ma <majianpeng@gmail.com>
CC: Joe Perches <joe@perches.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'lib/dynamic_debug.c')
| -rw-r--r-- | lib/dynamic_debug.c | 47 | 
1 files changed, 35 insertions, 12 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index ac7d27737e4..5276b99ca65 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -223,8 +223,10 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords)  			int quote = *buf++;  			for (end = buf; *end && *end != quote; end++)  				; -			if (!*end) +			if (!*end) { +				pr_err("unclosed quote: %s\n", buf);  				return -EINVAL;	/* unclosed quote */ +			}  		} else {  			for (end = buf; *end && !isspace(*end); end++)  				; @@ -232,8 +234,10 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords)  		}  		/* `buf' is start of word, `end' is one past its end */ -		if (nwords == maxwords) +		if (nwords == maxwords) { +			pr_err("too many words, legal max <=%d\n", maxwords);  			return -EINVAL;	/* ran out of words[] before bytes */ +		}  		if (*end)  			*end++ = '\0';	/* terminate the word */  		words[nwords++] = buf; @@ -265,7 +269,11 @@ static inline int parse_lineno(const char *str, unsigned int *val)  		return 0;  	}  	*val = simple_strtoul(str, &end, 10); -	return end == NULL || end == str || *end != '\0' ? -EINVAL : 0; +	if (end == NULL || end == str || *end != '\0') { +		pr_err("bad line-number: %s\n", str); +		return -EINVAL; +	} +	return 0;  }  /* @@ -345,8 +353,10 @@ static int ddebug_parse_query(char *words[], int nwords,  	int rc;  	/* check we have an even number of words */ -	if (nwords % 2 != 0) +	if (nwords % 2 != 0) { +		pr_err("expecting pairs of match-spec <value>\n");  		return -EINVAL; +	}  	memset(query, 0, sizeof(*query));  	if (modname) @@ -367,18 +377,22 @@ static int ddebug_parse_query(char *words[], int nwords,  			char *first = words[i+1];  			char *last = strchr(first, '-');  			if (query->first_lineno || query->last_lineno) { -				pr_err("match-spec:line given 2 times\n"); +				pr_err("match-spec: line used 2x\n");  				return -EINVAL;  			}  			if (last)  				*last++ = '\0'; -			if (parse_lineno(first, &query->first_lineno) < 0) +			if (parse_lineno(first, &query->first_lineno) < 0) { +				pr_err("line-number is <0\n");  				return -EINVAL; +			}  			if (last) {  				/* range <first>-<last> */  				if (parse_lineno(last, &query->last_lineno)  				    < query->first_lineno) { -					pr_err("last-line < 1st-line\n"); +					pr_err("last-line:%d < 1st-line:%d\n", +						query->last_lineno, +						query->first_lineno);  					return -EINVAL;  				}  			} else { @@ -414,6 +428,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,  		op = *str++;  		break;  	default: +		pr_err("bad flag-op %c, at start of %s\n", *str, str);  		return -EINVAL;  	}  	vpr_info("op='%c'\n", op); @@ -425,8 +440,10 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,  				break;  			}  		} -		if (i < 0) +		if (i < 0) { +			pr_err("unknown flag '%c' in \"%s\"\n", *str, str);  			return -EINVAL; +		}  	}  	vpr_info("flags=0x%x\n", flags); @@ -458,13 +475,19 @@ static int ddebug_exec_query(char *query_string, const char *modname)  	char *words[MAXWORDS];  	nwords = ddebug_tokenize(query_string, words, MAXWORDS); -	if (nwords <= 0) +	if (nwords <= 0) { +		pr_err("tokenize failed\n");  		return -EINVAL; -	if (ddebug_parse_query(words, nwords-1, &query, modname)) +	} +	/* check flags 1st (last arg) so query is pairs of spec,val */ +	if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) { +		pr_err("flags parse failed\n");  		return -EINVAL; -	if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) +	} +	if (ddebug_parse_query(words, nwords-1, &query, modname)) { +		pr_err("query parse failed\n");  		return -EINVAL; - +	}  	/* actually go and implement the change */  	nfound = ddebug_change(&query, flags, mask);  	vpr_info_dq(&query, nfound ? "applied" : "no-match");  |