diff options
Diffstat (limited to 'net/sunrpc/clnt.c')
| -rw-r--r-- | net/sunrpc/clnt.c | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index cb49898a5a58..7f79fb7dc6a0 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -2638,6 +2638,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt,  {  	struct rpc_xprt_switch *xps;  	struct rpc_xprt *xprt; +	unsigned long reconnect_timeout;  	unsigned char resvport;  	int ret = 0; @@ -2649,6 +2650,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt,  		return -EAGAIN;  	}  	resvport = xprt->resvport; +	reconnect_timeout = xprt->max_reconnect_timeout;  	rcu_read_unlock();  	xprt = xprt_create_transport(xprtargs); @@ -2657,6 +2659,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt,  		goto out_put_switch;  	}  	xprt->resvport = resvport; +	xprt->max_reconnect_timeout = reconnect_timeout;  	rpc_xprt_switch_set_roundrobin(xps);  	if (setup) { @@ -2673,6 +2676,27 @@ out_put_switch:  }  EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt); +static int +rpc_xprt_cap_max_reconnect_timeout(struct rpc_clnt *clnt, +		struct rpc_xprt *xprt, +		void *data) +{ +	unsigned long timeout = *((unsigned long *)data); + +	if (timeout < xprt->max_reconnect_timeout) +		xprt->max_reconnect_timeout = timeout; +	return 0; +} + +void +rpc_cap_max_reconnect_timeout(struct rpc_clnt *clnt, unsigned long timeo) +{ +	rpc_clnt_iterate_for_each_xprt(clnt, +			rpc_xprt_cap_max_reconnect_timeout, +			&timeo); +} +EXPORT_SYMBOL_GPL(rpc_cap_max_reconnect_timeout); +  #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)  static void rpc_show_header(void)  {  |