]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - drivers/target/tcm_fc/tfc_cmd.c
target: Make all control CDBs scatter-gather
[linux-2.6.git] / drivers / target / tcm_fc / tfc_cmd.c
index 6d9553bbba3053dd0b45633c590840579aafa771..1017f56bbbccefa9952c85890e677b4756018856 100644 (file)
@@ -60,7 +60,6 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
        struct fc_seq *sp;
        struct se_cmd *se_cmd;
        struct se_mem *mem;
-       struct se_transport_task *task;
 
        if (!(ft_debug_logging & FT_DEBUG_IO))
                return;
@@ -72,12 +71,11 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
                caller, cmd, cmd->cdb);
        printk(KERN_INFO "%s: cmd %p lun %d\n", caller, cmd, cmd->lun);
 
-       task = &se_cmd->t_task;
-       printk(KERN_INFO "%s: cmd %p task %p se_num %u buf %p len %u se_cmd_flags <0x%x>\n",
-              caller, cmd, task, task->t_tasks_se_num,
-              task->t_task_buf, se_cmd->data_length, se_cmd->se_cmd_flags);
+       printk(KERN_INFO "%s: cmd %p se_num %u len %u se_cmd_flags <0x%x>\n",
+              caller, cmd, se_cmd->t_tasks_se_num,
+              se_cmd->data_length, se_cmd->se_cmd_flags);
 
-       list_for_each_entry(mem, &task->t_mem_list, se_list)
+       list_for_each_entry(mem, &se_cmd->t_mem_list, se_list)
                printk(KERN_INFO "%s: cmd %p mem %p page %p "
                       "len 0x%x off 0x%x\n",
                       caller, cmd, mem,
@@ -96,15 +94,17 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
 
 static void ft_queue_cmd(struct ft_sess *sess, struct ft_cmd *cmd)
 {
-       struct se_queue_obj *qobj;
+       struct ft_tpg *tpg = sess->tport->tpg;
+       struct se_queue_obj *qobj = &tpg->qobj;
        unsigned long flags;
 
        qobj = &sess->tport->tpg->qobj;
        spin_lock_irqsave(&qobj->cmd_queue_lock, flags);
        list_add_tail(&cmd->se_req.qr_list, &qobj->qobj_list);
-       spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags);
        atomic_inc(&qobj->queue_cnt);
-       wake_up_interruptible(&qobj->thread_wq);
+       spin_unlock_irqrestore(&qobj->cmd_queue_lock, flags);
+
+       wake_up_process(tpg->thread);
 }
 
 static struct ft_cmd *ft_dequeue_cmd(struct se_queue_obj *qobj)
@@ -149,7 +149,7 @@ void ft_release_cmd(struct se_cmd *se_cmd)
 
 void ft_check_stop_free(struct se_cmd *se_cmd)
 {
-       transport_generic_free_cmd(se_cmd, 0, 1, 0);
+       transport_generic_free_cmd(se_cmd, 0, 0);
 }
 
 /*
@@ -262,9 +262,9 @@ int ft_write_pending(struct se_cmd *se_cmd)
                                 * TCM/LIO target
                                 */
                                transport_do_task_sg_chain(se_cmd);
-                               cmd->sg = se_cmd->t_task.t_tasks_sg_chained;
+                               cmd->sg = se_cmd->t_tasks_sg_chained;
                                cmd->sg_cnt =
-                                       se_cmd->t_task.t_tasks_sg_chained_no;
+                                       se_cmd->t_tasks_sg_chained_no;
                        }
                        if (cmd->sg && lport->tt.ddp_setup(lport, ep->xid,
                                                    cmd->sg, cmd->sg_cnt))
@@ -294,12 +294,6 @@ int ft_is_state_remove(struct se_cmd *se_cmd)
        return 0;       /* XXX TBD */
 }
 
-void ft_new_cmd_failure(struct se_cmd *se_cmd)
-{
-       /* XXX TBD */
-       printk(KERN_INFO "%s: se_cmd %p\n", __func__, se_cmd);
-}
-
 /*
  * FC sequence response handler for follow-on sequences (data) and aborts.
  */
@@ -312,7 +306,7 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg)
                /* XXX need to find cmd if queued */
                cmd->se_cmd.t_state = TRANSPORT_REMOVE;
                cmd->seq = NULL;
-               transport_generic_free_cmd(&cmd->se_cmd, 0, 1, 0);
+               transport_generic_free_cmd(&cmd->se_cmd, 0, 0);
                return;
        }
 
@@ -329,7 +323,7 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg)
                printk(KERN_INFO "%s: unhandled frame r_ctl %x\n",
                       __func__, fh->fh_r_ctl);
                fc_frame_free(fp);
-               transport_generic_free_cmd(&cmd->se_cmd, 0, 1, 0);
+               transport_generic_free_cmd(&cmd->se_cmd, 0, 0);
                break;
        }
 }
@@ -451,7 +445,7 @@ static void ft_send_tm(struct ft_cmd *cmd)
                        sess = cmd->sess;
                        transport_send_check_condition_and_sense(&cmd->se_cmd,
                                cmd->se_cmd.scsi_sense_reason, 0);
-                       transport_generic_free_cmd(&cmd->se_cmd, 0, 1, 0);
+                       transport_generic_free_cmd(&cmd->se_cmd, 0, 0);
                        ft_sess_put(sess);
                        return;
                }
@@ -653,7 +647,7 @@ static void ft_send_cmd(struct ft_cmd *cmd)
        if (ret == -ENOMEM) {
                transport_send_check_condition_and_sense(se_cmd,
                                TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
-               transport_generic_free_cmd(se_cmd, 0, 1, 0);
+               transport_generic_free_cmd(se_cmd, 0, 0);
                return;
        }
        if (ret == -EINVAL) {
@@ -662,7 +656,7 @@ static void ft_send_cmd(struct ft_cmd *cmd)
                else
                        transport_send_check_condition_and_sense(se_cmd,
                                        se_cmd->scsi_sense_reason, 0);
-               transport_generic_free_cmd(se_cmd, 0, 1, 0);
+               transport_generic_free_cmd(se_cmd, 0, 0);
                return;
        }
        transport_generic_handle_cdb(se_cmd);
@@ -696,15 +690,12 @@ int ft_thread(void *arg)
        struct ft_tpg *tpg = arg;
        struct se_queue_obj *qobj = &tpg->qobj;
        struct ft_cmd *cmd;
-       int ret;
-
-       set_user_nice(current, -20);
 
        while (!kthread_should_stop()) {
-               ret = wait_event_interruptible(qobj->thread_wq,
-                       atomic_read(&qobj->queue_cnt) || kthread_should_stop());
-               if (ret < 0 || kthread_should_stop())
+               schedule_timeout_interruptible(MAX_SCHEDULE_TIMEOUT);
+               if (kthread_should_stop())
                        goto out;
+
                cmd = ft_dequeue_cmd(qobj);
                if (cmd)
                        ft_exec_req(cmd);