[SCSI] target: Convert TASK_ATTR to scsi_tcq.h definitions
[deliverable/linux.git] / drivers / target / target_core_transport.c
index 9583b23c9c84702f907e93adf3e1f8ca8419cd32..4dafeb8b56381173b733653ce0e9b1c6c9755efd 100644 (file)
@@ -42,7 +42,7 @@
 #include <net/tcp.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
-#include <scsi/libsas.h> /* For TASK_ATTR_* */
+#include <scsi/scsi_tcq.h>
 
 #include <target/target_core_base.h>
 #include <target/target_core_device.h>
@@ -762,7 +762,6 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd)
        transport_all_task_dev_remove_state(cmd);
        spin_unlock_irqrestore(&T_TASK(cmd)->t_state_lock, flags);
 
-       transport_free_dev_tasks(cmd);
 
 check_lun:
        spin_lock_irqsave(&lun->lun_cmd_lock, flags);
@@ -1075,7 +1074,7 @@ static inline int transport_add_task_check_sam_attr(
         * head of the struct se_device->execute_task_list, and task_prev
         * after that for each subsequent task
         */
-       if (task->task_se_cmd->sam_task_attr == TASK_ATTR_HOQ) {
+       if (task->task_se_cmd->sam_task_attr == MSG_HEAD_TAG) {
                list_add(&task->t_execute_list,
                                (task_prev != NULL) ?
                                &task_prev->t_execute_list :
@@ -1195,6 +1194,7 @@ transport_get_task_from_execute_queue(struct se_device *dev)
                break;
 
        list_del(&task->t_execute_list);
+       atomic_set(&task->task_execute_queue, 0);
        atomic_dec(&dev->execute_tasks);
 
        return task;
@@ -1210,8 +1210,14 @@ void transport_remove_task_from_execute_queue(
 {
        unsigned long flags;
 
+       if (atomic_read(&task->task_execute_queue) == 0) {
+               dump_stack();
+               return;
+       }
+
        spin_lock_irqsave(&dev->execute_task_lock, flags);
        list_del(&task->t_execute_list);
+       atomic_set(&task->task_execute_queue, 0);
        atomic_dec(&dev->execute_tasks);
        spin_unlock_irqrestore(&dev->execute_task_lock, flags);
 }
@@ -1867,7 +1873,7 @@ static int transport_check_alloc_task_attr(struct se_cmd *cmd)
        if (SE_DEV(cmd)->dev_task_attr_type != SAM_TASK_ATTR_EMULATED)
                return 0;
 
-       if (cmd->sam_task_attr == TASK_ATTR_ACA) {
+       if (cmd->sam_task_attr == MSG_ACA_TAG) {
                DEBUG_STA("SAM Task Attribute ACA"
                        " emulation is not supported\n");
                return -1;
@@ -2058,6 +2064,13 @@ int transport_generic_handle_tmr(
 }
 EXPORT_SYMBOL(transport_generic_handle_tmr);
 
+void transport_generic_free_cmd_intr(
+       struct se_cmd *cmd)
+{
+       transport_add_cmd_to_queue(cmd, TRANSPORT_FREE_CMD_INTR);
+}
+EXPORT_SYMBOL(transport_generic_free_cmd_intr);
+
 static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
 {
        struct se_task *task, *task_tmp;
@@ -2128,7 +2141,7 @@ static void transport_failure_reset_queue_depth(struct se_device *dev)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&SE_HBA(dev)->hba_queue_lock, flags);;
+       spin_lock_irqsave(&SE_HBA(dev)->hba_queue_lock, flags);
        atomic_inc(&dev->depth_left);
        atomic_inc(&SE_HBA(dev)->left_queue_depth);
        spin_unlock_irqrestore(&SE_HBA(dev)->hba_queue_lock, flags);
@@ -2504,7 +2517,7 @@ static inline int transport_execute_task_attr(struct se_cmd *cmd)
         * Check for the existence of HEAD_OF_QUEUE, and if true return 1
         * to allow the passed struct se_cmd list of tasks to the front of the list.
         */
-        if (cmd->sam_task_attr == TASK_ATTR_HOQ) {
+        if (cmd->sam_task_attr == MSG_HEAD_TAG) {
                atomic_inc(&SE_DEV(cmd)->dev_hoq_count);
                smp_mb__after_atomic_inc();
                DEBUG_STA("Added HEAD_OF_QUEUE for CDB:"
@@ -2512,7 +2525,7 @@ static inline int transport_execute_task_attr(struct se_cmd *cmd)
                        T_TASK(cmd)->t_task_cdb[0],
                        cmd->se_ordered_id);
                return 1;
-       } else if (cmd->sam_task_attr == TASK_ATTR_ORDERED) {
+       } else if (cmd->sam_task_attr == MSG_ORDERED_TAG) {
                spin_lock(&SE_DEV(cmd)->ordered_cmd_lock);
                list_add_tail(&cmd->se_ordered_list,
                                &SE_DEV(cmd)->ordered_cmd_list);
@@ -3411,7 +3424,7 @@ static int transport_generic_cmd_sequencer(
                 * See spc4r17 section 5.3
                 */
                if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
-                       cmd->sam_task_attr = TASK_ATTR_HOQ;
+                       cmd->sam_task_attr = MSG_HEAD_TAG;
                cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
                break;
        case READ_BUFFER:
@@ -3619,7 +3632,7 @@ static int transport_generic_cmd_sequencer(
                 * See spc4r17 section 5.3
                 */
                if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
-                       cmd->sam_task_attr = TASK_ATTR_HOQ;
+                       cmd->sam_task_attr = MSG_HEAD_TAG;
                cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
                break;
        default:
@@ -3777,21 +3790,21 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
        struct se_cmd *cmd_p, *cmd_tmp;
        int new_active_tasks = 0;
 
-       if (cmd->sam_task_attr == TASK_ATTR_SIMPLE) {
+       if (cmd->sam_task_attr == MSG_SIMPLE_TAG) {
                atomic_dec(&dev->simple_cmds);
                smp_mb__after_atomic_dec();
                dev->dev_cur_ordered_id++;
                DEBUG_STA("Incremented dev->dev_cur_ordered_id: %u for"
                        " SIMPLE: %u\n", dev->dev_cur_ordered_id,
                        cmd->se_ordered_id);
-       } else if (cmd->sam_task_attr == TASK_ATTR_HOQ) {
+       } else if (cmd->sam_task_attr == MSG_HEAD_TAG) {
                atomic_dec(&dev->dev_hoq_count);
                smp_mb__after_atomic_dec();
                dev->dev_cur_ordered_id++;
                DEBUG_STA("Incremented dev_cur_ordered_id: %u for"
                        " HEAD_OF_QUEUE: %u\n", dev->dev_cur_ordered_id,
                        cmd->se_ordered_id);
-       } else if (cmd->sam_task_attr == TASK_ATTR_ORDERED) {
+       } else if (cmd->sam_task_attr == MSG_ORDERED_TAG) {
                spin_lock(&dev->ordered_cmd_lock);
                list_del(&cmd->se_ordered_list);
                atomic_dec(&dev->dev_ordered_sync);
@@ -3824,7 +3837,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
                new_active_tasks++;
 
                spin_lock(&dev->delayed_cmd_lock);
-               if (cmd_p->sam_task_attr == TASK_ATTR_ORDERED)
+               if (cmd_p->sam_task_attr == MSG_ORDERED_TAG)
                        break;
        }
        spin_unlock(&dev->delayed_cmd_lock);
@@ -4776,18 +4789,20 @@ void transport_do_task_sg_chain(struct se_cmd *cmd)
                                sg_end_cur->page_link &= ~0x02;
 
                                sg_chain(sg_head, task_sg_num, sg_head_cur);
-                               sg_count += (task->task_sg_num + 1);
-                       } else
                                sg_count += task->task_sg_num;
+                               task_sg_num = (task->task_sg_num + 1);
+                       } else {
+                               sg_chain(sg_head, task_sg_num, sg_head_cur);
+                               sg_count += task->task_sg_num;
+                               task_sg_num = task->task_sg_num;
+                       }
 
                        sg_head = sg_head_cur;
                        sg_link = sg_link_cur;
-                       task_sg_num = task->task_sg_num;
                        continue;
                }
                sg_head = sg_first = &task->task_sg[0];
                sg_link = &task->task_sg[task->task_sg_num];
-               task_sg_num = task->task_sg_num;
                /*
                 * Check for single task..
                 */
@@ -4798,9 +4813,12 @@ void transport_do_task_sg_chain(struct se_cmd *cmd)
                         */
                        sg_end = &task->task_sg[task->task_sg_num - 1];
                        sg_end->page_link &= ~0x02;
-                       sg_count += (task->task_sg_num + 1);
-               } else
                        sg_count += task->task_sg_num;
+                       task_sg_num = (task->task_sg_num + 1);
+               } else {
+                       sg_count += task->task_sg_num;
+                       task_sg_num = task->task_sg_num;
+               }
        }
        /*
         * Setup the starting pointer and total t_tasks_sg_linked_no including
@@ -4809,21 +4827,20 @@ void transport_do_task_sg_chain(struct se_cmd *cmd)
        T_TASK(cmd)->t_tasks_sg_chained = sg_first;
        T_TASK(cmd)->t_tasks_sg_chained_no = sg_count;
 
-       DEBUG_CMD_M("Setup T_TASK(cmd)->t_tasks_sg_chained: %p and"
-               " t_tasks_sg_chained_no: %u\n", T_TASK(cmd)->t_tasks_sg_chained,
+       DEBUG_CMD_M("Setup cmd: %p T_TASK(cmd)->t_tasks_sg_chained: %p and"
+               " t_tasks_sg_chained_no: %u\n", cmd, T_TASK(cmd)->t_tasks_sg_chained,
                T_TASK(cmd)->t_tasks_sg_chained_no);
 
        for_each_sg(T_TASK(cmd)->t_tasks_sg_chained, sg,
                        T_TASK(cmd)->t_tasks_sg_chained_no, i) {
 
-               DEBUG_CMD_M("SG: %p page: %p length: %d offset: %d\n",
-                       sg, sg_page(sg), sg->length, sg->offset);
+               DEBUG_CMD_M("SG[%d]: %p page: %p length: %d offset: %d, magic: 0x%08x\n",
+                       i, sg, sg_page(sg), sg->length, sg->offset, sg->sg_magic);
                if (sg_is_chain(sg))
                        DEBUG_CMD_M("SG: %p sg_is_chain=1\n", sg);
                if (sg_is_last(sg))
                        DEBUG_CMD_M("SG: %p sg_is_last=1\n", sg);
        }
-
 }
 EXPORT_SYMBOL(transport_do_task_sg_chain);
 
@@ -5297,6 +5314,8 @@ void transport_generic_free_cmd(
                if (wait_for_tasks && cmd->transport_wait_for_tasks)
                        cmd->transport_wait_for_tasks(cmd, 0, 0);
 
+               transport_free_dev_tasks(cmd);
+
                transport_generic_remove(cmd, release_to_pool,
                                session_reinstatement);
        }
@@ -6132,6 +6151,9 @@ get_cmd:
                case TRANSPORT_REMOVE:
                        transport_generic_remove(cmd, 1, 0);
                        break;
+               case TRANSPORT_FREE_CMD_INTR:
+                       transport_generic_free_cmd(cmd, 0, 1, 0);
+                       break;
                case TRANSPORT_PROCESS_TMR:
                        transport_generic_do_tmr(cmd);
                        break;
This page took 0.028427 seconds and 5 git commands to generate.