From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S943398AbcJ0Pxd (ORCPT ); Thu, 27 Oct 2016 11:53:33 -0400 Received: from mx2.suse.de ([195.135.220.15]:48398 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932442AbcJ0Px3 (ORCPT ); Thu, 27 Oct 2016 11:53:29 -0400 From: Petr Mladek To: Linus Torvalds Cc: Joe Perches , Andrew Morton , Sergey Senozhatsky , Steven Rostedt , Jason Wessel , Jaroslav Kysela , Takashi Iwai , Chris Mason , Josef Bacik , David Sterba , linux-kernel@vger.kernel.org, Petr Mladek Subject: [PATCH 3/4] printk/btrfs: Handle more message headers Date: Thu, 27 Oct 2016 17:52:53 +0200 Message-Id: <1477583574-30988-4-git-send-email-pmladek@suse.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1477583574-30988-1-git-send-email-pmladek@suse.com> References: <1477583574-30988-1-git-send-email-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The commit 4bcc595ccd80decb4245096e ("printk: reinstate KERN_CONT for printing continuation lines") allows to define more message headers for a single message. The motivation is that continuous lines might get mixed. Therefore it make sense to define the right log level for every piece of a cont line. The current btrfs_printk() macros do not support continuous lines at the moment. But better be prepared for a custom messages and avoid potential "lvl" buffer overflow. This patch iterates over the entire message header. It is interested only into the message level like the original code. Note that 3 bytes should be enough for the header buffer. I am not sure where the 4 bytes came from. Maybe it expected that both KERN_SOH and the log level strings end with '\0' but they are concatenated. Also I fixed the default ratelimit level. It looked very strange when it was different from the default log level. Signed-off-by: Petr Mladek --- fs/btrfs/super.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 74ed5aae6cea..2d836c676895 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -202,27 +202,29 @@ void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) { struct super_block *sb = fs_info->sb; - char lvl[4]; + char lvl[3]; struct va_format vaf; va_list args; - const char *type = logtypes[4]; + const char *type = NULL; int kern_level; struct ratelimit_state *ratelimit; va_start(args, fmt); - kern_level = printk_get_level(fmt); - if (kern_level) { - size_t size = printk_skip_level(fmt) - fmt; - memcpy(lvl, fmt, size); - lvl[size] = '\0'; - fmt += size; - type = logtypes[kern_level - '0']; - ratelimit = &printk_limits[kern_level - '0']; - } else { + while ((kern_level = printk_get_level(fmt)) != 0) { + if (kern_level >= '0' || kern_level <= '7') { + memcpy(lvl, fmt, 2); + lvl[2] = '\0'; + type = logtypes[kern_level - '0']; + ratelimit = &printk_limits[kern_level - '0']; + } + fmt += 2; + } + + if (!type) { *lvl = '\0'; - /* Default to debug output */ - ratelimit = &printk_limits[7]; + type = logtypes[4]; + ratelimit = &printk_limits[4]; } vaf.fmt = fmt; -- 1.8.5.6