1

kernel/panic: convert print_tainted() to use struct seq_buf internally

Convert print_tainted() to use struct seq_buf internally in order to be
more aware of the buffer constraints as well as make it easier to extend
in follow-up work.

Link: https://lkml.kernel.org/r/cb6006fa7c0f82a6b6885e8eea2920fcdc4fc9d0.1717146197.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Jani Nikula 2024-05-31 12:04:55 +03:00 committed by Andrew Morton
parent f4b6242338
commit aff1db0e4e

View File

@ -35,6 +35,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/context_tracking.h> #include <linux/context_tracking.h>
#include <linux/seq_buf.h>
#include <trace/events/error_report.h> #include <trace/events/error_report.h>
#include <asm/sections.h> #include <asm/sections.h>
@ -496,6 +497,25 @@ const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = {
[ TAINT_TEST ] = { 'N', ' ', true }, [ TAINT_TEST ] = { 'N', ' ', true },
}; };
static void print_tainted_seq(struct seq_buf *s)
{
int i;
if (!tainted_mask) {
seq_buf_puts(s, "Not tainted");
return;
}
seq_buf_printf(s, "Tainted: ");
for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
const struct taint_flag *t = &taint_flags[i];
bool is_set = test_bit(i, &tainted_mask);
char c = is_set ? t->c_true : t->c_false;
seq_buf_putc(s, c);
}
}
/** /**
* print_tainted - return a string to represent the kernel taint state. * print_tainted - return a string to represent the kernel taint state.
* *
@ -507,25 +527,15 @@ const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = {
const char *print_tainted(void) const char *print_tainted(void)
{ {
static char buf[TAINT_FLAGS_COUNT + sizeof("Tainted: ")]; static char buf[TAINT_FLAGS_COUNT + sizeof("Tainted: ")];
char *s; struct seq_buf s;
int i;
BUILD_BUG_ON(ARRAY_SIZE(taint_flags) != TAINT_FLAGS_COUNT); BUILD_BUG_ON(ARRAY_SIZE(taint_flags) != TAINT_FLAGS_COUNT);
if (!tainted_mask) { seq_buf_init(&s, buf, sizeof(buf));
snprintf(buf, sizeof(buf), "Not tainted");
return buf;
}
s = buf + sprintf(buf, "Tainted: "); print_tainted_seq(&s);
for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
const struct taint_flag *t = &taint_flags[i];
*s++ = test_bit(i, &tainted_mask) ?
t->c_true : t->c_false;
}
*s = 0;
return buf; return seq_buf_str(&s);
} }
int test_taint(unsigned flag) int test_taint(unsigned flag)