aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Banks <gnb@melbourne.sgi.com>2009-02-05 20:54:26 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-03-24 19:38:27 -0400
commit9898abb3d23311fa227a7f46bf4e40fd2954057f (patch)
treef32e6f1b0422e491bf3db276f6f62467e4a21928
parent86151fdf38b3795f292b39defbff39d2684b9c8c (diff)
Dynamic debug: allow simple quoting of words
Allow simple quoting of words in the dynamic debug control language. This allows more natural specification when using the control language to match against printk formats, e.g #echo -n 'format "Setting node for non-present cpu" +p' > /mnt/debugfs/dynamic_debug/control instead of #echo -n 'format Setting\040node\040for\040non-present\040cpu +p' > /mnt/debugfs/dynamic_debug/control Adjust the dynamic debug documention to describe that and provide a new example. Adjust the existing examples in the documentation to reflect the current whitespace escaping behaviour when reading the control file. Fix some minor documentation trailing whitespace. Signed-off-by: Greg Banks <gnb@melbourne.sgi.com> Acked-by: Jason Baron <jbaron@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--Documentation/dynamic-debug-howto.txt20
-rw-r--r--lib/dynamic_debug.c53
2 files changed, 47 insertions, 26 deletions
diff --git a/Documentation/dynamic-debug-howto.txt b/Documentation/dynamic-debug-howto.txt
index 68394825e86b..674c5663d346 100644
--- a/Documentation/dynamic-debug-howto.txt
+++ b/Documentation/dynamic-debug-howto.txt
@@ -49,10 +49,10 @@ via:
49 49
50nullarbor:~ # cat <debugfs>/dynamic_debug/control 50nullarbor:~ # cat <debugfs>/dynamic_debug/control
51# filename:lineno [module]function flags format 51# filename:lineno [module]function flags format
52/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:323 [svcxprt_rdma]svc_rdma_cleanup - "SVCRDMA\040Module\040Removed,\040deregister\040RPC\040RDMA\040transport\012" 52/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:323 [svcxprt_rdma]svc_rdma_cleanup - "SVCRDMA Module Removed, deregister RPC RDMA transport\012"
53/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 [svcxprt_rdma]svc_rdma_init - "\011max_inline\040\040\040\040\040\040\040:\040%d\012" 53/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 [svcxprt_rdma]svc_rdma_init - "\011max_inline : %d\012"
54/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 [svcxprt_rdma]svc_rdma_init - "\011sq_depth\040\040\040\040\040\040\040\040\040:\040%d\012" 54/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 [svcxprt_rdma]svc_rdma_init - "\011sq_depth : %d\012"
55/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 [svcxprt_rdma]svc_rdma_init - "\011max_requests\040\040\040\040\040:\040%d\012" 55/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 [svcxprt_rdma]svc_rdma_init - "\011max_requests : %d\012"
56... 56...
57 57
58 58
@@ -72,7 +72,7 @@ you can view all the debug statement callsites with any non-default flags:
72 72
73nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control 73nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control
74# filename:lineno [module]function flags format 74# filename:lineno [module]function flags format
75/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c:1603 [sunrpc]svc_send p "svc_process:\040st_sendto\040returned\040%d\012" 75/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c:1603 [sunrpc]svc_send p "svc_process: st_sendto returned %d\012"
76 76
77 77
78Command Language Reference 78Command Language Reference
@@ -166,11 +166,15 @@ format
166 entire format, only some part. Whitespace and other 166 entire format, only some part. Whitespace and other
167 special characters can be escaped using C octal character 167 special characters can be escaped using C octal character
168 escape \ooo notation, e.g. the space character is \040. 168 escape \ooo notation, e.g. the space character is \040.
169 Alternatively, the string can be enclosed in double quote
170 characters (") or single quote characters (').
169 Examples: 171 Examples:
170 172
171 format svcrdma: // many of the NFS/RDMA server dprintks 173 format svcrdma: // many of the NFS/RDMA server dprintks
172 format readahead // some dprintks in the readahead cache 174 format readahead // some dprintks in the readahead cache
173 format nfsd:\040SETATTR // how to match a format with whitespace 175 format nfsd:\040SETATTR // one way to match a format with whitespace
176 format "nfsd: SETATTR" // a neater way to match a format with whitespace
177 format 'nfsd: SETATTR' // yet another way to match a format with whitespace
174 178
175line 179line
176 The given line number or range of line numbers is compared 180 The given line number or range of line numbers is compared
@@ -230,3 +234,7 @@ nullarbor:~ # echo -n 'func svc_process +p' >
230// disable all 12 messages in the function svc_process() 234// disable all 12 messages in the function svc_process()
231nullarbor:~ # echo -n 'func svc_process -p' > 235nullarbor:~ # echo -n 'func svc_process -p' >
232 <debugfs>/dynamic_debug/control 236 <debugfs>/dynamic_debug/control
237
238// enable messages for NFS calls READ, READLINK, READDIR and READDIR+.
239nullarbor:~ # echo -n 'format "nfsd: READ" +p' >
240 <debugfs>/dynamic_debug/control
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 9e123ae326bc..833139ce1e22 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -196,32 +196,45 @@ static void ddebug_change(const struct ddebug_query *query,
196} 196}
197 197
198/* 198/*
199 * Wrapper around strsep() to collapse the multiple empty tokens
200 * that it returns when fed sequences of separator characters.
201 * Now, if we had strtok_r()...
202 */
203static inline char *nearly_strtok_r(char **p, const char *sep)
204{
205 char *r;
206
207 while ((r = strsep(p, sep)) != NULL && *r == '\0')
208 ;
209 return r;
210}
211
212/*
213 * Split the buffer `buf' into space-separated words. 199 * Split the buffer `buf' into space-separated words.
214 * Return the number of such words or <0 on error. 200 * Handles simple " and ' quoting, i.e. without nested,
201 * embedded or escaped \". Return the number of words
202 * or <0 on error.
215 */ 203 */
216static int ddebug_tokenize(char *buf, char *words[], int maxwords) 204static int ddebug_tokenize(char *buf, char *words[], int maxwords)
217{ 205{
218 int nwords = 0; 206 int nwords = 0;
219 207
220 while (nwords < maxwords && 208 while (*buf) {
221 (words[nwords] = nearly_strtok_r(&buf, " \t\r\n")) != NULL) 209 char *end;
222 nwords++; 210
223 if (buf) 211 /* Skip leading whitespace */
224 return -EINVAL; /* ran out of words[] before bytes */ 212 while (*buf && isspace(*buf))
213 buf++;
214 if (!*buf)
215 break; /* oh, it was trailing whitespace */
216
217 /* Run `end' over a word, either whitespace separated or quoted */
218 if (*buf == '"' || *buf == '\'') {
219 int quote = *buf++;
220 for (end = buf ; *end && *end != quote ; end++)
221 ;
222 if (!*end)
223 return -EINVAL; /* unclosed quote */
224 } else {
225 for (end = buf ; *end && !isspace(*end) ; end++)
226 ;
227 BUG_ON(end == buf);
228 }
229 /* Here `buf' is the start of the word, `end' is one past the end */
230
231 if (nwords == maxwords)
232 return -EINVAL; /* ran out of words[] before bytes */
233 if (*end)
234 *end++ = '\0'; /* terminate the word */
235 words[nwords++] = buf;
236 buf = end;
237 }
225 238
226 if (verbose) { 239 if (verbose) {
227 int i; 240 int i;