Re: [PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread David Miller
From: Andrew Vagin 
Date: Mon, 16 Jul 2012 18:28:49 +0400

> Before this patch sock_diag works for init_net only and dumps
> information about sockets from all namespaces.
> 
> This patch expands sock_diag for all name-spaces.
> It creates a netlink kernel socket for each netns and filters
> data during dumping.
> 
> v2: filter accoding with netns in all places
> remove an unused variable.
> 
> Signed-off-by: Andrew Vagin 

Applied, thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread Pavel Emelyanov
On 07/16/2012 06:28 PM, Andrew Vagin wrote:
> Before this patch sock_diag works for init_net only and dumps
> information about sockets from all namespaces.
> 
> This patch expands sock_diag for all name-spaces.
> It creates a netlink kernel socket for each netns and filters
> data during dumping.
> 
> v2: filter accoding with netns in all places
> remove an unused variable.
> 
> Cc: "David S. Miller" 
> Cc: Alexey Kuznetsov 
> Cc: James Morris 
> Cc: Hideaki YOSHIFUJI 
> Cc: Patrick McHardy 
> Cc: Pavel Emelyanov 
> CC: Eric Dumazet 
> Cc: linux-kernel@vger.kernel.org
> Cc: net...@vger.kernel.org
> Signed-off-by: Andrew Vagin 

Acked-by: Pavel Emelyanov 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread Andrew Vagin
Before this patch sock_diag works for init_net only and dumps
information about sockets from all namespaces.

This patch expands sock_diag for all name-spaces.
It creates a netlink kernel socket for each netns and filters
data during dumping.

v2: filter accoding with netns in all places
remove an unused variable.

Cc: "David S. Miller" 
Cc: Alexey Kuznetsov 
Cc: James Morris 
Cc: Hideaki YOSHIFUJI 
Cc: Patrick McHardy 
Cc: Pavel Emelyanov 
CC: Eric Dumazet 
Cc: linux-kernel@vger.kernel.org
Cc: net...@vger.kernel.org
Signed-off-by: Andrew Vagin 
---
 include/linux/sock_diag.h   |1 -
 include/net/net_namespace.h |1 +
 net/core/sock_diag.c|   27 ---
 net/ipv4/inet_diag.c|   21 -
 net/ipv4/udp_diag.c |   10 +++---
 net/unix/diag.c |9 +++--
 6 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h
index 6793fac..e3e395a 100644
--- a/include/linux/sock_diag.h
+++ b/include/linux/sock_diag.h
@@ -44,6 +44,5 @@ void sock_diag_save_cookie(void *sk, __u32 *cookie);
 
 int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr);
 
-extern struct sock *sock_diag_nlsk;
 #endif /* KERNEL */
 #endif
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index ac9195e..ae1cd6c 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -101,6 +101,7 @@ struct net {
struct netns_xfrm   xfrm;
 #endif
struct netns_ipvs   *ipvs;
+   struct sock *diag_nlsk;
 };
 
 
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c
index 07a29eb..9d8755e 100644
--- a/net/core/sock_diag.c
+++ b/net/core/sock_diag.c
@@ -166,23 +166,36 @@ static void sock_diag_rcv(struct sk_buff *skb)
mutex_unlock(_diag_mutex);
 }
 
