scsi: tcm_qla2xxx: Make qlt_alloc_qfull_cmd() set cmd->se_cmd.map_tag
authorBart Van Assche <bvanassche@acm.org>
Fri, 3 Jan 2020 19:27:19 +0000 (11:27 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 11 Feb 2020 03:46:54 +0000 (22:46 -0500)
Reduce code duplication by introducing the tcm_qla2xxx_{get,rel}_cmd()
functions. Introduce these functions in the tcm_qla2xxx.c source files such
that the qla_target.c source file becomes independent of the SCSI target
core header files. This patch fixes a bug, namely by ensuring that
qlt_alloc_qfull_cmd() sets cmd->se_cmd.map_tag.

Cc: Himanshu Madhani <hmadhani@marvell.com>
Link: https://lore.kernel.org/r/20200103192719.205158-1-bvanassche@acm.org
Acked-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_target.c
drivers/scsi/qla2xxx/qla_target.h
drivers/scsi/qla2xxx/tcm_qla2xxx.c

index 70081b3..243f87d 100644 (file)
@@ -27,8 +27,6 @@
 #include <scsi/scsi.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_tcq.h>
-#include <target/target_core_base.h>
-#include <target/target_core_fabric.h>
 
 #include "qla_def.h"
 #include "qla_target.h"
@@ -3816,7 +3814,7 @@ void qlt_free_cmd(struct qla_tgt_cmd *cmd)
                return;
        }
        cmd->jiffies_at_free = get_jiffies_64();
-       target_free_tag(sess->se_sess, &cmd->se_cmd);
+       cmd->vha->hw->tgt.tgt_ops->rel_cmd(cmd);
 }
 EXPORT_SYMBOL(qlt_free_cmd);
 
@@ -4150,7 +4148,7 @@ out_term:
        qlt_send_term_exchange(qpair, NULL, &cmd->atio, 1, 0);
 
        qlt_decr_num_pend_cmds(vha);
-       target_free_tag(sess->se_sess, &cmd->se_cmd);
+       cmd->vha->hw->tgt.tgt_ops->rel_cmd(cmd);
        spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
 
        ha->tgt.tgt_ops->put_sess(sess);
@@ -4277,24 +4275,18 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha,
                                       struct fc_port *sess,
                                       struct atio_from_isp *atio)
 {
-       struct se_session *se_sess = sess->se_sess;
        struct qla_tgt_cmd *cmd;
-       int tag, cpu;
 
-       tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
-       if (tag < 0)
+       cmd = vha->hw->tgt.tgt_ops->get_cmd(sess);
+       if (!cmd)
                return NULL;
 
-       cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag];
-       memset(cmd, 0, sizeof(struct qla_tgt_cmd));
        cmd->cmd_type = TYPE_TGT_CMD;
        memcpy(&cmd->atio, atio, sizeof(*atio));
        cmd->state = QLA_TGT_STATE_NEW;
        cmd->tgt = vha->vha_tgt.qla_tgt;
        qlt_incr_num_pend_cmds(vha);
        cmd->vha = vha;
-       cmd->se_cmd.map_tag = tag;
-       cmd->se_cmd.map_cpu = cpu;
        cmd->sess = sess;
        cmd->loop_id = sess->loop_id;
        cmd->conf_compl_supported = sess->conf_compl_supported;
@@ -5352,9 +5344,7 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
        struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
        struct qla_hw_data *ha = vha->hw;
        struct fc_port *sess;
-       struct se_session *se_sess;
        struct qla_tgt_cmd *cmd;
-       int tag, cpu;
        unsigned long flags;
 
        if (unlikely(tgt->tgt_stop)) {
@@ -5384,10 +5374,8 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
        if (!sess)
                return;
 
-       se_sess = sess->se_sess;
-
-       tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
-       if (tag < 0) {
+       cmd = ha->tgt.tgt_ops->get_cmd(sess);
+       if (!cmd) {
                ql_dbg(ql_dbg_io, vha, 0x3009,
                        "qla_target(%d): %s: Allocation of cmd failed\n",
                        vha->vp_idx, __func__);
@@ -5402,9 +5390,6 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
                return;
        }
 
-       cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag];
-       memset(cmd, 0, sizeof(struct qla_tgt_cmd));
-
        qlt_incr_num_pend_cmds(vha);
        INIT_LIST_HEAD(&cmd->cmd_list);
        memcpy(&cmd->atio, atio, sizeof(*atio));
@@ -5414,7 +5399,6 @@ qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
        cmd->reset_count = ha->base_qpair->chip_reset;
        cmd->q_full = 1;
        cmd->qpair = ha->base_qpair;
-       cmd->se_cmd.map_cpu = cpu;
 
        if (qfull) {
                cmd->q_full = 1;
index 6539499..3cf8590 100644 (file)
@@ -671,6 +671,8 @@ struct qla_tgt_func_tmpl {
        void (*handle_data)(struct qla_tgt_cmd *);
        int (*handle_tmr)(struct qla_tgt_mgmt_cmd *, u64, uint16_t,
                        uint32_t);
+       struct qla_tgt_cmd *(*get_cmd)(struct fc_port *);
+       void (*rel_cmd)(struct qla_tgt_cmd *);
        void (*free_cmd)(struct qla_tgt_cmd *);
        void (*free_mcmd)(struct qla_tgt_mgmt_cmd *);
        void (*free_session)(struct fc_port *);
index abe7f79..1f0a185 100644 (file)
@@ -268,6 +268,29 @@ static void tcm_qla2xxx_complete_free(struct work_struct *work)
        transport_generic_free_cmd(&cmd->se_cmd, 0);
 }
 
+static struct qla_tgt_cmd *tcm_qla2xxx_get_cmd(struct fc_port *sess)
+{
+       struct se_session *se_sess = sess->se_sess;
+       struct qla_tgt_cmd *cmd;
+       int tag, cpu;
+
+       tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
+       if (tag < 0)
+               return NULL;
+
+       cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag];
+       memset(cmd, 0, sizeof(struct qla_tgt_cmd));
+       cmd->se_cmd.map_tag = tag;
+       cmd->se_cmd.map_cpu = cpu;
+
+       return cmd;
+}
+
+static void tcm_qla2xxx_rel_cmd(struct qla_tgt_cmd *cmd)
+{
+       target_free_tag(cmd->sess->se_sess, &cmd->se_cmd);
+}
+
 /*
  * Called from qla_target_template->free_cmd(), and will call
  * tcm_qla2xxx_release_cmd via normal struct target_core_fabric_ops
@@ -1549,6 +1572,8 @@ static struct qla_tgt_func_tmpl tcm_qla2xxx_template = {
        .handle_cmd             = tcm_qla2xxx_handle_cmd,
        .handle_data            = tcm_qla2xxx_handle_data,
        .handle_tmr             = tcm_qla2xxx_handle_tmr,
+       .get_cmd                = tcm_qla2xxx_get_cmd,
+       .rel_cmd                = tcm_qla2xxx_rel_cmd,
        .free_cmd               = tcm_qla2xxx_free_cmd,
        .free_mcmd              = tcm_qla2xxx_free_mcmd,
        .free_session           = tcm_qla2xxx_free_session,