printk: add ns_printk for specific syslog_ns
Subsystems (3)
RFC PATCH 4/5 printk: add ns_printk for specific syslog_ns
From: Libo Chen <[email protected]>
In some context such as iptable, we can not get correct syslog_ns by current_syslog_ns, because we get init_syslog_ns instead of syslog_ns belonged to container.
We add a new interface ns_printk,and give it an parameter syslog_ns.
Signed-off-by Libo Chen <[email protected]>
Signed-off-by Xiang Rui <[email protected]>
--- include/linux/printk.h | 1 + kernel/printk.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 0 deletions(-)
include/linux/printk.h +1 -0
@@ -119,6 +119,7 @@ asmlinkage int printk_emit(int facility, int level, asmlinkage __printf(1, 2) __cold int printk(const char *fmt, ...); +int ns_printk(struct syslog_namespace *syslog_ns, const char *fmt, ...);/* * Special printk facility for scheduler use only, _DO_NOT_USE_ !
kernel/printk.c +37 -0
@@ -1681,6 +1681,43 @@ asmlinkage int printk(const char *fmt, ...) }EXPORT_SYMBOL (printk); +/** +* ns_printk - print a kernel message in syslog_ns +* @syslog_ns: syslog namespace +* @fmt: format string +* +* This is ns_printk(). +* It can be called from container context. We add a param +* syslog_ns to record current syslog namespace,because +* we can't get the correct syslog_ns from current_syslog_ns +* in some context,e.g. iptable. +* +* See the vsnprintf() documentation for format string extensions over C99. +**/ +asmlinkage int ns_printk(struct syslog_namespace *syslog_ns, +const char *fmt, ...) +{ +va_list args; +int r; + +if (!syslog_ns) + syslog_ns =current_syslog_ns (); + +#ifdef CONFIG_KGDB_KDB +if (unlikely (kdb_trap_printk)) { +va_start (args, fmt); + r =vkdb_printf (fmt, args); +va_end (args); +return r; + } +#endif +va_start (args, fmt); + r =vprintk_emit (0 ,-1 ,NULL ,0 , fmt, args, syslog_ns); +va_end (args); + +return r; +} +EXPORT_SYMBOL (ns_printk);#else /* CONFIG_PRINTK */ #define LOG_LINE_MAX 0
Signature · 1 line
1.7.1