Merge tag '5.11-rc-smb3' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / drivers / target / target_core_tmr.c
index e4513ef..7347285 100644 (file)
@@ -121,57 +121,61 @@ void core_tmr_abort_task(
        unsigned long flags;
        bool rc;
        u64 ref_tag;
-
-       spin_lock_irqsave(&dev->execute_task_lock, flags);
-       list_for_each_entry_safe(se_cmd, next, &dev->state_list, state_list) {
-
-               if (se_sess != se_cmd->se_sess)
-                       continue;
-
-               /* skip task management functions, including tmr->task_cmd */
-               if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
-                       continue;
-
-               ref_tag = se_cmd->tag;
-               if (tmr->ref_task_tag != ref_tag)
-                       continue;
-
-               printk("ABORT_TASK: Found referenced %s task_tag: %llu\n",
-                       se_cmd->se_tfo->fabric_name, ref_tag);
-
-               spin_lock(&se_sess->sess_cmd_lock);
-               rc = __target_check_io_state(se_cmd, se_sess, 0);
-               spin_unlock(&se_sess->sess_cmd_lock);
-               if (!rc)
-                       continue;
-
-               list_move_tail(&se_cmd->state_list, &aborted_list);
-               se_cmd->state_active = false;
-
-               spin_unlock_irqrestore(&dev->execute_task_lock, flags);
-
-               /*
-                * Ensure that this ABORT request is visible to the LU RESET
-                * code.
-                */
-               if (!tmr->tmr_dev)
-                       WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd) <
-                                       0);
-
-               if (dev->transport->tmr_notify)
-                       dev->transport->tmr_notify(dev, TMR_ABORT_TASK,
-                                                  &aborted_list);
-
-               list_del_init(&se_cmd->state_list);
-               target_put_cmd_and_wait(se_cmd);
-
-               printk("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for"
-                               " ref_tag: %llu\n", ref_tag);
-               tmr->response = TMR_FUNCTION_COMPLETE;
-               atomic_long_inc(&dev->aborts_complete);
-               return;
+       int i;
+
+       for (i = 0; i < dev->queue_cnt; i++) {
+               spin_lock_irqsave(&dev->queues[i].lock, flags);
+               list_for_each_entry_safe(se_cmd, next, &dev->queues[i].state_list,
+                                        state_list) {
+                       if (se_sess != se_cmd->se_sess)
+                               continue;
+
+                       /*
+                        * skip task management functions, including
+                        * tmr->task_cmd
+                        */
+                       if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
+                               continue;
+
+                       ref_tag = se_cmd->tag;
+                       if (tmr->ref_task_tag != ref_tag)
+                               continue;
+
+                       pr_err("ABORT_TASK: Found referenced %s task_tag: %llu\n",
+                              se_cmd->se_tfo->fabric_name, ref_tag);
+
+                       spin_lock(&se_sess->sess_cmd_lock);
+                       rc = __target_check_io_state(se_cmd, se_sess, 0);
+                       spin_unlock(&se_sess->sess_cmd_lock);
+                       if (!rc)
+                               continue;
+
+                       list_move_tail(&se_cmd->state_list, &aborted_list);
+                       se_cmd->state_active = false;
+                       spin_unlock_irqrestore(&dev->queues[i].lock, flags);
+
+                       /*
+                        * Ensure that this ABORT request is visible to the LU
+                        * RESET code.
+                        */
+                       if (!tmr->tmr_dev)
+                               WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd) < 0);
+
+                       if (dev->transport->tmr_notify)
+                               dev->transport->tmr_notify(dev, TMR_ABORT_TASK,
+                                                          &aborted_list);
+
+                       list_del_init(&se_cmd->state_list);
+                       target_put_cmd_and_wait(se_cmd);
+
+                       pr_err("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for ref_tag: %llu\n",
+                              ref_tag);
+                       tmr->response = TMR_FUNCTION_COMPLETE;
+                       atomic_long_inc(&dev->aborts_complete);
+                       return;
+               }
+               spin_unlock_irqrestore(&dev->queues[i].lock, flags);
        }
-       spin_unlock_irqrestore(&dev->execute_task_lock, flags);
 
        if (dev->transport->tmr_notify)
                dev->transport->tmr_notify(dev, TMR_ABORT_TASK, &aborted_list);
@@ -273,7 +277,7 @@ static void core_tmr_drain_state_list(
        struct se_session *sess;
        struct se_cmd *cmd, *next;
        unsigned long flags;
-       int rc;
+       int rc, i;
 
        /*
         * Complete outstanding commands with TASK_ABORTED SAM status.
@@ -297,35 +301,39 @@ static void core_tmr_drain_state_list(
         * Note that this seems to be independent of TAS (Task Aborted Status)
         * in the Control Mode Page.
         */
-       spin_lock_irqsave(&dev->execute_task_lock, flags);
-       list_for_each_entry_safe(cmd, next, &dev->state_list, state_list) {
-               /*
-                * For PREEMPT_AND_ABORT usage, only process commands
-                * with a matching reservation key.
-                */
-               if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
-                       continue;
-
-               /*
-                * Not aborting PROUT PREEMPT_AND_ABORT CDB..
-                */
-               if (prout_cmd == cmd)
-                       continue;
-
-               sess = cmd->se_sess;
-               if (WARN_ON_ONCE(!sess))
-                       continue;
-
-               spin_lock(&sess->sess_cmd_lock);
-               rc = __target_check_io_state(cmd, tmr_sess, tas);
-               spin_unlock(&sess->sess_cmd_lock);
-               if (!rc)
-                       continue;
-
-               list_move_tail(&cmd->state_list, &drain_task_list);
-               cmd->state_active = false;
+       for (i = 0; i < dev->queue_cnt; i++) {
+               spin_lock_irqsave(&dev->queues[i].lock, flags);
+               list_for_each_entry_safe(cmd, next, &dev->queues[i].state_list,
+                                        state_list) {
+                       /*
+                        * For PREEMPT_AND_ABORT usage, only process commands
+                        * with a matching reservation key.
+                        */
+                       if (target_check_cdb_and_preempt(preempt_and_abort_list,
+                                                        cmd))
+                               continue;
+
+                       /*
+                        * Not aborting PROUT PREEMPT_AND_ABORT CDB..
+                        */
+                       if (prout_cmd == cmd)
+                               continue;
+
+                       sess = cmd->se_sess;
+                       if (WARN_ON_ONCE(!sess))
+                               continue;
+
+                       spin_lock(&sess->sess_cmd_lock);
+                       rc = __target_check_io_state(cmd, tmr_sess, tas);
+                       spin_unlock(&sess->sess_cmd_lock);
+                       if (!rc)
+                               continue;
+
+                       list_move_tail(&cmd->state_list, &drain_task_list);
+                       cmd->state_active = false;
+               }
+               spin_unlock_irqrestore(&dev->queues[i].lock, flags);
        }
-       spin_unlock_irqrestore(&dev->execute_task_lock, flags);
 
        if (dev->transport->tmr_notify)
                dev->transport->tmr_notify(dev, preempt_and_abort_list ?