Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d1b8c62 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker
Browse files

SUNRPC: Refactor TCP socket timeout code into a helper function

parent d23bb113
Loading
Loading
Loading
Loading
+26 −19
Original line number Diff line number Diff line
@@ -2235,18 +2235,13 @@ static void xs_tcp_shutdown(struct rpc_xprt *xprt)
		xs_reset_transport(transport);
}

static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt,
		struct socket *sock)
{
	struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
	int ret = -ENOTCONN;

	if (!transport->inet) {
		struct sock *sk = sock->sk;
		unsigned int keepidle = xprt->timeout->to_initval / HZ;
	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;
		unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;

	/* TCP Keepalive options */
	kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
@@ -2258,6 +2253,22 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
	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);
	int ret = -ENOTCONN;

	if (!transport->inet) {
		struct sock *sk = sock->sk;
		unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;

		/* 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);