diff options
-rw-r--r-- | include/linux/printk.h | 26 | ||||
-rw-r--r-- | kernel/printk.c | 14 |
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 | ||
27 | static 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 | |||
40 | static 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 | |||
27 | extern int console_printk[]; | 53 | extern 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) |