From: Libo Chen <clbchenlibo.chen@xxxxxxxxxx> 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 <clbchenlibo.chen@xxxxxxxxxx> Signed-off-by: Xiang Rui <rui.xiang@xxxxxxxxxx> --- include/linux/printk.h | 1 + kernel/printk.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 0 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index e0c60d9..444d229 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -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_ ! diff --git a/kernel/printk.c b/kernel/printk.c index 2ef9c46..85a9965 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -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 -- 1.7.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers