diff options
Diffstat (limited to 'net/ceph/messenger.c')
| -rw-r--r-- | net/ceph/messenger.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index b9796750034..24c5eea8c45 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -915,7 +915,6 @@ static int prepare_write_connect(struct ceph_connection *con)  	con->out_connect.authorizer_len = auth ?  		cpu_to_le32(auth->authorizer_buf_len) : 0; -	con_out_kvec_reset(con);  	con_out_kvec_add(con, sizeof (con->out_connect),  					&con->out_connect);  	if (auth && auth->authorizer_buf_len) @@ -1557,6 +1556,7 @@ static int process_connect(struct ceph_connection *con)  			return -1;  		}  		con->auth_retry = 1; +		con_out_kvec_reset(con);  		ret = prepare_write_connect(con);  		if (ret < 0)  			return ret; @@ -1577,6 +1577,7 @@ static int process_connect(struct ceph_connection *con)  		       ENTITY_NAME(con->peer_name),  		       ceph_pr_addr(&con->peer_addr.in_addr));  		reset_connection(con); +		con_out_kvec_reset(con);  		ret = prepare_write_connect(con);  		if (ret < 0)  			return ret; @@ -1601,6 +1602,7 @@ static int process_connect(struct ceph_connection *con)  		     le32_to_cpu(con->out_connect.connect_seq),  		     le32_to_cpu(con->in_reply.connect_seq));  		con->connect_seq = le32_to_cpu(con->in_reply.connect_seq); +		con_out_kvec_reset(con);  		ret = prepare_write_connect(con);  		if (ret < 0)  			return ret; @@ -1617,6 +1619,7 @@ static int process_connect(struct ceph_connection *con)  		     le32_to_cpu(con->in_reply.global_seq));  		get_global_seq(con->msgr,  			       le32_to_cpu(con->in_reply.global_seq)); +		con_out_kvec_reset(con);  		ret = prepare_write_connect(con);  		if (ret < 0)  			return ret; @@ -2135,7 +2138,11 @@ more:  		BUG_ON(con->state != CON_STATE_CONNECTING);  		con->state = CON_STATE_NEGOTIATING; -		/* Banner is good, exchange connection info */ +		/* +		 * Received banner is good, exchange connection info. +		 * Do not reset out_kvec, as sending our banner raced +		 * with receiving peer banner after connect completed. +		 */  		ret = prepare_write_connect(con);  		if (ret < 0)  			goto out;  |