IB/iser: Fix login with authentication
Subsystems (2)
PATCH 1/1 IB/iser: Fix login with authentication
The iSER Initiator uses two types of receive buffers:
- one big login buffer posted by iser_post_recvl();
- several small message buffers posted by iser_post_recvm().
The login buffer is used at the login phase and full feature phase in the discovery session. It may take a few requests and responses to complete the login phase. The message buffers are only used in the normal operational session at the full feature phase.
After the commit referred in the fixes line, the login operation fails if the authentication is enabled. That happens because the Initiator posts a small receive buffer after the first response from Target. So, the next send operation fails because Target's second response does not fit into the small receive buffer.
This commit adds additional checks to prevent posting small receive buffers until the full feature phase.
--- drivers/infiniband/ulp/iser/iser_initiator.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/iser/iser_initiator.c +6 -1
@@ -537,6 +537,7 @@ void iser_login_rsp(struct ib_cq *cq, struct ib_wc *wc)struct iscsi_hdr *hdr;char *data;int length; +bool full_feature_phase;if (unlikely (wc->status !=IB_WC_SUCCESS )) {iser_err_comp (wc,"login_rsp" );
@@ -550,6 +551,9 @@ void iser_login_rsp(struct ib_cq *cq, struct ib_wc *wc) hdr = desc->rsp +sizeof (struct iser_ctrl ); data = desc->rsp +ISER_HEADERS_LEN ; length = wc->byte_len -ISER_HEADERS_LEN ; + full_feature_phase = ((hdr->flags &ISCSI_FULL_FEATURE_PHASE ) == +ISCSI_FULL_FEATURE_PHASE ) && + (hdr->flags &ISCSI_FLAG_CMD_FINAL );iser_dbg ("op 0x%x itt 0x%x dlen %d\n" , hdr->opcode, hdr->itt, length);
@@ -560,7 +564,8 @@ void iser_login_rsp(struct ib_cq *cq, struct ib_wc *wc) desc->rsp_dma,ISER_RX_LOGIN_SIZE , DMA_FROM_DEVICE); -if (iser_conn->iscsi_conn->session->discovery_sess) +if (!full_feature_phase || + iser_conn->iscsi_conn->session->discovery_sess)return ;/* Post the first RX buffer that is skipped in iser_post_rx_bufs() */
Signature · 1 line
2.34.1
Leon Romanovsky
AppliedQuoted 19 lines · Sergey Gorenko
The iSER Initiator uses two types of receive buffers:
- one big login buffer posted by
iser_post_recvl();
- several small message buffers posted byiser_post_recvm().The login buffer is used at the login phase and full feature phase in the discovery session. It may take a few requests and responses to complete the login phase. The message buffers are only used in the normal operational session at the full feature phase.
After the commit referred in the fixes line, the login operation fails if the authentication is enabled. That happens because the Initiator posts a small receive buffer after the first response from Target. So, the next send operation fails because Target's second response does not fit into the small receive buffer.
This commit adds additional checks to prevent posting small receive buffers until the full feature phase.
Quoted 7 lines
Fixes 39b169ea0d36 ("IB/iser: Fix RNR errors")Signed-off-by Sergey Gorenko <[email protected]>Reviewed-by Max Gurtovoy <[email protected]>--- drivers/infiniband/ulp/iser/iser_initiator.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
Thanks, applied to -rc.