From: Quinn Tran <quinn.t...@qlogic.com>

 #cat  /sys/kernel/debug/qla2xxx/qla2xxx_31/tgt_sess
 qla2xxx_31
 Port ID   Port Name                Handle
 ff:fc:01  21:fd:00:05:33:c7:ec:16  0
 01:0e:00  21:00:00:24:ff:7b:8a:e4  1
 01:0f:00  21:00:00:24:ff:7b:8a:e5  2
 ....

Signed-off-by: Quinn Tran <quinn.t...@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madh...@qlogic.com>
---
 drivers/scsi/qla2xxx/qla_def.h    |    1 +
 drivers/scsi/qla2xxx/qla_dfs.c    |   55 ++++++++++++++++++++++++++++++++++++
 drivers/scsi/qla2xxx/qla_target.c |   56 ++++++++++++++++++++++++------------
 3 files changed, 93 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 9872f34..e6c5bcf 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2929,6 +2929,7 @@ struct qlt_hw_data {
 
        uint8_t tgt_node_name[WWN_SIZE];
 
+       struct dentry *dfs_tgt_sess;
        struct list_head q_full_list;
        uint32_t num_pend_cmds;
        uint32_t num_qfull_cmds_alloc;
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c
index cd8b96a..34272fd 100644
--- a/drivers/scsi/qla2xxx/qla_dfs.c
+++ b/drivers/scsi/qla2xxx/qla_dfs.c
@@ -13,6 +13,47 @@ static struct dentry *qla2x00_dfs_root;
 static atomic_t qla2x00_dfs_root_count;
 
 static int
+qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused)
+{
+       scsi_qla_host_t *vha = s->private;
+       struct qla_hw_data *ha = vha->hw;
+       unsigned long flags;
+       struct qla_tgt_sess *sess = NULL;
+       struct qla_tgt *tgt= vha->vha_tgt.qla_tgt;
+
+       seq_printf(s, "%s\n",vha->host_str);
+       if (tgt) {
+               seq_printf(s, "Port ID   Port Name                Handle\n");
+
+               spin_lock_irqsave(&ha->tgt.sess_lock, flags);
+               list_for_each_entry(sess, &tgt->sess_list, sess_list_entry) {
+                       seq_printf(s, "%02x:%02x:%02x  %8phC  %d\n",
+                                          
sess->s_id.b.domain,sess->s_id.b.area,
+                                          sess->s_id.b.al_pa,  sess->port_name,
+                                          sess->loop_id);
+               }
+               spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+       }
+
+       return 0;
+}
+
+static int
+qla2x00_dfs_tgt_sess_open(struct inode *inode, struct file *file)
+{
+       scsi_qla_host_t *vha = inode->i_private;
+       return single_open(file, qla2x00_dfs_tgt_sess_show, vha);
+}
+
+
+static const struct file_operations dfs_tgt_sess_ops = {
+       .open           = qla2x00_dfs_tgt_sess_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static int
 qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
 {
        struct scsi_qla_host *vha = s->private;
@@ -248,6 +289,15 @@ create_nodes:
                    "Unable to create debugfs fce node.\n");
                goto out;
        }
+
+       ha->tgt.dfs_tgt_sess = debugfs_create_file("tgt_sess",
+               S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_sess_ops);
+       if (!ha->tgt.dfs_tgt_sess) {
+               ql_log(ql_log_warn, vha, 0xffff,
+                       "Unable to create debugFS tgt_sess node.\n");
+               goto out;
+       }
+
 out:
        return 0;
 }
@@ -257,6 +307,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha)
 {
        struct qla_hw_data *ha = vha->hw;
 
+       if (ha->tgt.dfs_tgt_sess) {
+               debugfs_remove(ha->tgt.dfs_tgt_sess);
+               ha->tgt.dfs_tgt_sess = NULL;
+       }
+
        if (ha->dfs_fw_resource_cnt) {
                debugfs_remove(ha->dfs_fw_resource_cnt);
                ha->dfs_fw_resource_cnt = NULL;
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 46c6679..a754aa4 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -641,7 +641,8 @@ void qlt_unreg_sess(struct qla_tgt_sess *sess)
 {
        struct scsi_qla_host *vha = sess->vha;
 
-       vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess);
+       if (sess->se_sess)
+               vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess);
 
        if (!list_empty(&sess->del_list_entry))
                list_del_init(&sess->del_list_entry);
@@ -856,8 +857,12 @@ static void qlt_del_sess_work_fn(struct delayed_work *work)
                        ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004,
                            "Timeout: sess %p about to be deleted\n",
                            sess);
-                       ha->tgt.tgt_ops->shutdown_sess(sess);
-                       ha->tgt.tgt_ops->put_sess(sess);
+                       if (sess->se_sess) {
+                               ha->tgt.tgt_ops->shutdown_sess(sess);
+                               ha->tgt.tgt_ops->put_sess(sess);
+                       } else {
+                               qlt_unreg_sess(sess);
+                       }
                } else {
                        schedule_delayed_work(&tgt->sess_del_work,
                            sess->expires - elapsed);
@@ -905,6 +910,19 @@ static struct qla_tgt_sess *qlt_create_sess(
                        if (sess->deleted)
                                qlt_undelete_sess(sess);
 
+                       if (!sess->se_sess) {
+                               be_sid[0] = sess->s_id.b.domain;
+                               be_sid[1] = sess->s_id.b.area;
+                               be_sid[2] = sess->s_id.b.al_pa;
+
+                               if (ha->tgt.tgt_ops->check_initiator_node_acl
+                                   (vha, &sess->port_name[0], sess, &be_sid[0],
+                                    sess->loop_id) < 0) {
+                                       
spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+                                       return NULL;
+                               }
+                       }
+
                        kref_get(&sess->se_sess->sess_kref);
                        ha->tgt.tgt_ops->update_sess(sess, fcport->d_id, 
fcport->loop_id,
                                                (fcport->flags & 
FCF_CONF_COMP_SUPPORTED));
@@ -951,22 +969,6 @@ static struct qla_tgt_sess *qlt_create_sess(
        be_sid[0] = sess->s_id.b.domain;
        be_sid[1] = sess->s_id.b.area;
        be_sid[2] = sess->s_id.b.al_pa;
-       /*
-        * Determine if this fc_port->port_name is allowed to access
-        * target mode using explict NodeACLs+MappedLUNs, or using
-        * TPG demo mode.  If this is successful a target mode FC nexus
-        * is created.
-        */
-       if (ha->tgt.tgt_ops->check_initiator_node_acl(vha,
-           &fcport->port_name[0], sess, &be_sid[0], fcport->loop_id) < 0) {
-               kfree(sess);
-               return NULL;
-       }
-       /*
-        * Take an extra reference to ->sess_kref here to handle qla_tgt_sess
-        * access across ->tgt.sess_lock reaquire.
-        */
-       kref_get(&sess->se_sess->sess_kref);
 
        sess->conf_compl_supported = (fcport->flags & FCF_CONF_COMP_SUPPORTED);
        BUILD_BUG_ON(sizeof(sess->port_name) != sizeof(fcport->port_name));
@@ -985,6 +987,22 @@ static struct qla_tgt_sess *qlt_create_sess(
            fcport->loop_id, sess->s_id.b.domain, sess->s_id.b.area,
            sess->s_id.b.al_pa, sess->conf_compl_supported ?  "" : "not ");
 
+       /*
+        * Determine if this fc_port->port_name is allowed to access
+        * target mode using explict NodeACLs+MappedLUNs, or using
+        * TPG demo mode.  If this is successful a target mode FC nexus
+        * is created.
+        */
+       if (ha->tgt.tgt_ops->check_initiator_node_acl(vha,
+           &fcport->port_name[0], sess, &be_sid[0], fcport->loop_id) < 0)
+               return NULL;
+       else
+               /*
+                * Take an extra reference to ->sess_kref here to handle 
qla_tgt_sess
+                * access across ->tgt.sess_lock reaquire.
+                */
+               kref_get(&sess->se_sess->sess_kref);
+
        return sess;
 }
 
-- 
1.7.7

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to