Commit 88dd37b1 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

nvme/tcp: fix lack of qpair flags clear



Issue found by code analysis.

A problematic scenario: after the qpair is enabled, the icreq_send_ack
flag is set. On reset, a reconnect occurs, but the flag is not cleared.
This may lead to unexpected or invalid behavior.

The fix ensures the flag is always cleared during the initialization
path. It is not cleared during disconnect, as we may still need to
respect the in_connect_poll flag.

Change-Id: I2365b02dc7f1752bb515a74b6db45fcff69239e2
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26140


Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
parent 45d47f68
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2397,6 +2397,7 @@ nvme_tcp_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpa
	struct nvme_tcp_poll_group *tgroup;

	tqpair = nvme_tcp_qpair(qpair);
	memset(&tqpair->flags, 0, sizeof(tqpair->flags));

	if (!tqpair->sock) {
		rc = nvme_tcp_qpair_connect_sock(ctrlr, qpair);
+2 −1
Original line number Diff line number Diff line
@@ -1419,7 +1419,6 @@ test_nvme_tcp_ctrlr_connect_qpair(void)
					    sizeof(struct spdk_nvme_tcp_common_pdu_hdr) - 1;
	tqpair->recv_pdu->hdr.ic_resp.maxh2cdata = 4096;
	tqpair->recv_pdu->hdr.ic_resp.cpda = 1;
	tqpair->flags.icreq_send_ack = 1;
	tqpair->qpair.ctrlr->opts.header_digest = true;
	tqpair->qpair.ctrlr->opts.data_digest = true;
	TAILQ_INIT(&tqpair->send_queue);
@@ -1427,6 +1426,8 @@ test_nvme_tcp_ctrlr_connect_qpair(void)
	rc = nvme_tcp_ctrlr_connect_qpair(&ctrlr, qpair);
	CU_ASSERT(rc == 0);

	tqpair->flags.icreq_send_ack = 1;

	/* skip NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY state */
	/* assume already received the icresp */
	tqpair->recv_state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH;