target: merge release_cmd methods
[linux-2.6-block.git] / drivers / target / tcm_fc / tfc_cmd.c
index c056a1132ae133a5836613bb357ee24badfc3202..74d5bb766201dc92c87bbcd81817d6ecb8d5421a 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,16 +71,15 @@ 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 = T_TASK(se_cmd);
-       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);
-       if (task->t_mem_list)
-               list_for_each_entry(mem, task->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,
-                              mem->se_page, mem->se_len, mem->se_off);
+       printk(KERN_INFO "%s: cmd %p se_num %u buf %p len %u se_cmd_flags <0x%x>\n",
+              caller, cmd, se_cmd->t_tasks_se_num,
+              se_cmd->t_task_buf, se_cmd->data_length, se_cmd->se_cmd_flags);
+
+       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,
+                      mem->se_page, mem->se_len, mem->se_off);
        sp = cmd->seq;
        if (sp) {
                ep = fc_seq_exch(sp);
@@ -94,29 +92,6 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
                16, 4, cmd->cdb, MAX_COMMAND_SIZE, 0);
 }
 
-/*
- * Get LUN from CDB.
- */
-static int ft_get_lun_for_cmd(struct ft_cmd *cmd, u8 *lunp)
-{
-       u64 lun;
-
-       lun = lunp[1];
-       switch (lunp[0] >> 6) {
-       case 0:
-               break;
-       case 1:
-               lun |= (lunp[0] & 0x3f) << 8;
-               break;
-       default:
-               return -1;
-       }
-       if (lun >= TRANSPORT_MAX_LUNS_PER_TPG)
-               return -1;
-       cmd->lun = lun;
-       return transport_get_lun_for_cmd(&cmd->se_cmd, NULL, lun);
-}
-
 static void ft_queue_cmd(struct ft_sess *sess, struct ft_cmd *cmd)
 {
        struct se_queue_obj *qobj;
@@ -172,7 +147,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);
 }
 
 /*
@@ -285,9 +260,9 @@ int ft_write_pending(struct se_cmd *se_cmd)
                                 * TCM/LIO target
                                 */
                                transport_do_task_sg_chain(se_cmd);
-                               cmd->sg = T_TASK(se_cmd)->t_tasks_sg_chained;
+                               cmd->sg = se_cmd->t_tasks_sg_chained;
                                cmd->sg_cnt =
-                                       T_TASK(se_cmd)->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))
@@ -317,12 +292,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.
  */
@@ -335,7 +304,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;
        }
 
@@ -352,7 +321,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;
        }
 }
@@ -418,6 +387,7 @@ static void ft_send_tm(struct ft_cmd *cmd)
 {
        struct se_tmr_req *tmr;
        struct fcp_cmnd *fcp;
+       struct ft_sess *sess;
        u8 tm_func;
 
        fcp = fc_frame_payload_get(cmd->req_frame, sizeof(*fcp));
@@ -425,13 +395,6 @@ static void ft_send_tm(struct ft_cmd *cmd)
        switch (fcp->fc_tm_flags) {
        case FCP_TMF_LUN_RESET:
                tm_func = TMR_LUN_RESET;
-               if (ft_get_lun_for_cmd(cmd, fcp->fc_lun) < 0) {
-                       ft_dump_cmd(cmd, __func__);
-                       transport_send_check_condition_and_sense(&cmd->se_cmd,
-                               cmd->se_cmd.scsi_sense_reason, 0);
-                       ft_sess_put(cmd->sess);
-                       return;
-               }
                break;
        case FCP_TMF_TGT_RESET:
                tm_func = TMR_TARGET_WARM_RESET;
@@ -463,6 +426,36 @@ static void ft_send_tm(struct ft_cmd *cmd)
                return;
        }
        cmd->se_cmd.se_tmr_req = tmr;
+
+       switch (fcp->fc_tm_flags) {
+       case FCP_TMF_LUN_RESET:
+               cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun);
+               if (transport_lookup_tmr_lun(&cmd->se_cmd, cmd->lun) < 0) {
+                       /*
+                        * Make sure to clean up newly allocated TMR request
+                        * since "unable to  handle TMR request because failed
+                        * to get to LUN"
+                        */
+                       FT_TM_DBG("Failed to get LUN for TMR func %d, "
+                                 "se_cmd %p, unpacked_lun %d\n",
+                                 tm_func, &cmd->se_cmd, cmd->lun);
+                       ft_dump_cmd(cmd, __func__);
+                       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, 0);
+                       ft_sess_put(sess);
+                       return;
+               }
+               break;
+       case FCP_TMF_TGT_RESET:
+       case FCP_TMF_CLR_TASK_SET:
+       case FCP_TMF_ABT_TASK_SET:
+       case FCP_TMF_CLR_ACA:
+               break;
+       default:
+               return;
+       }
        transport_generic_handle_tmr(&cmd->se_cmd);
 }
 
@@ -635,7 +628,8 @@ static void ft_send_cmd(struct ft_cmd *cmd)
 
        fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd);
 
-       ret = ft_get_lun_for_cmd(cmd, fcp->fc_lun);
+       cmd->lun = scsilun_to_int((struct scsi_lun *)fcp->fc_lun);
+       ret = transport_lookup_cmd_lun(&cmd->se_cmd, cmd->lun);
        if (ret < 0) {
                ft_dump_cmd(cmd, __func__);
                transport_send_check_condition_and_sense(&cmd->se_cmd,
@@ -648,19 +642,19 @@ static void ft_send_cmd(struct ft_cmd *cmd)
        FT_IO_DBG("r_ctl %x alloc task ret %d\n", fh->fh_r_ctl, ret);
        ft_dump_cmd(cmd, __func__);
 
-       if (ret == -1) {
+       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 == -2) {
+       if (ret == -EINVAL) {
                if (se_cmd->se_cmd_flags & SCF_SCSI_RESERVATION_CONFLICT)
                        ft_queue_status(se_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);
@@ -668,7 +662,6 @@ static void ft_send_cmd(struct ft_cmd *cmd)
 
 err:
        ft_send_resp_code(cmd, FCP_CMND_FIELDS_INVALID);
-       return;
 }
 
 /*