-struct sock *sock_diag_nlsk;
-EXPORT_SYMBOL_GPL(sock_diag_nlsk);
-
-static int __init sock_diag_init(void)
+static int __net_init diag_net_init(struct net *net)
 {
struct netlink_kernel_cfg cfg = {
.input  = sock_diag_rcv,
};
 
-   sock_diag_nlsk = netlink_kernel_create(_net, NETLINK_SOCK_DIAG,
+   net->diag_nlsk = netlink_kernel_create(net, NETLINK_SOCK_DIAG,
   THIS_MODULE, );
-   return sock_diag_nlsk == NULL ? -ENOMEM : 0;
+   return net->diag_nlsk == NULL ? -ENOMEM : 0;
+}
+
+static void __net_exit diag_net_exit(struct net *net)
+{
+   netlink_kernel_release(net->diag_nlsk);
+   net->diag_nlsk = NULL;
+}
+
+static struct pernet_operations diag_net_ops = {
+   .init = diag_net_init,
+   .exit = diag_net_exit,
+};
+
+static int __init sock_diag_init(void)
+{
+   return register_pernet_subsys(_net_ops);
 }
 
 static void __exit sock_diag_exit(void)
 {
-   netlink_kernel_release(sock_diag_nlsk);
+   unregister_pernet_subsys(_net_ops);
 }
 
 module_init(sock_diag_init);
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 38064a2..570e61f 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -272,16 +272,17 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo 
*hashinfo, struct sk_buff *in_s
int err;
struct sock *sk;
struct sk_buff *rep;
+   struct net *net = sock_net(in_skb->sk);
 
err = -EINVAL;
if (req->sdiag_family == AF_INET) {
-   sk = inet_lookup(_net, hashinfo, req->id.idiag_dst[0],
+   sk = inet_lookup(net, hashinfo, req->id.idiag_dst[0],
 req->id.idiag_dport, req->id.idiag_src[0],
 req->id.idiag_sport, req->id.idiag_if);
}
 #if IS_ENABLED(CONFIG_IPV6)
else if (req->sdiag_family == AF_INET6) {
-   sk = inet6_lookup(_net, hashinfo,
+   sk = inet6_lookup(net, hashinfo,
  (struct in6_addr *)req->id.idiag_dst,
  req->id.idiag_dport,
  (struct in6_addr *)req->id.idiag_src,
@@ -317,7 +318,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, 
struct sk_buff *in_s
nlmsg_free(rep);
goto out;
}
-   err = netlink_unicast(sock_diag_nlsk, rep, NETLINK_CB(in_skb).pid,
+   err = netlink_unicast(net->diag_nlsk, rep, NETLINK_CB(in_skb).pid,
  MSG_DONTWAIT);
if (err > 0)
err = 0;
@@ -724,6 +725,7 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, 
struct sk_buff *skb,
 {
int i, num;
int s_i, s_num;
+   struct net *net = sock_net(skb->sk);
 
s_i = cb->args[1];
s_num = num = cb->args[2];
@@ -743,6 +745,9 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, 
struct sk_buff *skb,
sk_nulls_for_each(sk, node, >head) {
struct inet_sock *inet = inet_sk(sk);
 
+

[PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread Andrew Vagin
Before this patch sock_diag works for init_net only and dumps
information about sockets from all namespaces.

This patch expands sock_diag for all name-spaces.
It creates a netlink kernel socket for each netns and filters
data during dumping.

v2: filter accoding with netns in all places
remove an unused variable.

Cc: David S. Miller da...@davemloft.net
Cc: Alexey Kuznetsov kuz...@ms2.inr.ac.ru
Cc: James Morris jmor...@namei.org
Cc: Hideaki YOSHIFUJI yoshf...@linux-ipv6.org
Cc: Patrick McHardy ka...@trash.net
Cc: Pavel Emelyanov xe...@parallels.com
CC: Eric Dumazet eric.duma...@gmail.com
Cc: linux-kernel@vger.kernel.org
Cc: net...@vger.kernel.org
Signed-off-by: Andrew Vagin ava...@openvz.org
---
 include/linux/sock_diag.h   |1 -
 include/net/net_namespace.h |1 +
 net/core/sock_diag.c|   27 ---
 net/ipv4/inet_diag.c|   21 -
 net/ipv4/udp_diag.c |   10 +++---
 net/unix/diag.c |9 +++--
 6 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h
index 6793fac..e3e395a 100644
--- a/include/linux/sock_diag.h
+++ b/include/linux/sock_diag.h
@@ -44,6 +44,5 @@ void sock_diag_save_cookie(void *sk, __u32 *cookie);
 
 int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attr);
 
-extern struct sock *sock_diag_nlsk;
 #endif /* KERNEL */
 #endif
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index ac9195e..ae1cd6c 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -101,6 +101,7 @@ struct net {
struct netns_xfrm   xfrm;
 #endif
struct netns_ipvs   *ipvs;
+   struct sock *diag_nlsk;
 };
 
 
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c
index 07a29eb..9d8755e 100644
--- a/net/core/sock_diag.c
+++ b/net/core/sock_diag.c
@@ -166,23 +166,36 @@ static void sock_diag_rcv(struct sk_buff *skb)
mutex_unlock(sock_diag_mutex);
 }
 
-struct sock *sock_diag_nlsk;
-EXPORT_SYMBOL_GPL(sock_diag_nlsk);
-
-static int __init sock_diag_init(void)
+static int __net_init diag_net_init(struct net *net)
 {
struct netlink_kernel_cfg cfg = {
.input  = sock_diag_rcv,
};
 
-   sock_diag_nlsk = netlink_kernel_create(init_net, NETLINK_SOCK_DIAG,
+   net-diag_nlsk = netlink_kernel_create(net, NETLINK_SOCK_DIAG,
   THIS_MODULE, cfg);
-   return sock_diag_nlsk == NULL ? -ENOMEM : 0;
+   return net-diag_nlsk == NULL ? -ENOMEM : 0;
+}
+
+static void __net_exit diag_net_exit(struct net *net)
+{
+   netlink_kernel_release(net-diag_nlsk);
+   net-diag_nlsk = NULL;
+}
+
+static struct pernet_operations diag_net_ops = {
+   .init = diag_net_init,
+   .exit = diag_net_exit,
+};
+
+static int __init sock_diag_init(void)
+{
+   return register_pernet_subsys(diag_net_ops);
 }
 
 static void __exit sock_diag_exit(void)
 {
-   netlink_kernel_release(sock_diag_nlsk);
+   unregister_pernet_subsys(diag_net_ops);
 }
 
 module_init(sock_diag_init);
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 38064a2..570e61f 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -272,16 +272,17 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo 
*hashinfo, struct sk_buff *in_s
int err;
struct sock *sk;
struct sk_buff *rep;
+   struct net *net = sock_net(in_skb-sk);
 
err = -EINVAL;
if (req-sdiag_family == AF_INET) {
-   sk = inet_lookup(init_net, hashinfo, req-id.idiag_dst[0],
+   sk = inet_lookup(net, hashinfo, req-id.idiag_dst[0],
 req-id.idiag_dport, req-id.idiag_src[0],
 req-id.idiag_sport, req-id.idiag_if);
}
 #if IS_ENABLED(CONFIG_IPV6)
else if (req-sdiag_family == AF_INET6) {
-   sk = inet6_lookup(init_net, hashinfo,
+   sk = inet6_lookup(net, hashinfo,
  (struct in6_addr *)req-id.idiag_dst,
  req-id.idiag_dport,
  (struct in6_addr *)req-id.idiag_src,
@@ -317,7 +318,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, 
struct sk_buff *in_s
nlmsg_free(rep);
goto out;
}
-   err = netlink_unicast(sock_diag_nlsk, rep, NETLINK_CB(in_skb).pid,
+   err = netlink_unicast(net-diag_nlsk, rep, NETLINK_CB(in_skb).pid,
  MSG_DONTWAIT);
if (err  0)
err = 0;
@@ -724,6 +725,7 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, 
struct sk_buff *skb,
 {
int i, num;
int s_i, s_num;
+   struct net *net = sock_net(skb-sk);
 
s_i = cb-args[1];
s_num = num = cb-args[2];
@@ -743,6 +745,9 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, 
struct 

Re: [PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread Pavel Emelyanov
On 07/16/2012 06:28 PM, Andrew Vagin wrote:
 Before this patch sock_diag works for init_net only and dumps
 information about sockets from all namespaces.
 
 This patch expands sock_diag for all name-spaces.
 It creates a netlink kernel socket for each netns and filters
 data during dumping.
 
 v2: filter accoding with netns in all places
 remove an unused variable.
 
 Cc: David S. Miller da...@davemloft.net
 Cc: Alexey Kuznetsov kuz...@ms2.inr.ac.ru
 Cc: James Morris jmor...@namei.org
 Cc: Hideaki YOSHIFUJI yoshf...@linux-ipv6.org
 Cc: Patrick McHardy ka...@trash.net
 Cc: Pavel Emelyanov xe...@parallels.com
 CC: Eric Dumazet eric.duma...@gmail.com
 Cc: linux-kernel@vger.kernel.org
 Cc: net...@vger.kernel.org
 Signed-off-by: Andrew Vagin ava...@openvz.org

Acked-by: Pavel Emelyanov xe...@parallels.com
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] net-next: make sock diag per-namespace (v2)

2012-07-16 Thread David Miller
From: Andrew Vagin ava...@openvz.org
Date: Mon, 16 Jul 2012 18:28:49 +0400

 Before this patch sock_diag works for init_net only and dumps
 information about sockets from all namespaces.
 
 This patch expands sock_diag for all name-spaces.
 It creates a netlink kernel socket for each netns and filters
 data during dumping.
 
 v2: filter accoding with netns in all places
 remove an unused variable.
 
 Signed-off-by: Andrew Vagin ava...@openvz.org

Applied, thanks.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/