diff options
Diffstat (limited to 'net/rds/tcp_connect.c')
| -rw-r--r-- | net/rds/tcp_connect.c | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index d6839d96d539..46f74dad0e16 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -66,17 +66,17 @@ void rds_tcp_state_change(struct sock *sk)  		 * RDS connection as RDS_CONN_UP until the reconnect,  		 * to avoid RDS datagram loss.  		 */ -		if (cp->cp_conn->c_laddr > cp->cp_conn->c_faddr && +		if (!IS_CANONICAL(cp->cp_conn->c_laddr, cp->cp_conn->c_faddr) &&  		    rds_conn_path_transition(cp, RDS_CONN_CONNECTING,  					     RDS_CONN_ERROR)) { -			rds_conn_path_drop(cp); +			rds_conn_path_drop(cp, false);  		} else {  			rds_connect_path_complete(cp, RDS_CONN_CONNECTING);  		}  		break;  	case TCP_CLOSE_WAIT:  	case TCP_CLOSE: -		rds_conn_path_drop(cp); +		rds_conn_path_drop(cp, false);  	default:  		break;  	} @@ -135,7 +135,6 @@ int rds_tcp_conn_path_connect(struct rds_conn_path *cp)  	ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),  				 O_NONBLOCK); -	cp->cp_outgoing = 1;  	rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret);  	if (ret == -EINPROGRESS)  		ret = 0; @@ -171,6 +170,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)  		 cp->cp_conn, tc, sock);  	if (sock) { +		if (cp->cp_conn->c_destroy_in_prog) +			rds_tcp_set_linger(sock);  		sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);  		lock_sock(sock->sk);  		rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */ |