diff options
author | Thomas Renninger <trenn@suse.de> | 2010-08-06 10:11:01 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:16:42 -0400 |
commit | fd89cfb8718753459fcea3fe6103d19de5e86c9b (patch) | |
tree | 8e05f06fc4954d55b75ec8c8dfeacce3c198f264 | |
parent | f6f94e2ab1b33f0082ac22d71f66385a60d8157f (diff) |
Dynamic Debug: Split out query string parsing/setup from proc_write
The parsing and applying of dynamic debug strings is not only useful for
/sys/../dynamic_debug/control write access, but can also be used for
boot parameter parsing.
The boot parameter is introduced in a follow up patch.
Signed-off-by: Thomas Renninger <trenn@suse.de>
Acked-by: jbaron@redhat.com
Acked-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | lib/dynamic_debug.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 02afc2533728..84d103c474e4 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
@@ -429,6 +429,27 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp, | |||
429 | return 0; | 429 | return 0; |
430 | } | 430 | } |
431 | 431 | ||
432 | static int ddebug_exec_query(char *query_string) | ||
433 | { | ||
434 | unsigned int flags = 0, mask = 0; | ||
435 | struct ddebug_query query; | ||
436 | #define MAXWORDS 9 | ||
437 | int nwords; | ||
438 | char *words[MAXWORDS]; | ||
439 | |||
440 | nwords = ddebug_tokenize(query_string, words, MAXWORDS); | ||
441 | if (nwords <= 0) | ||
442 | return -EINVAL; | ||
443 | if (ddebug_parse_query(words, nwords-1, &query)) | ||
444 | return -EINVAL; | ||
445 | if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) | ||
446 | return -EINVAL; | ||
447 | |||
448 | /* actually go and implement the change */ | ||
449 | ddebug_change(&query, flags, mask); | ||
450 | return 0; | ||
451 | } | ||
452 | |||
432 | /* | 453 | /* |
433 | * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the | 454 | * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the |
434 | * command text from userspace, parses and executes it. | 455 | * command text from userspace, parses and executes it. |
@@ -436,12 +457,8 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp, | |||
436 | static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf, | 457 | static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf, |
437 | size_t len, loff_t *offp) | 458 | size_t len, loff_t *offp) |
438 | { | 459 | { |
439 | unsigned int flags = 0, mask = 0; | ||
440 | struct ddebug_query query; | ||
441 | #define MAXWORDS 9 | ||
442 | int nwords; | ||
443 | char *words[MAXWORDS]; | ||
444 | char tmpbuf[256]; | 460 | char tmpbuf[256]; |
461 | int ret; | ||
445 | 462 | ||
446 | if (len == 0) | 463 | if (len == 0) |
447 | return 0; | 464 | return 0; |
@@ -455,16 +472,9 @@ static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf, | |||
455 | printk(KERN_INFO "%s: read %d bytes from userspace\n", | 472 | printk(KERN_INFO "%s: read %d bytes from userspace\n", |
456 | __func__, (int)len); | 473 | __func__, (int)len); |
457 | 474 | ||
458 | nwords = ddebug_tokenize(tmpbuf, words, MAXWORDS); | 475 | ret = ddebug_exec_query(tmpbuf); |
459 | if (nwords <= 0) | 476 | if (ret) |
460 | return -EINVAL; | 477 | return ret; |
461 | if (ddebug_parse_query(words, nwords-1, &query)) | ||
462 | return -EINVAL; | ||
463 | if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) | ||
464 | return -EINVAL; | ||
465 | |||
466 | /* actually go and implement the change */ | ||
467 | ddebug_change(&query, flags, mask); | ||
468 | 478 | ||
469 | *offp += len; | 479 | *offp += len; |
470 | return len; | 480 | return len; |