mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Greg Banks <gnb@melbourne.sgi.com>, Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 60/61] Dynamic debug: allow simple quoting of words
Date: Tue, 24 Mar 2009 17:27:04 -0700	[thread overview]
Message-ID: <1237940825-22904-60-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <20090325001659.GA22461@kroah.com>

From: Greg Banks <gnb@melbourne.sgi.com>

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>
---
 Documentation/dynamic-debug-howto.txt |   20 +++++++++----
 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 6839482..674c566 100644
--- a/Documentation/dynamic-debug-howto.txt
+++ b/Documentation/dynamic-debug-howto.txt
@@ -49,10 +49,10 @@ via:
 
 nullarbor:~ # cat <debugfs>/dynamic_debug/control
 # filename:lineno [module]function flags format
-/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"
-/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"
-/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"
-/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"
+/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"
+/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 [svcxprt_rdma]svc_rdma_init - "\011max_inline       : %d\012"
+/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 [svcxprt_rdma]svc_rdma_init - "\011sq_depth         : %d\012"
+/usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 [svcxprt_rdma]svc_rdma_init - "\011max_requests     : %d\012"
 ...
 
 
@@ -72,7 +72,7 @@ you can view all the debug statement callsites with any non-default flags:
 
 nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control
 # filename:lineno [module]function flags format
-/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"
+/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"
 
 
 Command Language Reference
@@ -166,11 +166,15 @@ format
     entire format, only some part.  Whitespace and other
     special characters can be escaped using C octal character
     escape \ooo notation, e.g. the space character is \040.
