Messages in this thread Patch in this message | | | From | Petr Mladek <> | Subject | [PATCH 3/4] printk/btrfs: Handle more message headers | Date | Thu, 27 Oct 2016 17:52:53 +0200 |
| |
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 <pmladek@suse.com> --- 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
| |