scsi_command_t: rather than putting cleanup code before every
return statememts, use goto to a single copy of the cleanup code. no functional changes.
This commit is contained in:
parent
30e77757be
commit
6ddbd5a7dd
|
@ -173,12 +173,16 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
target_cmd_t cmd;
|
target_cmd_t cmd;
|
||||||
uint32_t DataSN = 0;
|
uint32_t DataSN = 0;
|
||||||
uint8_t rsp_header[ISCSI_HEADER_LEN];
|
uint8_t rsp_header[ISCSI_HEADER_LEN];
|
||||||
|
struct iovec *sg_new = NULL;
|
||||||
|
int result;
|
||||||
|
|
||||||
(void) memset(&scsi_cmd, 0x0, sizeof(scsi_cmd));
|
(void) memset(&scsi_cmd, 0x0, sizeof(scsi_cmd));
|
||||||
|
scsi_cmd.ahs = NULL;
|
||||||
if (iscsi_scsi_cmd_decap(header, &scsi_cmd) != 0) {
|
if (iscsi_scsi_cmd_decap(header, &scsi_cmd) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"iscsi_scsi_cmd_decap() failed\n");
|
"iscsi_scsi_cmd_decap() failed\n");
|
||||||
return -1;
|
result = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG,
|
iscsi_trace(TRACE_ISCSI_DEBUG,
|
||||||
"session %d: SCSI Command (CmdSN %u, op %#x)\n",
|
"session %d: SCSI Command (CmdSN %u, op %#x)\n",
|
||||||
|
@ -193,7 +197,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
"CmdSN(%d) of SCSI Command not valid, "
|
"CmdSN(%d) of SCSI Command not valid, "
|
||||||
"ExpCmdSN(%d) MaxCmdSN(%d). Ignoring the command\n",
|
"ExpCmdSN(%d) MaxCmdSN(%d). Ignoring the command\n",
|
||||||
scsi_cmd.CmdSN, sess->ExpCmdSN, sess->MaxCmdSN);
|
scsi_cmd.CmdSN, sess->ExpCmdSN, sess->MaxCmdSN);
|
||||||
return 0;
|
result = 0;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
/* Arg check. */
|
/* Arg check. */
|
||||||
scsi_cmd.attr = 0; /* Temp fix FIXME */
|
scsi_cmd.attr = 0; /* Temp fix FIXME */
|
||||||
|
@ -227,7 +232,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
"scsi_cmd.length (%u) > MaxRecvDataSegmentLength "
|
"scsi_cmd.length (%u) > MaxRecvDataSegmentLength "
|
||||||
"(%u)\n",
|
"(%u)\n",
|
||||||
scsi_cmd.length, sess->sess_params.max_dataseg_len);
|
scsi_cmd.length, sess->sess_params.max_dataseg_len);
|
||||||
return -1;
|
result = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -247,26 +253,21 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
uint8_t *ahs_ptr;
|
uint8_t *ahs_ptr;
|
||||||
uint8_t ahs_type;
|
uint8_t ahs_type;
|
||||||
|
|
||||||
scsi_cmd.ahs = NULL;
|
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG,
|
iscsi_trace(TRACE_ISCSI_DEBUG,
|
||||||
"reading %u bytes AHS\n", scsi_cmd.ahs_len);
|
"reading %u bytes AHS\n", scsi_cmd.ahs_len);
|
||||||
scsi_cmd.ahs = iscsi_malloc_atomic((unsigned)scsi_cmd.ahs_len);
|
scsi_cmd.ahs = iscsi_malloc_atomic((unsigned)scsi_cmd.ahs_len);
|
||||||
if (scsi_cmd.ahs == NULL) {
|
if (scsi_cmd.ahs == NULL) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"iscsi_malloc_atomic() failed\n");
|
"iscsi_malloc_atomic() failed\n");
|
||||||
return -1;
|
result = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
#define AHS_CLEANUP do { \
|
|
||||||
if (scsi_cmd.ahs != NULL) { \
|
|
||||||
iscsi_free_atomic(scsi_cmd.ahs); \
|
|
||||||
} \
|
|
||||||
} while (/* CONSTCOND */ 0)
|
|
||||||
if (iscsi_sock_msg(sess->sock, 0, (unsigned)scsi_cmd.ahs_len,
|
if (iscsi_sock_msg(sess->sock, 0, (unsigned)scsi_cmd.ahs_len,
|
||||||
scsi_cmd.ahs, 0) != scsi_cmd.ahs_len) {
|
scsi_cmd.ahs, 0) != scsi_cmd.ahs_len) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"iscsi_sock_msg() failed\n");
|
"iscsi_sock_msg() failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG,
|
iscsi_trace(TRACE_ISCSI_DEBUG,
|
||||||
"read %u bytes AHS\n", scsi_cmd.ahs_len);
|
"read %u bytes AHS\n", scsi_cmd.ahs_len);
|
||||||
|
@ -277,8 +278,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
if (ahs_len == 0) {
|
if (ahs_len == 0) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"Zero ahs_len\n");
|
"Zero ahs_len\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
switch (ahs_type = *(ahs_ptr + 2)) {
|
switch (ahs_type = *(ahs_ptr + 2)) {
|
||||||
case ISCSI_AHS_EXTENDED_CDB:
|
case ISCSI_AHS_EXTENDED_CDB:
|
||||||
|
@ -301,8 +302,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
default:
|
default:
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"unknown AHS type %x\n", ahs_type);
|
"unknown AHS type %x\n", ahs_type);
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG,
|
iscsi_trace(TRACE_ISCSI_DEBUG,
|
||||||
|
@ -328,24 +329,20 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
if (device_command(sess, &cmd) != 0) {
|
if (device_command(sess, &cmd) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"device_command() failed\n");
|
"device_command() failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Send any input data */
|
/* Send any input data */
|
||||||
|
|
||||||
scsi_cmd.bytes_sent = 0;
|
scsi_cmd.bytes_sent = 0;
|
||||||
if (!scsi_cmd.status && scsi_cmd.input) {
|
if (!scsi_cmd.status && scsi_cmd.input) {
|
||||||
struct iovec sg_singleton;
|
struct iovec sg_singleton;
|
||||||
struct iovec *sg, *sg_orig, *sg_new = NULL;
|
struct iovec *sg, *sg_orig;
|
||||||
int sg_len_orig, sg_len;
|
int sg_len_orig, sg_len;
|
||||||
uint32_t offset, trans_len;
|
uint32_t offset, trans_len;
|
||||||
int fragment_flag = 0;
|
int fragment_flag = 0;
|
||||||
int offset_inc;
|
int offset_inc;
|
||||||
#define SG_CLEANUP do { \
|
|
||||||
if (fragment_flag) { \
|
|
||||||
iscsi_free_atomic(sg_new); \
|
|
||||||
} \
|
|
||||||
} while (/* CONSTCOND */ 0)
|
|
||||||
if (scsi_cmd.output) {
|
if (scsi_cmd.output) {
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG,
|
iscsi_trace(TRACE_ISCSI_DEBUG,
|
||||||
"sending %u bytes bi-directional input data\n",
|
"sending %u bytes bi-directional input data\n",
|
||||||
|
@ -384,8 +381,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
sg_new = iscsi_malloc_atomic(sizeof(struct iovec) * sg_len_orig);
|
sg_new = iscsi_malloc_atomic(sizeof(struct iovec) * sg_len_orig);
|
||||||
if (sg_new == NULL) {
|
if (sg_new == NULL) {
|
||||||
iscsi_err(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n");
|
iscsi_err(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
fragment_flag++;
|
fragment_flag++;
|
||||||
}
|
}
|
||||||
|
@ -394,9 +391,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
(void) memcpy(sg, sg_orig, sizeof(struct iovec) * sg_len_orig);
|
(void) memcpy(sg, sg_orig, sizeof(struct iovec) * sg_len_orig);
|
||||||
if (modify_iov(&sg, &sg_len, offset, data.length) != 0) {
|
if (modify_iov(&sg, &sg_len, offset, data.length) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__, "modify_iov() failed\n");
|
iscsi_err(__FILE__, __LINE__, "modify_iov() failed\n");
|
||||||
SG_CLEANUP;
|
result = -1;
|
||||||
AHS_CLEANUP;
|
goto out;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG, "sending read data PDU (offset %u, len %u)\n", offset, data.length);
|
iscsi_trace(TRACE_ISCSI_DEBUG, "sending read data PDU (offset %u, len %u)\n", offset, data.length);
|
||||||
|
@ -413,9 +409,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
}
|
}
|
||||||
} else if (offset + data.length > trans_len) {
|
} else if (offset + data.length > trans_len) {
|
||||||
iscsi_err(__FILE__, __LINE__, "offset+data.length > trans_len??\n");
|
iscsi_err(__FILE__, __LINE__, "offset+data.length > trans_len??\n");
|
||||||
SG_CLEANUP;
|
result = -1;
|
||||||
AHS_CLEANUP;
|
goto out;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
data.task_tag = scsi_cmd.tag;
|
data.task_tag = scsi_cmd.tag;
|
||||||
data.ExpCmdSN = sess->ExpCmdSN;
|
data.ExpCmdSN = sess->ExpCmdSN;
|
||||||
|
@ -424,21 +419,18 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
|
||||||
data.offset = offset;
|
data.offset = offset;
|
||||||
if (iscsi_read_data_encap(rsp_header, &data) != 0) {
|
if (iscsi_read_data_encap(rsp_header, &data) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__, "iscsi_read_data_encap() failed\n");
|
iscsi_err(__FILE__, __LINE__, "iscsi_read_data_encap() failed\n");
|
||||||
SG_CLEANUP;
|
result = -1;
|
||||||
AHS_CLEANUP;
|
goto out;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
if ((uint32_t)iscsi_sock_send_header_and_data(sess->sock, rsp_header, ISCSI_HEADER_LEN, sg, data.length, sg_len)
|
if ((uint32_t)iscsi_sock_send_header_and_data(sess->sock, rsp_header, ISCSI_HEADER_LEN, sg, data.length, sg_len)
|
||||||
!= ISCSI_HEADER_LEN + data.length) {
|
!= ISCSI_HEADER_LEN + data.length) {
|
||||||
iscsi_err(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n");
|
iscsi_err(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n");
|
||||||
SG_CLEANUP;
|
result = -1;
|
||||||
AHS_CLEANUP;
|
goto out;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
scsi_cmd.bytes_sent += data.length;
|
scsi_cmd.bytes_sent += data.length;
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG, "sent read data PDU ok (offset %u, len %u)\n", data.offset, data.length);
|
iscsi_trace(TRACE_ISCSI_DEBUG, "sent read data PDU ok (offset %u, len %u)\n", data.offset, data.length);
|
||||||
}
|
}
|
||||||
SG_CLEANUP;
|
|
||||||
iscsi_trace(TRACE_ISCSI_DEBUG, "successfully sent %u bytes read data\n", trans_len);
|
iscsi_trace(TRACE_ISCSI_DEBUG, "successfully sent %u bytes read data\n", trans_len);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -466,55 +458,43 @@ response:
|
||||||
scsi_rsp.status = scsi_cmd.status; /* SCSI status */
|
scsi_rsp.status = scsi_cmd.status; /* SCSI status */
|
||||||
if (iscsi_scsi_rsp_encap(rsp_header, &scsi_rsp) != 0) {
|
if (iscsi_scsi_rsp_encap(rsp_header, &scsi_rsp) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__, "iscsi_scsi_rsp_encap() failed\n");
|
iscsi_err(__FILE__, __LINE__, "iscsi_scsi_rsp_encap() failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
if ((uint32_t)iscsi_sock_send_header_and_data(sess->sock, rsp_header, ISCSI_HEADER_LEN,
|
if ((uint32_t)iscsi_sock_send_header_and_data(sess->sock, rsp_header, ISCSI_HEADER_LEN,
|
||||||
scsi_cmd.send_data, scsi_rsp.length, scsi_cmd.send_sg_len)
|
scsi_cmd.send_data, scsi_rsp.length, scsi_cmd.send_sg_len)
|
||||||
!= ISCSI_HEADER_LEN + scsi_rsp.length) {
|
!= ISCSI_HEADER_LEN + scsi_rsp.length) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"iscsi_sock_send_header_and_data() failed\n");
|
"iscsi_sock_send_header_and_data() failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Make sure all data was transferred */
|
/* Make sure all data was transferred */
|
||||||
|
|
||||||
if (scsi_cmd.output) {
|
if (scsi_cmd.output) {
|
||||||
#if 0
|
|
||||||
RETURN_NOT_EQUAL("scsi_cmd.bytes_recv", scsi_cmd.bytes_recv, scsi_cmd.trans_len, AHS_CLEANUP, -1);
|
|
||||||
#else
|
|
||||||
if (scsi_cmd.bytes_recv != scsi_cmd.trans_len) {
|
if (scsi_cmd.bytes_recv != scsi_cmd.trans_len) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"scsi_cmd.bytes_recv");
|
"scsi_cmd.bytes_recv");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (scsi_cmd.input) {
|
if (scsi_cmd.input) {
|
||||||
#if 0
|
|
||||||
RETURN_NOT_EQUAL("scsi_cmd.bytes_sent", scsi_cmd.bytes_sent, scsi_cmd.bidi_trans_len, AHS_CLEANUP, -1);
|
|
||||||
#else
|
|
||||||
if (scsi_cmd.bytes_sent !=
|
if (scsi_cmd.bytes_sent !=
|
||||||
scsi_cmd.bidi_trans_len) {
|
scsi_cmd.bidi_trans_len) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"scsi_cmd.bytes_sent");
|
"scsi_cmd.bytes_sent");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (scsi_cmd.input) {
|
if (scsi_cmd.input) {
|
||||||
#if 0
|
|
||||||
RETURN_NOT_EQUAL("scsi_cmd.bytes_sent", scsi_cmd.bytes_sent, scsi_cmd.trans_len, AHS_CLEANUP, -1);
|
|
||||||
#else
|
|
||||||
if (scsi_cmd.bytes_sent != scsi_cmd.trans_len) {
|
if (scsi_cmd.bytes_sent != scsi_cmd.trans_len) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"scsi_cmd.bytes_sent");
|
"scsi_cmd.bytes_sent");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -525,12 +505,19 @@ response:
|
||||||
if ((*cmd.callback)(cmd.callback_arg) != 0) {
|
if ((*cmd.callback)(cmd.callback_arg) != 0) {
|
||||||
iscsi_err(__FILE__, __LINE__,
|
iscsi_err(__FILE__, __LINE__,
|
||||||
"device callback failed\n");
|
"device callback failed\n");
|
||||||
AHS_CLEANUP;
|
result = -1;
|
||||||
return -1;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AHS_CLEANUP;
|
result = 0;
|
||||||
return 0;
|
out:
|
||||||
|
if (scsi_cmd.ahs != NULL) { \
|
||||||
|
iscsi_free_atomic(scsi_cmd.ahs); \
|
||||||
|
} \
|
||||||
|
if (sg_new != NULL) {
|
||||||
|
iscsi_free_atomic(sg_new);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue