|
@@ -1052,11 +1052,11 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
* be acknowledged. (See below)
|
|
|
*/
|
|
|
if (!cmd->immediate_data) {
|
|
|
- cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
|
|
|
- if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) {
|
|
|
- if (!cmd->sense_reason)
|
|
|
- return 0;
|
|
|
-
|
|
|
+ cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
|
|
|
+ (unsigned char *)hdr, hdr->cmdsn);
|
|
|
+ if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
|
|
|
+ return -1;
|
|
|
+ else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) {
|
|
|
target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1083,6 +1083,9 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
* iscsit_check_received_cmdsn() in iscsit_get_immediate_data() below.
|
|
|
*/
|
|
|
if (cmd->sense_reason) {
|
|
|
+ if (cmd->reject_reason)
|
|
|
+ return 0;
|
|
|
+
|
|
|
target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
|
|
|
return 1;
|
|
|
}
|
|
@@ -1091,10 +1094,8 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
* the backend memory allocation.
|
|
|
*/
|
|
|
cmd->sense_reason = transport_generic_new_cmd(&cmd->se_cmd);
|
|
|
- if (cmd->sense_reason) {
|
|
|
- target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
|
|
|
+ if (cmd->sense_reason)
|
|
|
return 1;
|
|
|
- }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1104,6 +1105,7 @@ static int
|
|
|
iscsit_get_immediate_data(struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr,
|
|
|
bool dump_payload)
|
|
|
{
|
|
|
+ struct iscsi_conn *conn = cmd->conn;
|
|
|
int cmdsn_ret = 0, immed_ret = IMMEDIATE_DATA_NORMAL_OPERATION;
|
|
|
/*
|
|
|
* Special case for Unsupported SAM WRITE Opcodes and ImmediateData=Yes.
|
|
@@ -1120,12 +1122,22 @@ after_immediate_data:
|
|
|
* DataCRC, check against ExpCmdSN/MaxCmdSN if
|
|
|
* Immediate Bit is not set.
|
|
|
*/
|
|
|
- cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd, hdr->cmdsn);
|
|
|
+ cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd,
|
|
|
+ (unsigned char *)hdr, hdr->cmdsn);
|
|
|
+ if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) {
|
|
|
+ return -1;
|
|
|
+ } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) {
|
|
|
+ target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
if (cmd->sense_reason) {
|
|
|
- if (iscsit_dump_data_payload(cmd->conn,
|
|
|
- cmd->first_burst_len, 1) < 0)
|
|
|
- return -1;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = iscsit_dump_data_payload(cmd->conn,
|
|
|
+ cmd->first_burst_len, 1);
|
|
|
+ target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
|
|
|
+ return rc;
|
|
|
} else if (cmd->unsolicited_data)
|
|
|
iscsit_set_unsoliticed_dataout(cmd);
|
|
|
|
|
@@ -1159,7 +1171,7 @@ iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
|
|
|
rc = iscsit_setup_scsi_cmd(conn, cmd, buf);
|
|
|
if (rc < 0)
|
|
|
- return rc;
|
|
|
+ return 0;
|
|
|
/*
|
|
|
* Allocation iovecs needed for struct socket operations for
|
|
|
* traditional iSCSI block I/O.
|
|
@@ -1494,7 +1506,7 @@ static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf)
|
|
|
|
|
|
rc = iscsit_check_dataout_hdr(conn, buf, &cmd);
|
|
|
if (rc < 0)
|
|
|
- return rc;
|
|
|
+ return 0;
|
|
|
else if (!cmd)
|
|
|
return 0;
|
|
|
|
|
@@ -1579,10 +1591,10 @@ int iscsit_process_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
|
|
|
+ cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
|
|
|
+ (unsigned char *)hdr, hdr->cmdsn);
|
|
|
if (cmdsn_ret == CMDSN_LOWER_THAN_EXP)
|
|
|
return 0;
|
|
|
-
|
|
|
if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
|
|
|
return -1;
|
|
|
|
|
@@ -1623,7 +1635,7 @@ static int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
|
|
|
ret = iscsit_setup_nop_out(conn, cmd, hdr);
|
|
|
if (ret < 0)
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
/*
|
|
|
* Handle NOP-OUT payload for traditional iSCSI sockets
|
|
|
*/
|
|
@@ -1893,7 +1905,7 @@ attach:
|
|
|
spin_unlock_bh(&conn->cmd_lock);
|
|
|
|
|
|
if (!(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
|
|
|
- int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
|
|
|
+ int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn);
|
|
|
if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP)
|
|
|
out_of_order_cmdsn = 1;
|
|
|
else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP)
|
|
@@ -1996,7 +2008,8 @@ iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn));
|
|
|
|
|
|
if (!(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
|
|
|
- cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
|
|
|
+ cmdsn_ret = iscsit_sequence_cmd(conn, cmd,
|
|
|
+ (unsigned char *)hdr, hdr->cmdsn);
|
|
|
if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
|
|
|
return -1;
|
|
|
|
|
@@ -2022,7 +2035,7 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
|
|
|
rc = iscsit_setup_text_cmd(conn, cmd, hdr);
|
|
|
if (rc < 0)
|
|
|
- return rc;
|
|
|
+ return 0;
|
|
|
|
|
|
rx_size = payload_length;
|
|
|
if (payload_length) {
|
|
@@ -2284,7 +2297,7 @@ iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
} else {
|
|
|
- cmdsn_ret = iscsit_sequence_cmd(conn, cmd, hdr->cmdsn);
|
|
|
+ cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn);
|
|
|
if (cmdsn_ret == CMDSN_LOWER_THAN_EXP)
|
|
|
logout_remove = 0;
|
|
|
else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER)
|