]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/target/target_core_tmr.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next
[karo-tx-linux.git] / drivers / target / target_core_tmr.c
index 570b144a1edb8f0ce696f1f8515b1f74a9317fbc..dcb0618c9388a9e41341b7abef159d18a2eed259 100644 (file)
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/list.h>
+#include <linux/export.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 
 #include <target/target_core_base.h>
-#include <target/target_core_device.h>
-#include <target/target_core_tmr.h>
-#include <target/target_core_transport.h>
-#include <target/target_core_fabric_ops.h>
+#include <target/target_core_backend.h>
+#include <target/target_core_fabric.h>
 #include <target/target_core_configfs.h>
 
+#include "target_core_internal.h"
 #include "target_core_alua.h"
 #include "target_core_pr.h"
 
@@ -100,6 +100,21 @@ static void core_tmr_handle_tas_abort(
        transport_cmd_finish_abort(cmd, 0);
 }
 
+static int target_check_cdb_and_preempt(struct list_head *list,
+               struct se_cmd *cmd)
+{
+       struct t10_pr_registration *reg;
+
+       if (!list)
+               return 0;
+       list_for_each_entry(reg, list, pr_reg_abort_list) {
+               if (reg->pr_res_key == cmd->pr_res_key)
+                       return 0;
+       }
+
+       return 1;
+}
+
 static void core_tmr_drain_tmr_list(
        struct se_device *dev,
        struct se_tmr_req *tmr,
@@ -118,7 +133,7 @@ static void core_tmr_drain_tmr_list(
                /*
                 * Allow the received TMR to return with FUNCTION_COMPLETE.
                 */
-               if (tmr && (tmr_p == tmr))
+               if (tmr_p == tmr)
                        continue;
 
                cmd = tmr_p->task_cmd;
@@ -131,9 +146,7 @@ static void core_tmr_drain_tmr_list(
                 * parameter (eg: for PROUT PREEMPT_AND_ABORT service action
                 * skip non regisration key matching TMRs.
                 */
-               if (preempt_and_abort_list &&
-                   (core_scsi3_check_cdb_abort_and_preempt(
-                                       preempt_and_abort_list, cmd) != 0))
+               if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
                        continue;
 
                spin_lock(&cmd->t_state_lock);
@@ -147,19 +160,18 @@ static void core_tmr_drain_tmr_list(
                }
                spin_unlock(&cmd->t_state_lock);
 
-               list_move_tail(&tmr->tmr_list, &drain_tmr_list);
+               list_move_tail(&tmr_p->tmr_list, &drain_tmr_list);
        }
        spin_unlock_irqrestore(&dev->se_tmr_lock, flags);
 
-       while (!list_empty(&drain_tmr_list)) {
-               tmr = list_entry(drain_tmr_list.next, struct se_tmr_req, tmr_list);
-               list_del(&tmr->tmr_list);
+       list_for_each_entry_safe(tmr_p, tmr_pp, &drain_tmr_list, tmr_list) {
+               list_del_init(&tmr_p->tmr_list);
                cmd = tmr_p->task_cmd;
 
                pr_debug("LUN_RESET: %s releasing TMR %p Function: 0x%02x,"
                        " Response: 0x%02x, t_state: %d\n",
-                       (preempt_and_abort_list) ? "Preempt" : "", tmr,
-                       tmr->function, tmr->response, cmd->t_state);
+                       (preempt_and_abort_list) ? "Preempt" : "", tmr_p,
+                       tmr_p->function, tmr_p->response, cmd->t_state);
 
                transport_cmd_finish_abort(cmd, 1);
        }
@@ -211,9 +223,7 @@ static void core_tmr_drain_task_list(
                 * For PREEMPT_AND_ABORT usage, only process commands
                 * with a matching reservation key.
                 */
-               if (preempt_and_abort_list &&
-                   (core_scsi3_check_cdb_abort_and_preempt(
-                                       preempt_and_abort_list, cmd) != 0))
+               if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
                        continue;
                /*
                 * Not aborting PROUT PREEMPT_AND_ABORT CDB..
@@ -222,7 +232,7 @@ static void core_tmr_drain_task_list(
                        continue;
 
                list_move_tail(&task->t_state_list, &drain_task_list);
-               atomic_set(&task->task_state_active, 0);
+               task->t_state_active = false;
                /*
                 * Remove from task execute list before processing drain_task_list
                 */
@@ -321,25 +331,13 @@ static void core_tmr_drain_cmd_list(
                 * For PREEMPT_AND_ABORT usage, only process commands
                 * with a matching reservation key.
                 */
-               if (preempt_and_abort_list &&
-                   (core_scsi3_check_cdb_abort_and_preempt(
-                                       preempt_and_abort_list, cmd) != 0))
+               if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
                        continue;
                /*
                 * Not aborting PROUT PREEMPT_AND_ABORT CDB..
                 */
                if (prout_cmd == cmd)
                        continue;
-               /*
-                * Skip direct processing of TRANSPORT_FREE_CMD_INTR for
-                * HW target mode fabrics.
-                */
-               spin_lock(&cmd->t_state_lock);
-               if (cmd->t_state == TRANSPORT_FREE_CMD_INTR) {
-                       spin_unlock(&cmd->t_state_lock);
-                       continue;
-               }
-               spin_unlock(&cmd->t_state_lock);
 
                atomic_set(&cmd->t_transport_queue_active, 0);
                atomic_dec(&qobj->queue_cnt);
@@ -355,10 +353,6 @@ static void core_tmr_drain_cmd_list(
                        " %d t_fe_count: %d\n", (preempt_and_abort_list) ?
                        "Preempt" : "", cmd, cmd->t_state,
                        atomic_read(&cmd->t_fe_count));
-               /*
-                * Signal that the command has failed via cmd->se_cmd_flags,
-                */
-               transport_new_cmd_failure(cmd);
 
                core_tmr_handle_tas_abort(tmr_nacl, cmd, tas,
                                atomic_read(&cmd->t_fe_count));