lib: Handle spdk_get_pdu() failure in spdk_iscsi_reject()
Prepares spdk_iscsi_reject() to handle the case where spdk_get_pdu() will return NULL in a future patch instead of abort()'ing. Change-Id: Id29bed20cedbb7c42b75fcb0ce6070f561d4a3d0 Signed-off-by: Lance Hartmann <lance.hartmann@oracle.com> Reviewed-on: https://review.gerrithub.io/403856 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
f6e7137e72
commit
48fcd89135
@ -527,15 +527,21 @@ spdk_iscsi_read_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu **_pdu)
|
|||||||
if (data_len > max_segment_len) {
|
if (data_len > max_segment_len) {
|
||||||
SPDK_ERRLOG("Data(%d) > MaxSegment(%d)\n",
|
SPDK_ERRLOG("Data(%d) > MaxSegment(%d)\n",
|
||||||
data_len, max_segment_len);
|
data_len, max_segment_len);
|
||||||
spdk_iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
|
rc = spdk_iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
|
||||||
spdk_put_pdu(pdu);
|
spdk_put_pdu(pdu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This PDU was rejected and will not be returned to
|
* If PDU was rejected successfully and thus not will
|
||||||
* the caller for execution. We do not want to
|
* not be returned to the caller for execution,
|
||||||
* drop the connection, so return SUCCESS here so that
|
* we will not drop the connection and hence return
|
||||||
* the caller will continue to attempt reading PDUs.
|
* SUCCESS here so that the caller will continue
|
||||||
|
* to attempt to read PDUs. If, however, the
|
||||||
|
* reject failed, then return a failure to the
|
||||||
|
* caller.
|
||||||
*/
|
*/
|
||||||
return SPDK_SUCCESS;
|
rc = (rc < 0) ? SPDK_ISCSI_CONNECTION_FATAL :
|
||||||
|
SPDK_SUCCESS;
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdu->data = pdu->data_buf;
|
pdu->data = pdu->data_buf;
|
||||||
@ -1082,6 +1088,11 @@ spdk_iscsi_reject(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rsp_pdu = spdk_get_pdu();
|
rsp_pdu = spdk_get_pdu();
|
||||||
|
if (rsp_pdu == NULL) {
|
||||||
|
free(data);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
rsph = (struct iscsi_bhs_reject *)&rsp_pdu->bhs;
|
rsph = (struct iscsi_bhs_reject *)&rsp_pdu->bhs;
|
||||||
rsp_pdu->data = data;
|
rsp_pdu->data = data;
|
||||||
rsph->opcode = ISCSI_OP_REJECT;
|
rsph->opcode = ISCSI_OP_REJECT;
|
||||||
@ -3799,6 +3810,7 @@ spdk_iscsi_handle_status_snack(struct spdk_iscsi_conn *conn,
|
|||||||
uint32_t last_statsn;
|
uint32_t last_statsn;
|
||||||
bool found_pdu;
|
bool found_pdu;
|
||||||
struct spdk_iscsi_pdu *old_pdu;
|
struct spdk_iscsi_pdu *old_pdu;
|
||||||
|
int rc;
|
||||||
|
|
||||||
reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
|
reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
|
||||||
beg_run = from_be32(&reqh->beg_run);
|
beg_run = from_be32(&reqh->beg_run);
|
||||||
@ -3815,8 +3827,8 @@ spdk_iscsi_handle_status_snack(struct spdk_iscsi_conn *conn,
|
|||||||
"but already got ExpStatSN: 0x%08x on CID:%hu.\n",
|
"but already got ExpStatSN: 0x%08x on CID:%hu.\n",
|
||||||
beg_run, run_length, conn->StatSN, conn->cid);
|
beg_run, run_length, conn->StatSN, conn->cid);
|
||||||
|
|
||||||
spdk_iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
|
rc = spdk_iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
|
||||||
return 0;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_statsn = (!run_length) ? conn->StatSN : (beg_run + run_length);
|
last_statsn = (!run_length) ? conn->StatSN : (beg_run + run_length);
|
||||||
|
Loading…
Reference in New Issue
Block a user