aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)