lib/iscsi: Store and use rsp_pdu->data_buf_len for login

A local variable alloc_len had been used to hold the data buffer
length of the response PDU. But it's more intuitive to use
rsp_pdu->data_buf_len instead.

The subsequent two patches will replace related functions accordingly.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I48f96a542d6c177ba1d8409ff0230fa61c11e154
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471468
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ziye Yang <ziye.yang@intel.com>
This commit is contained in:
Shuhei Matsumoto 2019-10-16 16:58:48 +09:00 committed by Jim Harris
parent 71f8a7d742
commit 2d1e009679

View File

@ -1790,10 +1790,11 @@ iscsi_op_login_phase_none(struct spdk_iscsi_conn *conn,
static int static int
iscsi_op_login_rsp_init(struct spdk_iscsi_conn *conn, iscsi_op_login_rsp_init(struct spdk_iscsi_conn *conn,
struct spdk_iscsi_pdu *pdu, struct spdk_iscsi_pdu *rsp_pdu, struct spdk_iscsi_pdu *pdu, struct spdk_iscsi_pdu *rsp_pdu,
int *alloc_len, int *cid) int *cid)
{ {
struct iscsi_bhs_login_req *reqh; struct iscsi_bhs_login_req *reqh;
struct iscsi_bhs_login_rsp *rsph; struct iscsi_bhs_login_rsp *rsph;
uint32_t alloc_len;
rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs; rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
rsph->opcode = ISCSI_OP_LOGIN_RSP; rsph->opcode = ISCSI_OP_LOGIN_RSP;
@ -1803,18 +1804,19 @@ iscsi_op_login_rsp_init(struct spdk_iscsi_conn *conn,
/* Default MaxRecvDataSegmentLength - RFC3720(12.12) */ /* Default MaxRecvDataSegmentLength - RFC3720(12.12) */
if (conn->MaxRecvDataSegmentLength < 8192) { if (conn->MaxRecvDataSegmentLength < 8192) {
*alloc_len = 8192; alloc_len = 8192;
} else { } else {
*alloc_len = conn->MaxRecvDataSegmentLength; alloc_len = conn->MaxRecvDataSegmentLength;
} }
rsp_pdu->data = calloc(1, *alloc_len); rsp_pdu->data = calloc(1, alloc_len);
if (!rsp_pdu->data) { if (!rsp_pdu->data) {
SPDK_ERRLOG("calloc() failed for data segment\n"); SPDK_ERRLOG("calloc() failed for data segment\n");
rsph->status_class = ISCSI_CLASS_TARGET_ERROR; rsph->status_class = ISCSI_CLASS_TARGET_ERROR;
rsph->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES; rsph->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES;
return SPDK_ISCSI_LOGIN_ERROR_RESPONSE; return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
} }
rsp_pdu->data_buf_len = alloc_len;
reqh = (struct iscsi_bhs_login_req *)&pdu->bhs; reqh = (struct iscsi_bhs_login_req *)&pdu->bhs;
rsph->flags |= (reqh->flags & ISCSI_LOGIN_TRANSIT); rsph->flags |= (reqh->flags & ISCSI_LOGIN_TRANSIT);
@ -2167,7 +2169,6 @@ iscsi_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
struct iscsi_bhs_login_req *reqh; struct iscsi_bhs_login_req *reqh;
struct spdk_iscsi_pdu *rsp_pdu; struct spdk_iscsi_pdu *rsp_pdu;
struct iscsi_param *params = NULL; struct iscsi_param *params = NULL;
int alloc_len;
int cid; int cid;
if (conn->full_feature && conn->sess != NULL && if (conn->full_feature && conn->sess != NULL &&
@ -2189,7 +2190,7 @@ iscsi_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
if (rsp_pdu == NULL) { if (rsp_pdu == NULL) {
return SPDK_ISCSI_CONNECTION_FATAL; return SPDK_ISCSI_CONNECTION_FATAL;
} }
rc = iscsi_op_login_rsp_init(conn, pdu, rsp_pdu, &alloc_len, &cid); rc = iscsi_op_login_rsp_init(conn, pdu, rsp_pdu, &cid);
if (rc < 0) { if (rc < 0) {
iscsi_op_login_response(conn, rsp_pdu, NULL); iscsi_op_login_response(conn, rsp_pdu, NULL);
return rc; return rc;
@ -2201,22 +2202,16 @@ iscsi_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
return rc; return rc;
} }
/* For other values, we need to directly return */
if (rc < 0) {
spdk_put_pdu(rsp_pdu);
return rc;
}
if (conn->state == ISCSI_CONN_STATE_INVALID) { if (conn->state == ISCSI_CONN_STATE_INVALID) {
rc = iscsi_op_login_phase_none(conn, rsp_pdu, params, rc = iscsi_op_login_phase_none(conn, rsp_pdu, params,
alloc_len, cid); rsp_pdu->data_buf_len, cid);
if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE || rc == SPDK_ISCSI_LOGIN_ERROR_PARAMETER) { if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE || rc == SPDK_ISCSI_LOGIN_ERROR_PARAMETER) {
iscsi_op_login_response(conn, rsp_pdu, params); iscsi_op_login_response(conn, rsp_pdu, params);
return rc; return rc;
} }
} }
rc = iscsi_op_login_rsp_handle(conn, rsp_pdu, &params, alloc_len); rc = iscsi_op_login_rsp_handle(conn, rsp_pdu, &params, rsp_pdu->data_buf_len);
if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE) { if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE) {
iscsi_op_login_response(conn, rsp_pdu, params); iscsi_op_login_response(conn, rsp_pdu, params);
return rc; return rc;