inet: factor out inet_send_prepare()
authorPaolo Abeni <pabeni@redhat.com>
Wed, 3 Jul 2019 14:06:52 +0000 (16:06 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Jul 2019 20:51:54 +0000 (13:51 -0700)
The same code is replicated verbatim in multiple places, and the next
patches will introduce an additional user for it. Factor out a
helper and use it where appropriate. No functional change intended.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_common.h
net/ipv4/af_inet.c

index 975901a..ae2ba89 100644 (file)
@@ -25,6 +25,7 @@ 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);
+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,
                      size_t size, int flags);
index 52bdb88..8421e2f 100644 (file)
@@ -784,10 +784,8 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr,
 }
 EXPORT_SYMBOL(inet_getname);
 
-int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
+int inet_send_prepare(struct sock *sk)
 {
-       struct sock *sk = sock->sk;
-
        sock_rps_record_flow(sk);
 
        /* We may need to bind the socket. */
@@ -795,6 +793,17 @@ int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
            inet_autobind(sk))
                return -EAGAIN;
 
+       return 0;
+}
+EXPORT_SYMBOL_GPL(inet_send_prepare);
+
+int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
+{
+       struct sock *sk = sock->sk;
+
+       if (unlikely(inet_send_prepare(sk)))
+               return -EAGAIN;
+
        return sk->sk_prot->sendmsg(sk, msg, size);
 }
 EXPORT_SYMBOL(inet_sendmsg);
@@ -804,11 +813,7 @@ ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
 {
        struct sock *sk = sock->sk;
 
-       sock_rps_record_flow(sk);
-
-       /* We may need to bind the socket. */
-       if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind &&
-           inet_autobind(sk))
+       if (unlikely(inet_send_prepare(sk)))
                return -EAGAIN;
 
        if (sk->sk_prot->sendpage)