Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36c78452 authored by Quinn Tran's avatar Quinn Tran Committed by Nicholas Bellinger
Browse files

qla2xxx: Add DebugFS node for target sess list.



 #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
 ....

(Drop ->check_initiator_node_acl() parameter usage - nab)

Signed-off-by: default avatarQuinn Tran <quinn.tran@qlogic.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 0fd10721
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+55 −0
Original line number Diff line number Diff line
@@ -12,6 +12,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)
{
@@ -248,6 +289,15 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
		    "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;
+33 −20
Original line number Diff line number Diff line
@@ -641,6 +641,7 @@ void qlt_unreg_sess(struct qla_tgt_sess *sess)
{
	struct scsi_qla_host *vha = sess->vha;

	if (sess->se_sess)
		vha->hw->tgt.tgt_ops->clear_nacl_from_fcport_map(sess);

	if (!list_empty(&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);
			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);
@@ -904,6 +909,14 @@ static struct qla_tgt_sess *qlt_create_sess(
			if (sess->deleted)
				qlt_undelete_sess(sess);

			if (!sess->se_sess) {
				if (ha->tgt.tgt_ops->check_initiator_node_acl(vha,
				    &sess->port_name[0], sess) < 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));
@@ -947,23 +960,6 @@ static struct qla_tgt_sess *qlt_create_sess(
	    "Adding sess %p to tgt %p via ->check_initiator_node_acl()\n",
	    sess, vha->vha_tgt.qla_tgt);

	/*
	 * 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)) {
		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));
	memcpy(sess->port_name, fcport->port_name, sizeof(sess->port_name));
@@ -981,6 +977,23 @@ 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) < 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;
}