+    Alternatively, the string can be enclosed in double quote
+    characters (") or single quote characters (').
     Examples:
 
     format svcrdma:	    // many of the NFS/RDMA server dprintks
     format readahead	    // some dprintks in the readahead cache
-    format nfsd:\040SETATTR // how to match a format with whitespace
+    format nfsd:\040SETATTR // one way to match a format with whitespace
+    format "nfsd: SETATTR"  // a neater way to match a format with whitespace
+    format 'nfsd: SETATTR'  // yet another way to match a format with whitespace
 
 line
     The given line number or range of line numbers is compared
@@ -230,3 +234,7 @@ nullarbor:~ # echo -n 'func svc_process +p' >
 // disable all 12 messages in the function svc_process()
 nullarbor:~ # echo -n 'func svc_process -p' >
 				<debugfs>/dynamic_debug/control
+
+// enable messages for NFS calls READ, READLINK, READDIR and READDIR+.
+nullarbor:~ # echo -n 'format "nfsd: READ" +p' >
+				<debugfs>/dynamic_debug/control
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 9e123ae..833139c 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -196,32 +196,45 @@ static void ddebug_change(const struct ddebug_query *query,
 }
 
 /*
- * Wrapper around strsep() to collapse the multiple empty tokens
- * that it returns when fed sequences of separator characters.
- * Now, if we had strtok_r()...
- */
-static inline char *nearly_strtok_r(char **p, const char *sep)
-{
-	char *r;
-
-	while ((r = strsep(p, sep)) != NULL && *r == '\0')
-		;
-	return r;
-}
-
-/*
  * Split the buffer `buf' into space-separated words.
- * Return the number of such words or <0 on error.
+ * Handles simple " and ' quoting, i.e. without nested,
+ * embedded or escaped \".  Return the number of words
+ * or <0 on error.
  */
 static int ddebug_tokenize(char *buf, char *words[], int maxwords)
 {
 	int nwords = 0;
 
-	while (nwords < maxwords &&
-	       (words[nwords] = nearly_strtok_r(&buf, " \t\r\n")) != NULL)
-		nwords++;
-	if (buf)
-		return -EINVAL;	/* ran out of words[] before bytes */
+	while (*buf) {
+		char *end;
+
+		/* Skip leading whitespace */
+		while (*buf && isspace(*buf))
+			buf++;
+		if (!*buf)
+			break;	/* oh, it was trailing whitespace */
+
+		/* Run `end' over a word, either whitespace separated or quoted */
+		if (*buf == '"' || *buf == '\'') {
+			int quote = *buf++;
+			for (end = buf ; *end && *end != quote ; end++)
+				;
+			if (!*end)
+				return -EINVAL;	/* unclosed quote */
+		} else {
+			for (end = buf ; *end && !isspace(*end) ; end++)
+				;
+			BUG_ON(end == buf);
+		}
+		/* Here `buf' is the start of the word, `end' is one past the end */
+
+		if (nwords == maxwords)
+			return -EINVAL;	/* ran out of words[] before bytes */
+		if (*end)
+			*end++ = '\0';	/* terminate the word */
+		words[nwords++] = buf;
+		buf = end;
+	}
 
 	if (verbose) {
 		int i;
-- 
1.6.2


  parent reply	other threads:[~2009-03-25  0:51 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-25  0:16 [GIT PATCH] driver core patches for 2.6.30 merge window Greg KH
2009-03-25  0:26 ` [PATCH 01/61] edac: struct device - replace bus_id with dev_name(), dev_set_name() Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 02/61] spi: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 03/61] video: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 04/61] zorro: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 05/61] mmc: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 06/61] mtd: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 07/61] pci: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 08/61] rapidio: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 09/61] s390: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 10/61] serial: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 11/61] sh: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 12/61] tc: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 13/61] pcmcia: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 14/61] rtc: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 15/61] net: " Greg Kroah-Hartman
2009-03-25  3:31   ` Stephen Hemminger
2009-03-25  4:18     ` Greg KH
2009-03-25  6:29   ` David Miller
2009-03-25  9:34     ` Kay Sievers
2009-03-25  0:26 ` [PATCH 16/61] drm: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 17/61] v4l: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 18/61] amba: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 19/61] dio: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 20/61] dma: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 21/61] eisa: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 22/61] gpio: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 23/61] mca: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 24/61] mfd: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 25/61] wimax: " Greg Kroah-Hartman
2009-03-25  1:22   ` Perez-Gonzalez, Inaky
2009-03-25  0:26 ` [PATCH 26/61] usb: " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 27/61] PS3: replace bus_id usage Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 28/61] USB: FHCI: use dev_name() in place of bus_id Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 29/61] driver core: get rid of struct device's bus_id string array Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 30/61] SYSFS: use standard magic.h for sysfs Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 31/61] sysfs: Take sysfs_mutex when fetching the root inode Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 32/61] driver core: check bus->match without holding device lock Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 33/61] platform: make better use of to_platform_{device,driver}() macros Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 34/61] platform: introduce module id table for platform devices Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 35/61] UIO: Add name attributes for mappings and port regions Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 36/61] uio: add the uio_aec driver Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 37/61] UIO: Take offset into account when determining number of pages that can be mapped Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 38/61] platform driver: fix incorrect use of 'platform_bus_type' with 'struct device_driver' Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 39/61] scsi/m68k: Kill NCR_700_detect() warnings Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 40/61] driver-core: do not register a driver with bus_type not registered Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 41/61] sysfs: sysfs_add_one WARNs with full path to duplicate filename Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 42/61] sysfs: reference sysfs_dirent from sysfs inodes Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 43/61] driver core: remove polling for driver_probe_done(v5) Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 44/61] driver core: create a private portion of struct device Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 45/61] driver core: move klist_children into private structure Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 46/61] driver core: move knode_driver " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 47/61] driver core: move knode_bus " Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 48/61] sysfs: don't block indefinitely for unmapped files Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 49/61] driver core: move platform_data into platform_device Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 50/61] driver core: fix passing platform_data Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 51/61] vcs: hook sysfs devices into object lifetime instead of "binding" Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 52/61] Driver core: implement uevent suppress in kobject Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 53/61] Driver core: some cleanup on drivers/base/sys.c Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 54/61] Driver core: Fix device_move() vs. dpm list ordering, v2 Greg Kroah-Hartman
2009-03-25  0:26 ` [PATCH 55/61] sysfs: only allow one scheduled removal callback per kobj Greg Kroah-Hartman
2009-03-25  0:27 ` [PATCH 56/61] kobject: don't block for each kobject_uevent Greg Kroah-Hartman
2009-03-25  0:27 ` [PATCH 57/61] sysfs: fix some bin_vm_ops errors Greg Kroah-Hartman
2009-03-25  0:27 ` [PATCH 58/61] dynamic debug: combine dprintk and dynamic printk Greg Kroah-Hartman
2009-03-25 10:50   ` Ingo Molnar
2009-03-25 13:20     ` Jason Baron
2009-03-25  0:27 ` [PATCH 59/61] dynamic debug: update docs Greg Kroah-Hartman
2009-03-25  0:27 ` Greg Kroah-Hartman [this message]
2009-03-25  0:27 ` [PATCH 61/61] Dynamic debug: fix pr_fmt() build error Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1237940825-22904-60-git-send-email-gregkh@suse.de \
    --to=gregkh@suse.de \
    --cc=gnb@melbourne.sgi.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®