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