mptcp: avoid additional indirection in mptcp_listen()
[platform/kernel/linux-starfive.git] / net / mptcp / protocol.c
index 5b4d6f0..d8b75fb 100644 (file)
@@ -3720,6 +3720,7 @@ static int mptcp_listen(struct socket *sock, int backlog)
        struct mptcp_sock *msk = mptcp_sk(sock->sk);
        struct sock *sk = sock->sk;
        struct socket *ssock;
+       struct sock *ssk;
        int err;
 
        pr_debug("msk=%p", msk);
@@ -3736,15 +3737,19 @@ static int mptcp_listen(struct socket *sock, int backlog)
                goto unlock;
        }
 
+       ssk = msk->first;
        inet_sk_state_store(sk, TCP_LISTEN);
        sock_set_flag(sk, SOCK_RCU_FREE);
 
-       err = READ_ONCE(ssock->ops)->listen(ssock, backlog);
-       inet_sk_state_store(sk, inet_sk_state_load(ssock->sk));
+       lock_sock(ssk);
+       err = __inet_listen_sk(ssk, backlog);
+       release_sock(ssk);
+       inet_sk_state_store(sk, inet_sk_state_load(ssk));
+
        if (!err) {
                sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
-               mptcp_copy_inaddrs(sk, ssock->sk);
-               mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);
+               mptcp_copy_inaddrs(sk, ssk);
+               mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED);
        }
 
 unlock: