printk: use ns_printk in iptable context
Subsystems (3)
RFC PATCH 5/5 printk: use ns_printk in iptable context
From: Libo Chen <[email protected]>
We add a syslog_ns pointer into net namespace for fix the iptable issue, and use ns_printk as getting syslog_ns parameter from skb->dev->nd_net->syslog_ns.
Signed-off-by Libo Chen <[email protected]>
Signed-off-by Xiang Rui <[email protected]>
--- include/linux/syslog_namespace.h | 7 ++++--- include/net/net_namespace.h | 7 +++++-- include/net/netfilter/xt_log.h | 7 +++++-- kernel/nsproxy.c | 21 +++++++++++---------- kernel/syslog_namespace.c | 6 ++++-- net/core/net_namespace.c | 12 ++++++++++-- net/netfilter/xt_LOG.c | 4 ++-- 7 files changed, 41 insertions(+), 23 deletions(-)
include/linux/syslog_namespace.h +4 -3
@@ -58,7 +58,7 @@ static inline struct syslog_namespace *current_syslog_ns(void)#ifdef CONFIG_SYSLOG_NS extern void free_syslog_ns (struct kref *kref);extern struct syslog_namespace *copy_syslog_ns (unsigned long flags, -struct task_struct *tsk); +struct syslog_namespace *syslog_ns);static inline struct syslog_namespace *get_syslog_ns (struct syslog_namespace *ns)
@@ -76,11 +76,12 @@ static inline void put_syslog_ns(struct syslog_namespace *ns)#else static inline struct syslog_namespace *copy_syslog_ns (unsigned long flags, -struct task_struct *tsk) +struct syslog_namespace *syslog_ns) {if (flags &CLONE_NEWSYSLOG )return ERR_PTR (-EINVAL ); -return tsk->nsproxy->syslog_ns; + +return syslog_ns; } static inline struct syslog_namespace *get_syslog_ns(
include/net/net_namespace.h +5 -2
@@ -108,6 +108,7 @@ struct net {#ifdef CONFIG_XFRM struct netns_xfrm xfrm;#endif +struct syslog_namespace *syslog_ns;struct netns_ipvs *ipvs;struct sock *diag_nlsk;atomic_t rt_genid;
@@ -127,10 +128,12 @@ struct net {extern struct net init_net;#ifdef CONFIG_NET -extern struct net *copy_net_ns (unsigned long flags,struct net *net_ns); +extern struct net *copy_net_ns (unsigned long flags,struct net *net_ns, +struct syslog_namespace *syslog_ns);#else /* CONFIG_NET */ -static inline struct net *copy_net_ns (unsigned long flags,struct net *net_ns) +static inline struct net *copy_net_ns (unsigned long flags,struct net *net_ns, +struct syslog_namespace *syslog_ns); {/* There is nothing to copy so this is a noop */ return net_ns;
include/net/netfilter/xt_log.h +5 -2
@@ -39,11 +39,14 @@ static struct sbuff *sb_open(void)return m; } -static void sb_close (struct sbuff *m) +static void sb_close (struct sbuff *m,struct sk_buff *skb) { m->buf[m->count] =0 ; +#ifdef CONFIG_NET_NS +ns_printk (skb->dev->nd_net->syslog_ns,"%s\n" , m->buf); +#else printk ("%s\n" , m->buf); - +#endif if (likely (m != &emergency))kfree (m);else {
kernel/nsproxy.c +11 -10
@@ -92,24 +92,25 @@ static struct nsproxy *create_new_namespaces(unsigned long flags, goto out_pid; } - new_nsp->net_ns =copy_net_ns (flags, tsk->nsproxy->net_ns); -if (IS_ERR (new_nsp->net_ns)) { - err =PTR_ERR (new_nsp->net_ns); - goto out_net; - } - - new_nsp->syslog_ns =copy_syslog_ns (flags, tsk); + new_nsp->syslog_ns =copy_syslog_ns (flags, tsk->nsproxy->syslog_ns);if (IS_ERR (new_nsp->syslog_ns)) { err =PTR_ERR (new_nsp->syslog_ns); goto out_syslog; } + new_nsp->net_ns =copy_net_ns (flags, tsk->nsproxy->net_ns, + new_nsp->syslog_ns); +if (IS_ERR (new_nsp->net_ns)) { + err =PTR_ERR (new_nsp->net_ns); + goto out_net; + } +return new_nsp; -out_syslog: -if (new_nsp->net_ns) -put_net (new_nsp->net_ns); out_net: +if (new_nsp->syslog_ns) +put_net (new_nsp->syslog_ns); +out_syslog:if (new_nsp->pid_ns)put_pid_ns (new_nsp->pid_ns); out_pid:
kernel/syslog_namespace.c +4 -2
@@ -9,6 +9,7 @@#include <linux/module.h> #include <linux/bootmem.h> #include <linux/syslog_namespace.h> +#include <net/net_namespace.h> static char __log_buf[__LOG_BUF_LEN]__aligned(LOG_ALIGN) ;
@@ -46,10 +47,11 @@ static struct syslog_namespace *create_syslog_ns(unsigned int buf_len) }struct syslog_namespace *copy_syslog_ns (unsigned long flags, -struct task_struct *tsk) +struct syslog_namespace *syslog_ns) {if (!(flags &CLONE_NEWSYSLOG )) -return get_syslog_ns (tsk->nsproxy->syslog_ns); +return get_syslog_ns (syslog_ns); +return create_syslog_ns (CONTAINER_BUF_LEN ); }
net/core/net_namespace.c +10 -2
@@ -15,6 +15,7 @@#include <linux/export.h> #include <net/net_namespace.h> #include <net/netns/generic.h> +#include <linux/syslog_namespace.h> /* * Our network namespace constructor/destructor lists
@@ -29,6 +30,7 @@ EXPORT_SYMBOL_GPL(net_namespace_list);struct net init_net = { .dev_base_head =LIST_HEAD_INIT (init_net.dev_base_head), + .syslog_ns = &init_syslog_ns };EXPORT_SYMBOL (init_net);
@@ -232,7 +234,8 @@ void net_drop_ns(void *p)net_free (ns); } -struct net *copy_net_ns (unsigned long flags,struct net *old_net) +struct net *copy_net_ns (unsigned long flags,struct net *old_net, +struct syslog_namespace *syslog_ns) {struct net *net;int rv;
@@ -255,6 +258,9 @@ struct net *copy_net_ns(unsigned long flags, struct net *old_net)net_drop_ns (net);return ERR_PTR (rv); } + + net->syslog_ns =get_syslog_ns (syslog_ns); +return net; }
@@ -308,6 +314,7 @@ static void cleanup_net(struct work_struct *work)/* Finally it is safe to free my network namespace structure */ list_for_each_entry_safe (net, tmp, &net_exit_list, exit_list) {list_del_init (&net->exit_list); +put_syslog_ns (net->syslog_ns);net_drop_ns (net); } }
@@ -347,7 +354,8 @@ struct net *get_net_ns_by_fd(int fd) }#else -struct net *copy_net_ns (unsigned long flags,struct net *old_net) +struct net *copy_net_ns (unsigned long flags,struct net *old_net, +struct syslog_namespace *syslog_ns) {if (flags &CLONE_NEWNET )return ERR_PTR (-EINVAL );
net/netfilter/xt_LOG.c +2 -2
@@ -486,7 +486,7 @@ ipt_log_packet(u_int8_t pf,dump_ipv4_packet (m, loginfo, skb,0 ); -sb_close (m); +sb_close (m, skb); }#if IS_ENABLED (CONFIG_IP6_NF_IPTABLES )
@@ -810,7 +810,7 @@ ip6t_log_packet(u_int8_t pf,dump_ipv6_packet (m, loginfo, skb,skb_network_offset (skb),1 ); - sb_close(m); + sb_close(m, skb); }#endif
Signature · 1 line
1.7.1