|
|
@@ -293,12 +293,14 @@ static void gtp_encap_destroy(struct sock *sk)
|
|
|
{
|
|
|
struct gtp_dev *gtp;
|
|
|
|
|
|
- gtp = rcu_dereference_sk_user_data(sk);
|
|
|
+ lock_sock(sk);
|
|
|
+ gtp = sk->sk_user_data;
|
|
|
if (gtp) {
|
|
|
udp_sk(sk)->encap_type = 0;
|
|
|
rcu_assign_sk_user_data(sk, NULL);
|
|
|
sock_put(sk);
|
|
|
}
|
|
|
+ release_sock(sk);
|
|
|
}
|
|
|
|
|
|
static void gtp_encap_disable_sock(struct sock *sk)
|
|
|
@@ -800,7 +802,8 @@ static struct sock *gtp_encap_enable_socket(int fd, int type,
|
|
|
goto out_sock;
|
|
|
}
|
|
|
|
|
|
- if (rcu_dereference_sk_user_data(sock->sk)) {
|
|
|
+ lock_sock(sock->sk);
|
|
|
+ if (sock->sk->sk_user_data) {
|
|
|
sk = ERR_PTR(-EBUSY);
|
|
|
goto out_sock;
|
|
|
}
|
|
|
@@ -816,6 +819,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int type,
|
|
|
setup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg);
|
|
|
|
|
|
out_sock:
|
|
|
+ release_sock(sock->sk);
|
|
|
sockfd_put(sock);
|
|
|
return sk;
|
|
|
}
|