Merge branch 'WIP.sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / drivers / target / iscsi / iscsi_target.c
index fa1d578..a918024 100644 (file)
@@ -1432,36 +1432,17 @@ static void iscsit_do_crypto_hash_buf(
 }
 
 int
-iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf,
-                         struct iscsi_cmd **out_cmd)
+__iscsit_check_dataout_hdr(struct iscsi_conn *conn, void *buf,
+                          struct iscsi_cmd *cmd, u32 payload_length,
+                          bool *success)
 {
-       struct iscsi_data *hdr = (struct iscsi_data *)buf;
-       struct iscsi_cmd *cmd = NULL;
+       struct iscsi_data *hdr = buf;
        struct se_cmd *se_cmd;
-       u32 payload_length = ntoh24(hdr->dlength);
        int rc;
 
-       if (!payload_length) {
-               pr_warn("DataOUT payload is ZERO, ignoring.\n");
-               return 0;
-       }
-
        /* iSCSI write */
        atomic_long_add(payload_length, &conn->sess->rx_data_octets);
 
-       if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
-               pr_err("DataSegmentLength: %u is greater than"
-                       " MaxXmitDataSegmentLength: %u\n", payload_length,
-                       conn->conn_ops->MaxXmitDataSegmentLength);
-               return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR,
-                                        buf);
-       }
-
-       cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt,
-                       payload_length);
-       if (!cmd)
-               return 0;
-
        pr_debug("Got DataOut ITT: 0x%08x, TTT: 0x%08x,"
                " DataSN: 0x%08x, Offset: %u, Length: %u, CID: %hu\n",
                hdr->itt, hdr->ttt, hdr->datasn, ntohl(hdr->offset),
@@ -1546,7 +1527,7 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf,
                }
        }
        /*
-        * Preform DataSN, DataSequenceInOrder, DataPDUInOrder, and
+        * Perform DataSN, DataSequenceInOrder, DataPDUInOrder, and
         * within-command recovery checks before receiving the payload.
         */
        rc = iscsit_check_pre_dataout(cmd, buf);
@@ -1554,10 +1535,44 @@ iscsit_check_dataout_hdr(struct iscsi_conn *conn, unsigned char *buf,
                return 0;
        else if (rc == DATAOUT_CANNOT_RECOVER)
                return -1;
-
-       *out_cmd = cmd;
+       *success = true;
        return 0;
 }
+EXPORT_SYMBOL(__iscsit_check_dataout_hdr);
+
+int
+iscsit_check_dataout_hdr(struct iscsi_conn *conn, void *buf,
+                        struct iscsi_cmd **out_cmd)
+{
+       struct iscsi_data *hdr = buf;
+       struct iscsi_cmd *cmd;
+       u32 payload_length = ntoh24(hdr->dlength);
+       int rc;
+       bool success = false;
+
+       if (!payload_length) {
+               pr_warn_ratelimited("DataOUT payload is ZERO, ignoring.\n");
+               return 0;
+       }
+
+       if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) {
+               pr_err_ratelimited("DataSegmentLength: %u is greater than"
+                       " MaxXmitDataSegmentLength: %u\n", payload_length,
+                       conn->conn_ops->MaxXmitDataSegmentLength);
+               return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, buf);
+       }
+
+       cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, payload_length);
+       if (!cmd)
+               return 0;
+
+       rc = __iscsit_check_dataout_hdr(conn, buf, cmd, payload_length, &success);
+
+       if (success)
+               *out_cmd = cmd;
+
+       return rc;
+}
 EXPORT_SYMBOL(iscsit_check_dataout_hdr);
 
 static int
@@ -1921,6 +1936,28 @@ out:
        return ret;
 }
 
