All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Petr Mládek" <pmladek@suse.cz>
To: Alex Elder <elder@linaro.org>
Cc: akpm@linux-foundation.org, bp@suse.de, john.stultz@linaro.org,
	jack@suse.cz, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/4] printk: honor LOG_PREFIX in devkmsg_read()
Date: Thu, 17 Jul 2014 12:14:13 +0200	[thread overview]
Message-ID: <20140717101413.GR6774@pathway.suse.cz> (raw)
In-Reply-To: <1405531620-9983-3-git-send-email-elder@linaro.org>

On Wed 2014-07-16 12:26:58, Alex Elder wrote:
> In devkmsg_read(), a variable "cont" holds a character that's used
> to indicate whether a given log line is a "continuation", that is,
> whether a log record should be merged with the one before or after
> it.  If a record should be merged with its successor (but not its
> predecessor) that character is 'c'.  And the line following such a
> 'c' log record is normally marked with a '+' to show it is continues
> its predecessor.  Any other cases are marked '-', indicating the
> log record stands on its own.
> 
> There is an exception.  If a log record is marked LOG_PREFIX, it
> indicates that this record represents a new log entry, implicitly
> terminating the predecessor--even if the predecessor would otherwise
> have been continued.  So a record marked LOG_PREFIX (that is not
> also marked LOG_CONT) should have '-' for its "cont" variable.
> 
> The logic that determines this "continuation" character has a bug
> that gets that exceptional case wrong.
> 
> The specific case that produces the wrong result is when all of
> these conditions are non-zero:
>     user->prev & LOG_CONT
>     msg->flags & LOG_PREFIX
>     msg->flags & LOG_CONT
> The bug is that despite the message's LOG_PREFIX flag, the
> "cont" character is getting set to '+' rather than 'c'.
> 
> The problem is that the message's LOG_PREFIX flag is getting
> ignored if its LOG_CONT flag is also set.  Rearrange the logic
> here to produce the correct result.
> 
> The following table concisely defines the problem:
> 
>      prev | msg  | msg  ||"cont"
>      CONT |PREFIX| CONT || char
>     ------+------+------++------
>      clear| clear| clear||  '-'
>      clear| clear|  set ||  'c'
>      clear|  set | clear||  '-'
>      clear|  set |  set ||  'c'
>       set | clear| clear||  '+'
>       set |  set |  set ||  '+'
	       ^^^ typo, it should be:

       set |  clear |  set ||  '+'

>       set |  set | clear||  '-'
>       set |  set |  set ||  '+'      <-- should be 'c'
> 
> Signed-off-by: Alex Elder <elder@linaro.org>
> ---
>  kernel/printk/printk.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index 301ade3..9e9cf93 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -572,7 +572,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
>  	struct printk_log *msg;
>  	u64 ts_usec;
>  	size_t i;
> -	char cont = '-';
> +	char cont;
>  	size_t len;
>  	ssize_t ret;
>  
> @@ -619,11 +619,12 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
>  	 * better readable output. 'c' in the record flags mark the first
>  	 * fragment of a line, '+' the following.
>  	 */
> -	if (msg->flags & LOG_CONT && !(user->prev & LOG_CONT))
> -		cont = 'c';
> -	else if ((msg->flags & LOG_CONT) ||
> -		 ((user->prev & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
> +	if (user->prev & LOG_CONT && !(msg->flags & LOG_PREFIX))
>  		cont = '+';
> +	else if (msg->flags & LOG_CONT)
> +		cont = 'c';
> +	else
> +		cont = '-';

Makes sense. Prefix should be always on a new line.

Reviewed-by: Petr Mladek <pmladek@suse.cz>

Best Regards,
Petr

>  	len = sprintf(user->buf, "%u,%llu,%llu,%c;",
>  		      (msg->facility << 3) | msg->level,
> -- 
> 1.9.1
> 

  reply	other threads:[~2014-07-17 10:14 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-16 17:26 [PATCH 0/4] printk: start simplifying some flags Alex Elder
2014-07-16 17:26 ` [PATCH 1/4] printk: LOG_CONT and LOG_NEWLINE are separate Alex Elder
2014-07-17  8:39   ` Petr Mládek
2014-07-17 12:11     ` Alex Elder
2014-07-17 14:46       ` Petr Mládek
2014-07-17 16:19         ` Alex Elder
2014-07-18  8:49           ` Petr Mládek
2014-07-17 12:31     ` Alex Elder
2014-07-16 17:26 ` [PATCH 2/4] printk: honor LOG_PREFIX in devkmsg_read() Alex Elder
2014-07-17 10:14   ` Petr Mládek [this message]
2014-07-17 12:19     ` Alex Elder
2014-07-16 17:26 ` [PATCH 3/4] printk: honor LOG_PREFIX in msg_print_text() Alex Elder
2014-07-17  9:40   ` Petr Mládek
2014-07-17 12:18     ` Alex Elder
2014-07-17 13:42       ` Alex Elder
2014-07-16 17:27 ` [PATCH 4/4] printk: correct some more typos Alex Elder
2014-07-17 11:46   ` Petr Mládek
2014-07-17 12:22     ` Alex Elder
2014-07-16 17:55 ` [PATCH 0/4] printk: start simplifying some flags Joe Perches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140717101413.GR6774@pathway.suse.cz \
    --to=pmladek@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=bp@suse.de \
    --cc=elder@linaro.org \
    --cc=jack@suse.cz \
    --cc=john.stultz@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.