There is no the race between put_net() and kernel socket creation, so
it's unnecessary to switch namespace for a kernel tunnel socket from
init_net to its desirable one.

Signed-off-by: Ying Xue <ying....@windriver.com>
---
 net/ipv4/udp_tunnel.c |   10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/udp_tunnel.c b/net/ipv4/udp_tunnel.c
index 6bb98cc..720ab82 100644
--- a/net/ipv4/udp_tunnel.c
+++ b/net/ipv4/udp_tunnel.c
@@ -15,11 +15,11 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg 
*cfg,
        struct socket *sock = NULL;
        struct sockaddr_in udp_addr;
 
-       err = sock_create_kern(AF_INET, SOCK_DGRAM, 0, &sock);
+       err = __sock_create(net, AF_INET, SOCK_DGRAM, 0, &sock, 1);
        if (err < 0)
                goto error;
 
-       sk_change_net(sock->sk, net);
+       put_net(sock_net(sock->sk));
 
        udp_addr.sin_family = AF_INET;
        udp_addr.sin_addr = cfg->local_ip;
@@ -47,7 +47,8 @@ int udp_sock_create4(struct net *net, struct udp_port_cfg 
*cfg,
 error:
        if (sock) {
                kernel_sock_shutdown(sock, SHUT_RDWR);
-               sk_release_kernel(sock->sk);
+               get_net(sock_net(sock->sk));
+               sock_release(sock);
        }
        *sockp = NULL;
        return err;
@@ -101,7 +102,8 @@ void udp_tunnel_sock_release(struct socket *sock)
 {
        rcu_assign_sk_user_data(sock->sk, NULL);
        kernel_sock_shutdown(sock, SHUT_RDWR);
-       sk_release_kernel(sock->sk);
+       get_net(sock_net(sock->sk));
+       sock_release(sock);
 }
 EXPORT_SYMBOL_GPL(udp_tunnel_sock_release);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to