diff options
-rw-r--r-- | Documentation/dynamic-debug-howto.txt | 20 | ||||
-rw-r--r-- | lib/dynamic_debug.c | 53 |
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 | ||
50 | nullarbor:~ # cat <debugfs>/dynamic_debug/control | 50 | nullarbor:~ # 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 | ||
73 | nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control | 73 | nullarbor:~ # 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 | ||
78 | Command Language Reference | 78 | Command 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 | ||
175 | line | 179 | line |
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() |
231 | nullarbor:~ # echo -n 'func svc_process -p' > | 235 | nullarbor:~ # 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+. | ||
239 | nullarbor:~ # 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 | */ | ||
203 | static 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 | */ |
216 | static int ddebug_tokenize(char *buf, char *words[], int maxwords) | 204 | static 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; |