+static enum tcm_tmreq_table iscsit_convert_tmf(u8 iscsi_tmf)
+{
+       switch (iscsi_tmf) {
+       case ISCSI_TM_FUNC_ABORT_TASK:
+               return TMR_ABORT_TASK;
+       case ISCSI_TM_FUNC_ABORT_TASK_SET:
+               return TMR_ABORT_TASK_SET;
+       case ISCSI_TM_FUNC_CLEAR_ACA:
+               return TMR_CLEAR_ACA;
+       case ISCSI_TM_FUNC_CLEAR_TASK_SET:
+               return TMR_CLEAR_TASK_SET;
+       case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET:
+               return TMR_LUN_RESET;
+       case ISCSI_TM_FUNC_TARGET_WARM_RESET:
+               return TMR_TARGET_WARM_RESET;
+       case ISCSI_TM_FUNC_TARGET_COLD_RESET:
+               return TMR_TARGET_COLD_RESET;
+       default:
+               return TMR_UNKNOWN;
+       }
+}
+
 int
 iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
                           unsigned char *buf)
@@ -1930,7 +1967,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
        struct iscsi_tm *hdr;
        int out_of_order_cmdsn = 0, ret;
        bool sess_ref = false;
-       u8 function;
+       u8 function, tcm_function = TMR_UNKNOWN;
 
        hdr                     = (struct iscsi_tm *) buf;
        hdr->flags &= ~ISCSI_FLAG_CMD_FINAL;
@@ -1976,54 +2013,27 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
         * LIO-Target $FABRIC_MOD
         */
        if (function != ISCSI_TM_FUNC_TASK_REASSIGN) {
-
-               u8 tcm_function;
-               int ret;
-
                transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
                                      conn->sess->se_sess, 0, DMA_NONE,
                                      TCM_SIMPLE_TAG, cmd->sense_buffer + 2);
 
                target_get_sess_cmd(&cmd->se_cmd, true);
                sess_ref = true;
-
-               switch (function) {
-               case ISCSI_TM_FUNC_ABORT_TASK:
-                       tcm_function = TMR_ABORT_TASK;
-                       break;
-               case ISCSI_TM_FUNC_ABORT_TASK_SET:
-                       tcm_function = TMR_ABORT_TASK_SET;
-                       break;
-               case ISCSI_TM_FUNC_CLEAR_ACA:
-                       tcm_function = TMR_CLEAR_ACA;
-                       break;
-               case ISCSI_TM_FUNC_CLEAR_TASK_SET:
-                       tcm_function = TMR_CLEAR_TASK_SET;
-                       break;
-               case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET:
-                       tcm_function = TMR_LUN_RESET;
-                       break;
-               case ISCSI_TM_FUNC_TARGET_WARM_RESET:
-                       tcm_function = TMR_TARGET_WARM_RESET;
-                       break;
-               case ISCSI_TM_FUNC_TARGET_COLD_RESET:
-                       tcm_function = TMR_TARGET_COLD_RESET;
-                       break;
-               default:
+               tcm_function = iscsit_convert_tmf(function);
+               if (tcm_function == TMR_UNKNOWN) {
                        pr_err("Unknown iSCSI TMR Function:"
                               " 0x%02x\n", function);
                        return iscsit_add_reject_cmd(cmd,
                                ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
                }
-
-               ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req,
-                                        tcm_function, GFP_KERNEL);
-               if (ret < 0)
-                       return iscsit_add_reject_cmd(cmd,
+       }
+       ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req, tcm_function,
+                                GFP_KERNEL);
+       if (ret < 0)
+               return iscsit_add_reject_cmd(cmd,
                                ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
 
-               cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req;
-       }
+       cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req;
 
        cmd->iscsi_opcode       = ISCSI_OP_SCSI_TMFUNC;
        cmd->i_state            = ISTATE_SEND_TASKMGTRSP;
@@ -4137,7 +4147,7 @@ int iscsit_close_connection(
        /*
         * During Connection recovery drop unacknowledged out of order
         * commands for this connection, and prepare the other commands
-        * for realligence.
+        * for reallegiance.
         *
         * During normal operation clear the out of order commands (but
         * do not free the struct iscsi_ooo_cmdsn's) and release all
@@ -4145,7 +4155,7 @@ int iscsit_close_connection(
         */
        if (atomic_read(&conn->connection_recovery)) {
                iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(conn);
-               iscsit_prepare_cmds_for_realligance(conn);
+               iscsit_prepare_cmds_for_reallegiance(conn);
        } else {
                iscsit_clear_ooo_cmdsns_for_conn(conn);
                iscsit_release_commands_from_conn(conn);