|
@@ -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;
|