@@ -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);
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.xue@windriver.com> --- net/ipv4/udp_tunnel.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)