OSDN Git Service

inet: factor out locked section of inet_accept() in a new helper
authorPaolo Abeni <pabeni@redhat.com>
Wed, 17 May 2023 19:16:14 +0000 (12:16 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 19 May 2023 03:06:31 +0000 (20:06 -0700)
No functional changes intended. The new helper will be used
by the MPTCP protocol in the next patch to avoid duplicating
a few LoC.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/inet_common.h
net/ipv4/af_inet.c

index cec453c..77f4b0e 100644 (file)
@@ -31,6 +31,8 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,
                       int addr_len, int flags);
 int inet_accept(struct socket *sock, struct socket *newsock, int flags,
                bool kern);
+void __inet_accept(struct socket *sock, struct socket *newsock,
+                  struct sock *newsk);
 int inet_send_prepare(struct sock *sk);
 int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
 ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
index c4aab3a..9466500 100644 (file)
@@ -730,6 +730,20 @@ int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
 }
 EXPORT_SYMBOL(inet_stream_connect);
 
+void __inet_accept(struct socket *sock, struct socket *newsock, struct sock *newsk)
+{
+       sock_rps_record_flow(newsk);
+       WARN_ON(!((1 << newsk->sk_state) &
+                 (TCPF_ESTABLISHED | TCPF_SYN_RECV |
+                 TCPF_CLOSE_WAIT | TCPF_CLOSE)));
+
+       if (test_bit(SOCK_SUPPORT_ZC, &sock->flags))
+               set_bit(SOCK_SUPPORT_ZC, &newsock->flags);
+       sock_graft(newsk, newsock);
+
+       newsock->state = SS_CONNECTED;
+}
+
 /*
  *     Accept a pending connection. The TCP layer now gives BSD semantics.
  */
@@ -743,24 +757,12 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags,
        /* IPV6_ADDRFORM can change sk->sk_prot under us. */
        sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, flags, &err, kern);
        if (!sk2)
-               goto do_err;
+               return err;
 
        lock_sock(sk2);
-
-       sock_rps_record_flow(sk2);
-       WARN_ON(!((1 << sk2->sk_state) &
-                 (TCPF_ESTABLISHED | TCPF_SYN_RECV |
-                 TCPF_CLOSE_WAIT | TCPF_CLOSE)));
-
-       if (test_bit(SOCK_SUPPORT_ZC, &sock->flags))
-               set_bit(SOCK_SUPPORT_ZC, &newsock->flags);
-       sock_graft(sk2, newsock);
-
-       newsock->state = SS_CONNECTED;
-       err = 0;
+       __inet_accept(sock, newsock, sk2);
        release_sock(sk2);
-do_err:
-       return err;
+       return 0;
 }
 EXPORT_SYMBOL(inet_accept);