forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									7a555613eb
								
							
						
					
					
						commit
						18c216c53b
					
				
					 1 changed files with 35 additions and 12 deletions
				
			
		| 
						 | 
					@ -223,8 +223,10 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords)
 | 
				
			||||||
			int quote = *buf++;
 | 
								int quote = *buf++;
 | 
				
			||||||
			for (end = buf; *end && *end != quote; end++)
 | 
								for (end = buf; *end && *end != quote; end++)
 | 
				
			||||||
				;
 | 
									;
 | 
				
			||||||
			if (!*end)
 | 
								if (!*end) {
 | 
				
			||||||
 | 
									pr_err("unclosed quote: %s\n", buf);
 | 
				
			||||||
				return -EINVAL;	/* unclosed quote */
 | 
									return -EINVAL;	/* unclosed quote */
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			for (end = buf; *end && !isspace(*end); end++)
 | 
								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 */
 | 
							/* `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 */
 | 
								return -EINVAL;	/* ran out of words[] before bytes */
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (*end)
 | 
							if (*end)
 | 
				
			||||||
			*end++ = '\0';	/* terminate the word */
 | 
								*end++ = '\0';	/* terminate the word */
 | 
				
			||||||
		words[nwords++] = buf;
 | 
							words[nwords++] = buf;
 | 
				
			||||||
| 
						 | 
					@ -265,7 +269,11 @@ static inline int parse_lineno(const char *str, unsigned int *val)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	*val = simple_strtoul(str, &end, 10);
 | 
						*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;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* check we have an even number of words */
 | 
						/* 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;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	memset(query, 0, sizeof(*query));
 | 
						memset(query, 0, sizeof(*query));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (modname)
 | 
						if (modname)
 | 
				
			||||||
| 
						 | 
					@ -367,18 +377,22 @@ static int ddebug_parse_query(char *words[], int nwords,
 | 
				
			||||||
			char *first = words[i+1];
 | 
								char *first = words[i+1];
 | 
				
			||||||
			char *last = strchr(first, '-');
 | 
								char *last = strchr(first, '-');
 | 
				
			||||||
			if (query->first_lineno || query->last_lineno) {
 | 
								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;
 | 
									return -EINVAL;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (last)
 | 
								if (last)
 | 
				
			||||||
				*last++ = '\0';
 | 
									*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;
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if (last) {
 | 
								if (last) {
 | 
				
			||||||
				/* range <first>-<last> */
 | 
									/* range <first>-<last> */
 | 
				
			||||||
				if (parse_lineno(last, &query->last_lineno)
 | 
									if (parse_lineno(last, &query->last_lineno)
 | 
				
			||||||
				    < query->first_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;
 | 
										return -EINVAL;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
| 
						 | 
					@ -414,6 +428,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
 | 
				
			||||||
		op = *str++;
 | 
							op = *str++;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							pr_err("bad flag-op %c, at start of %s\n", *str, str);
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	vpr_info("op='%c'\n", op);
 | 
						vpr_info("op='%c'\n", op);
 | 
				
			||||||
| 
						 | 
					@ -425,9 +440,11 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (i < 0)
 | 
							if (i < 0) {
 | 
				
			||||||
 | 
								pr_err("unknown flag '%c' in \"%s\"\n", *str, str);
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	vpr_info("flags=0x%x\n", flags);
 | 
						vpr_info("flags=0x%x\n", flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* calculate final *flagsp, *maskp according to mask and op */
 | 
						/* calculate final *flagsp, *maskp according to mask and op */
 | 
				
			||||||
| 
						 | 
					@ -458,13 +475,19 @@ static int ddebug_exec_query(char *query_string, const char *modname)
 | 
				
			||||||
	char *words[MAXWORDS];
 | 
						char *words[MAXWORDS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nwords = ddebug_tokenize(query_string, words, MAXWORDS);
 | 
						nwords = ddebug_tokenize(query_string, words, MAXWORDS);
 | 
				
			||||||
	if (nwords <= 0)
 | 
						if (nwords <= 0) {
 | 
				
			||||||
 | 
							pr_err("tokenize failed\n");
 | 
				
			||||||
		return -EINVAL;
 | 
							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;
 | 
							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;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	/* actually go and implement the change */
 | 
						/* actually go and implement the change */
 | 
				
			||||||
	nfound = ddebug_change(&query, flags, mask);
 | 
						nfound = ddebug_change(&query, flags, mask);
 | 
				
			||||||
	vpr_info_dq(&query, nfound ? "applied" : "no-match");
 | 
						vpr_info_dq(&query, nfound ? "applied" : "no-match");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue