diff options
Diffstat (limited to 'net/sunrpc/xprtsock.c')
| -rw-r--r-- | net/sunrpc/xprtsock.c | 56 | 
1 files changed, 53 insertions, 3 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 890b03f8d877..400567243f84 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -1014,9 +1014,6 @@ static void xs_udp_data_ready(struct sock *sk, int len)  	UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS); -	/* Something worked... */ -	dst_confirm(skb_dst(skb)); -  	xprt_adjust_cwnd(task, copied);  	xprt_complete_rqst(task, copied); @@ -1895,6 +1892,8 @@ static void xs_local_setup_socket(struct work_struct *work)  	if (xprt->shutdown)  		goto out; +	current->flags |= PF_FSTRANS; +  	clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);  	status = __sock_create(xprt->xprt_net, AF_LOCAL,  					SOCK_STREAM, 0, &sock, 1); @@ -1928,8 +1927,48 @@ static void xs_local_setup_socket(struct work_struct *work)  out:  	xprt_clear_connecting(xprt);  	xprt_wake_pending_tasks(xprt, status); +	current->flags &= ~PF_FSTRANS; +} + +#ifdef CONFIG_SUNRPC_SWAP +static void xs_set_memalloc(struct rpc_xprt *xprt) +{ +	struct sock_xprt *transport = container_of(xprt, struct sock_xprt, +			xprt); + +	if (xprt->swapper) +		sk_set_memalloc(transport->inet);  } +/** + * xs_swapper - Tag this transport as being used for swap. + * @xprt: transport to tag + * @enable: enable/disable + * + */ +int xs_swapper(struct rpc_xprt *xprt, int enable) +{ +	struct sock_xprt *transport = container_of(xprt, struct sock_xprt, +			xprt); +	int err = 0; + +	if (enable) { +		xprt->swapper++; +		xs_set_memalloc(xprt); +	} else if (xprt->swapper) { +		xprt->swapper--; +		sk_clear_memalloc(transport->inet); +	} + +	return err; +} +EXPORT_SYMBOL_GPL(xs_swapper); +#else +static void xs_set_memalloc(struct rpc_xprt *xprt) +{ +} +#endif +  static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)  {  	struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); @@ -1954,6 +1993,8 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)  		transport->sock = sock;  		transport->inet = sk; +		xs_set_memalloc(xprt); +  		write_unlock_bh(&sk->sk_callback_lock);  	}  	xs_udp_do_set_buffer_size(xprt); @@ -1970,6 +2011,8 @@ static void xs_udp_setup_socket(struct work_struct *work)  	if (xprt->shutdown)  		goto out; +	current->flags |= PF_FSTRANS; +  	/* Start by resetting any existing state */  	xs_reset_transport(transport);  	sock = xs_create_sock(xprt, transport, @@ -1988,6 +2031,7 @@ static void xs_udp_setup_socket(struct work_struct *work)  out:  	xprt_clear_connecting(xprt);  	xprt_wake_pending_tasks(xprt, status); +	current->flags &= ~PF_FSTRANS;  }  /* @@ -2078,6 +2122,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)  	if (!xprt_bound(xprt))  		goto out; +	xs_set_memalloc(xprt); +  	/* Tell the socket layer to start connecting... */  	xprt->stat.connect_count++;  	xprt->stat.connect_start = jiffies; @@ -2113,6 +2159,8 @@ static void xs_tcp_setup_socket(struct work_struct *work)  	if (xprt->shutdown)  		goto out; +	current->flags |= PF_FSTRANS; +  	if (!sock) {  		clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);  		sock = xs_create_sock(xprt, transport, @@ -2162,6 +2210,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)  	case -EINPROGRESS:  	case -EALREADY:  		xprt_clear_connecting(xprt); +		current->flags &= ~PF_FSTRANS;  		return;  	case -EINVAL:  		/* Happens, for instance, if the user specified a link @@ -2174,6 +2223,7 @@ out_eagain:  out:  	xprt_clear_connecting(xprt);  	xprt_wake_pending_tasks(xprt, status); +	current->flags &= ~PF_FSTRANS;  }  /**  | 
