aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Perches <joe@perches.com>2012-07-30 17:40:09 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-30 20:25:13 -0400
commitacc8fa41ad31c576cdbc569cc3e0e443b1b98b44 (patch)
tree74b4072203646bd7432249e57f5a1505fa346b5e
parentcdf53441368cc02ee4aa8a8343a5dc25132836f0 (diff)
printk: add generic functions to find KERN_<LEVEL> headers
The current form of a KERN_<LEVEL> is "<.>". Add printk_get_level and printk_skip_level functions to handle these formats. These functions centralize tests of KERN_<LEVEL> so a future modification can change the KERN_<LEVEL> style and shorten the number of bytes consumed by these headers. [akpm@linux-foundation.org: fix build error and warning] Signed-off-by: Joe Perches <joe@perches.com> Cc: Kay Sievers <kay.sievers@vrfy.org> Cc: Wu Fengguang <wfg@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/printk.h26
-rw-r--r--kernel/printk.c14
2 files changed, 35 insertions, 5 deletions
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 1bec2f7a2d42..6e12e1f09047 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -24,6 +24,32 @@ extern const char linux_proc_banner[];
24 */ 24 */
25#define KERN_CONT "<c>" 25#define KERN_CONT "<c>"
26 26
27static inline int printk_get_level(const char *buffer)
28{
29 if (buffer[0] == '<' && buffer[1] && buffer[2] == '>') {
30 switch (buffer[1]) {
31 case '0' ... '7':
32 case 'd': /* KERN_DEFAULT */
33 case 'c': /* KERN_CONT */
34 return buffer[1];
35 }
36 }
37 return 0;
38}
39
40static inline const char *printk_skip_level(const char *buffer)
41{
42 if (printk_get_level(buffer)) {
43 switch (buffer[1]) {
44 case '0' ... '7':
45 case 'd': /* KERN_DEFAULT */
46 case 'c': /* KERN_CONT */
47 return buffer + 3;
48 }
49 }
50 return buffer;
51}
52
27extern int console_printk[]; 53extern int console_printk[];
28 54
29#define console_loglevel (console_printk[0]) 55#define console_loglevel (console_printk[0])
diff --git a/kernel/printk.c b/kernel/printk.c
index 852269adad25..0d882a2f231e 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -1487,6 +1487,7 @@ asmlinkage int vprintk_emit(int facility, int level,
1487 size_t text_len; 1487 size_t text_len;
1488 enum log_flags lflags = 0; 1488 enum log_flags lflags = 0;
1489 unsigned long flags; 1489 unsigned long flags;
1490 int kern_level;
1490 int this_cpu; 1491 int this_cpu;
1491 int printed_len = 0; 1492 int printed_len = 0;
1492 1493
@@ -1543,17 +1544,20 @@ asmlinkage int vprintk_emit(int facility, int level,
1543 } 1544 }
1544 1545
1545 /* strip syslog prefix and extract log level or control flags */ 1546 /* strip syslog prefix and extract log level or control flags */
1546 if (text[0] == '<' && text[1] && text[2] == '>') { 1547 kern_level = printk_get_level(text);
1547 switch (text[1]) { 1548 if (kern_level) {
1549 const char *end_of_header = printk_skip_level(text);
1550 switch (kern_level) {
1548 case '0' ... '7': 1551 case '0' ... '7':
1549 if (level == -1) 1552 if (level == -1)
1550 level = text[1] - '0'; 1553 level = kern_level - '0';
1551 case 'd': /* KERN_DEFAULT */ 1554 case 'd': /* KERN_DEFAULT */
1552 lflags |= LOG_PREFIX; 1555 lflags |= LOG_PREFIX;
1553 case 'c': /* KERN_CONT */ 1556 case 'c': /* KERN_CONT */
1554 text += 3; 1557 break;
1555 text_len -= 3;
1556 } 1558 }
1559 text_len -= end_of_header - text;
1560 text = (char *)end_of_header;
1557 } 1561 }
1558 1562
1559 if (level == -1) 1563 if (level == -1)