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:
yamt 2010-01-25 13:45:16 +00:00
parent 30e77757be
commit 6ddbd5a7dd
1 changed files with 52 additions and 65 deletions

View File

@ -173,12 +173,16 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
target_cmd_t cmd;
uint32_t DataSN = 0;
uint8_t rsp_header[ISCSI_HEADER_LEN];
struct iovec *sg_new = NULL;
int result;
(void) memset(&scsi_cmd, 0x0, sizeof(scsi_cmd));
scsi_cmd.ahs = NULL;
if (iscsi_scsi_cmd_decap(header, &scsi_cmd) != 0) {
iscsi_err(__FILE__, __LINE__,
"iscsi_scsi_cmd_decap() failed\n");
return -1;
result = -1;
goto out;
}
iscsi_trace(TRACE_ISCSI_DEBUG,
"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, "
"ExpCmdSN(%d) MaxCmdSN(%d). Ignoring the command\n",
scsi_cmd.CmdSN, sess->ExpCmdSN, sess->MaxCmdSN);
return 0;
result = 0;
goto out;
}
/* Arg check. */
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 "
"(%u)\n",
scsi_cmd.length, sess->sess_params.max_dataseg_len);
return -1;
result = -1;
goto out;
}
#if 0
@ -247,26 +253,21 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
uint8_t *ahs_ptr;
uint8_t ahs_type;
scsi_cmd.ahs = NULL;
iscsi_trace(TRACE_ISCSI_DEBUG,
"reading %u bytes AHS\n", scsi_cmd.ahs_len);
scsi_cmd.ahs = iscsi_malloc_atomic((unsigned)scsi_cmd.ahs_len);
if (scsi_cmd.ahs == NULL) {
iscsi_err(__FILE__, __LINE__,
"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,
scsi_cmd.ahs, 0) != scsi_cmd.ahs_len) {
iscsi_err(__FILE__, __LINE__,
"iscsi_sock_msg() failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
iscsi_trace(TRACE_ISCSI_DEBUG,
"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) {
iscsi_err(__FILE__, __LINE__,
"Zero ahs_len\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
switch (ahs_type = *(ahs_ptr + 2)) {
case ISCSI_AHS_EXTENDED_CDB:
@ -301,8 +302,8 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
default:
iscsi_err(__FILE__, __LINE__,
"unknown AHS type %x\n", ahs_type);
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
}
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) {
iscsi_err(__FILE__, __LINE__,
"device_command() failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
/* Send any input data */
scsi_cmd.bytes_sent = 0;
if (!scsi_cmd.status && scsi_cmd.input) {
struct iovec sg_singleton;
struct iovec *sg, *sg_orig, *sg_new = NULL;
struct iovec *sg, *sg_orig;
int sg_len_orig, sg_len;
uint32_t offset, trans_len;
int fragment_flag = 0;
int offset_inc;
#define SG_CLEANUP do { \
if (fragment_flag) { \
iscsi_free_atomic(sg_new); \
} \
} while (/* CONSTCOND */ 0)
if (scsi_cmd.output) {
iscsi_trace(TRACE_ISCSI_DEBUG,
"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);
if (sg_new == NULL) {
iscsi_err(__FILE__, __LINE__, "iscsi_malloc_atomic() failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
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);
if (modify_iov(&sg, &sg_len, offset, data.length) != 0) {
iscsi_err(__FILE__, __LINE__, "modify_iov() failed\n");
SG_CLEANUP;
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
}
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) {
iscsi_err(__FILE__, __LINE__, "offset+data.length > trans_len??\n");
SG_CLEANUP;
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
data.task_tag = scsi_cmd.tag;
data.ExpCmdSN = sess->ExpCmdSN;
@ -424,21 +419,18 @@ scsi_command_t(target_session_t *sess, uint8_t *header)
data.offset = offset;
if (iscsi_read_data_encap(rsp_header, &data) != 0) {
iscsi_err(__FILE__, __LINE__, "iscsi_read_data_encap() failed\n");
SG_CLEANUP;
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
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_err(__FILE__, __LINE__, "iscsi_sock_send_header_and_data() failed\n");
SG_CLEANUP;
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
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);
}
SG_CLEANUP;
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 */
if (iscsi_scsi_rsp_encap(rsp_header, &scsi_rsp) != 0) {
iscsi_err(__FILE__, __LINE__, "iscsi_scsi_rsp_encap() failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
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)
!= ISCSI_HEADER_LEN + scsi_rsp.length) {
iscsi_err(__FILE__, __LINE__,
"iscsi_sock_send_header_and_data() failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
/* Make sure all data was transferred */
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) {
iscsi_err(__FILE__, __LINE__,
"scsi_cmd.bytes_recv");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
#endif
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 !=
scsi_cmd.bidi_trans_len) {
iscsi_err(__FILE__, __LINE__,
"scsi_cmd.bytes_sent");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
#endif
}
} else {
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) {
iscsi_err(__FILE__, __LINE__,
"scsi_cmd.bytes_sent");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
#endif
}
}
}
@ -525,12 +505,19 @@ response:
if ((*cmd.callback)(cmd.callback_arg) != 0) {
iscsi_err(__FILE__, __LINE__,
"device callback failed\n");
AHS_CLEANUP;
return -1;
result = -1;
goto out;
}
}
AHS_CLEANUP;
return 0;
result = 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