diff options
Diffstat (limited to 'net/sunrpc/xprtsock.c')
| -rw-r--r-- | net/sunrpc/xprtsock.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 5cbb404c4cd..29c71e645b2 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -467,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,  	int err, sent = 0;  	if (unlikely(!sock)) -		return -ENOTCONN; +		return -ENOTSOCK;  	clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);  	if (base != 0) { @@ -577,6 +577,8 @@ static int xs_udp_send_request(struct rpc_task *task)  				req->rq_svec->iov_base,  				req->rq_svec->iov_len); +	if (!xprt_bound(xprt)) +		return -ENOTCONN;  	status = xs_sendpages(transport->sock,  			      xs_addr(xprt),  			      xprt->addrlen, xdr, @@ -594,6 +596,10 @@ static int xs_udp_send_request(struct rpc_task *task)  	}  	switch (status) { +	case -ENOTSOCK: +		status = -ENOTCONN; +		/* Should we call xs_close() here? */ +		break;  	case -EAGAIN:  		xs_nospace(task);  		break; @@ -693,6 +699,10 @@ static int xs_tcp_send_request(struct rpc_task *task)  	}  	switch (status) { +	case -ENOTSOCK: +		status = -ENOTCONN; +		/* Should we call xs_close() here? */ +		break;  	case -EAGAIN:  		xs_nospace(task);  		break; @@ -1523,7 +1533,7 @@ static void xs_udp_connect_worker4(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	/* Start by resetting any existing state */ @@ -1564,7 +1574,7 @@ static void xs_udp_connect_worker6(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	/* Start by resetting any existing state */ @@ -1648,6 +1658,9 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)  		write_unlock_bh(&sk->sk_callback_lock);  	} +	if (!xprt_bound(xprt)) +		return -ENOTCONN; +  	/* Tell the socket layer to start connecting... */  	xprt->stat.connect_count++;  	xprt->stat.connect_start = jiffies; @@ -1668,7 +1681,7 @@ static void xs_tcp_connect_worker4(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	if (!sock) { @@ -1728,7 +1741,7 @@ static void xs_tcp_connect_worker6(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	if (!sock) {  |