Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[firefly-linux-kernel-4.4.55.git] / drivers / target / iscsi / iscsi_target.c
index db740e7e9ba2be2a11f9499b22264f8190b6eb29..35b61f7d6c6305f79535c3c9e7d8dbbd8bd788dc 100644 (file)
@@ -1073,7 +1073,6 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
                if (cmd->reject_reason)
                        return 0;
 
-               target_put_sess_cmd(conn->sess->se_sess, &cmd->se_cmd);
                return 1;
        }
        /*
@@ -1111,14 +1110,10 @@ after_immediate_data:
                 */
                cmdsn_ret = iscsit_sequence_cmd(cmd->conn, cmd,
                                        (unsigned char *)hdr, hdr->cmdsn);
-               if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) {
+               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 (cmd->sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) {
                        int rc;
 
                        rc = iscsit_dump_data_payload(cmd->conn,
@@ -1514,6 +1509,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
        if (hdr->itt == RESERVED_ITT && !(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
                pr_err("NOPOUT ITT is reserved, but Immediate Bit is"
                        " not set, protocol error.\n");
+               if (!cmd)
+                       return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
+                                                (unsigned char *)hdr);
+
                return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR,
                                         (unsigned char *)hdr);
        }
@@ -1523,6 +1522,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
                        " greater than MaxXmitDataSegmentLength: %u, protocol"
                        " error.\n", payload_length,
                        conn->conn_ops->MaxXmitDataSegmentLength);
+               if (!cmd)
+                       return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
+                                                (unsigned char *)hdr);
+
                return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR,
                                         (unsigned char *)hdr);
        }