SUNRPC: Refactor TCP socket timeout code into a helper function
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 8 Feb 2017 16:17:53 +0000 (11:17 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 9 Feb 2017 18:49:04 +0000 (13:49 -0500)
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtsock.c

index af392d9..c8ac649 100644 (file)
@@ -2235,6 +2235,31 @@ static void xs_tcp_shutdown(struct rpc_xprt *xprt)
                xs_reset_transport(transport);
 }
 
+static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt,
+               struct socket *sock)
+{
+       unsigned int keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ);
+       unsigned int keepcnt = xprt->timeout->to_retries + 1;
+       unsigned int opt_on = 1;
+       unsigned int timeo;
+
+       /* TCP Keepalive options */
+       kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
+                       (char *)&opt_on, sizeof(opt_on));
+       kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,
+                       (char *)&keepidle, sizeof(keepidle));
+       kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL,
+                       (char *)&keepidle, sizeof(keepidle));
+       kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT,
+                       (char *)&keepcnt, sizeof(keepcnt));
+
+       /* TCP user timeout (see RFC5482) */
+       timeo = jiffies_to_msecs(xprt->timeout->to_initval) *
+               (xprt->timeout->to_retries + 1);
+       kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
+                       (char *)&timeo, sizeof(timeo));
+}
+
 static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
 {
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
@@ -2242,22 +2267,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
 
        if (!transport->inet) {
                struct sock *sk = sock->sk;
-               unsigned int keepidle = xprt->timeout->to_initval / HZ;
-               unsigned int keepcnt = xprt->timeout->to_retries + 1;
-               unsigned int opt_on = 1;
-               unsigned int timeo;
                unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;
 
-               /* TCP Keepalive options */
-               kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
-                               (char *)&opt_on, sizeof(opt_on));
-               kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,
-                               (char *)&keepidle, sizeof(keepidle));
-               kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL,
-                               (char *)&keepidle, sizeof(keepidle));
-               kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT,
-                               (char *)&keepcnt, sizeof(keepcnt));
-
                /* Avoid temporary address, they are bad for long-lived
                 * connections such as NFS mounts.
                 * RFC4941, section 3.6 suggests that:
@@ -2268,11 +2279,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
                kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES,
                                (char *)&addr_pref, sizeof(addr_pref));
 
-               /* TCP user timeout (see RFC5482) */
-               timeo = jiffies_to_msecs(xprt->timeout->to_initval) *
-                       (xprt->timeout->to_retries + 1);
-               kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
-                               (char *)&timeo, sizeof(timeo));
+               xs_tcp_set_socket_timeouts(xprt, sock);
 
                write_lock_bh(&sk->sk_callback_lock);