printk: reinstate KERN_CONT for printing continuation lines
[cascardo/linux.git] / kernel / printk / printk.c
index eea6dbc..7b44980 100644 (file)
@@ -655,11 +655,8 @@ static ssize_t msg_print_ext_header(char *buf, size_t size,
         * better readable output. 'c' in the record flags mark the first
         * fragment of a line, '+' the following.
         */
-       if (msg->flags & LOG_CONT && !(prev_flags & LOG_CONT))
-               cont = 'c';
-       else if ((msg->flags & LOG_CONT) ||
-                ((prev_flags & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
-               cont = '+';
+       if (msg->flags & LOG_CONT)
+               cont = (prev_flags & LOG_CONT) ? '+' : 'c';
 
        return scnprintf(buf, size, "%u,%llu,%llu,%c;",
                       (msg->facility << 3) | msg->level, seq, ts_usec, cont);
@@ -1819,10 +1816,9 @@ asmlinkage int vprintk_emit(int facility, int level,
 
        /* strip kernel syslog prefix and extract log level or control flags */
        if (facility == 0) {
-               int kern_level = printk_get_level(text);
+               int kern_level;
 
-               if (kern_level) {
-                       const char *end_of_header = printk_skip_level(text);
+               while ((kern_level = printk_get_level(text)) != 0) {
                        switch (kern_level) {
                        case '0' ... '7':
                                if (level == LOGLEVEL_DEFAULT)
@@ -1830,14 +1826,13 @@ asmlinkage int vprintk_emit(int facility, int level,
                                /* fallthrough */
                        case 'd':       /* KERN_DEFAULT */
                                lflags |= LOG_PREFIX;
+                               break;
+                       case 'c':       /* KERN_CONT */
+                               lflags |= LOG_CONT;
                        }
-                       /*
-                        * No need to check length here because vscnprintf
-                        * put '\0' at the end of the string. Only valid and
-                        * newly printed level is detected.
-                        */
-                       text_len -= end_of_header - text;
-                       text = (char *)end_of_header;
+
+                       text_len -= 2;
+                       text += 2;
                }
        }
 
@@ -1852,7 +1847,7 @@ asmlinkage int vprintk_emit(int facility, int level,
                 * Flush the conflicting buffer. An earlier newline was missing,
                 * or another task also prints continuation lines.
                 */
-               if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
+               if (cont.len && (!(lflags & LOG_CONT) || cont.owner != current))
                        cont_flush(LOG_NEWLINE);
 
                /* buffer line if possible, otherwise store it right away */
@@ -1874,7 +1869,7 @@ asmlinkage int vprintk_emit(int facility, int level,
                 * a newline, flush and append the newline.
                 */
                if (cont.len) {
-                       if (cont.owner == current && !(lflags & LOG_PREFIX))
+                       if (cont.owner == current && (lflags & LOG_CONT))
                                stored = cont_add(facility, level, text,
                                                  text_len);
                        cont_flush(LOG_NEWLINE);