mirror of
https://github.com/torvalds/linux.git
synced 2024-10-26 06:54:41 +00:00
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: Quinn Tran <quinn.tran@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
0fd10721fe
commit
36c7845282
|
@ -2929,6 +2929,7 @@ struct qlt_hw_data {
|
||||||
|
|
||||||
uint8_t tgt_node_name[WWN_SIZE];
|
uint8_t tgt_node_name[WWN_SIZE];
|
||||||
|
|
||||||
|
struct dentry *dfs_tgt_sess;
|
||||||
struct list_head q_full_list;
|
struct list_head q_full_list;
|
||||||
uint32_t num_pend_cmds;
|
uint32_t num_pend_cmds;
|
||||||
uint32_t num_qfull_cmds_alloc;
|
uint32_t num_qfull_cmds_alloc;
|
||||||
|
|
|
@ -12,6 +12,47 @@
|
||||||
static struct dentry *qla2x00_dfs_root;
|
static struct dentry *qla2x00_dfs_root;
|
||||||
static atomic_t qla2x00_dfs_root_count;
|
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
|
static int
|
||||||
qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
|
qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
|
||||||
{
|
{
|
||||||
|
@ -248,6 +289,15 @@ create_nodes:
|
||||||
"Unable to create debugfs fce node.\n");
|
"Unable to create debugfs fce node.\n");
|
||||||
goto out;
|
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:
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -257,6 +307,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha)
|
||||||
{
|
{
|
||||||
struct qla_hw_data *ha = vha->hw;
|
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) {
|
if (ha->dfs_fw_resource_cnt) {
|
||||||
debugfs_remove(ha->dfs_fw_resource_cnt);
|
debugfs_remove(ha->dfs_fw_resource_cnt);
|
||||||
ha->dfs_fw_resource_cnt = NULL;
|
ha->dfs_fw_resource_cnt = NULL;
|
||||||
|
|
|
@ -641,7 +641,8 @@ void qlt_unreg_sess(struct qla_tgt_sess *sess)
|
||||||
{
|
{
|
||||||
struct scsi_qla_host *vha = sess->vha;
|
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))
|
if (!list_empty(&sess->del_list_entry))
|
||||||
list_del_init(&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,
|
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004,
|
||||||
"Timeout: sess %p about to be deleted\n",
|
"Timeout: sess %p about to be deleted\n",
|
||||||
sess);
|
sess);
|
||||||
ha->tgt.tgt_ops->shutdown_sess(sess);
|
if (sess->se_sess) {
|
||||||
ha->tgt.tgt_ops->put_sess(sess);
|
ha->tgt.tgt_ops->shutdown_sess(sess);
|
||||||
|
ha->tgt.tgt_ops->put_sess(sess);
|
||||||
|
} else {
|
||||||
|
qlt_unreg_sess(sess);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
schedule_delayed_work(&tgt->sess_del_work,
|
schedule_delayed_work(&tgt->sess_del_work,
|
||||||
sess->expires - elapsed);
|
sess->expires - elapsed);
|
||||||
|
@ -904,6 +909,14 @@ static struct qla_tgt_sess *qlt_create_sess(
|
||||||
if (sess->deleted)
|
if (sess->deleted)
|
||||||
qlt_undelete_sess(sess);
|
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);
|
kref_get(&sess->se_sess->sess_kref);
|
||||||
ha->tgt.tgt_ops->update_sess(sess, fcport->d_id, fcport->loop_id,
|
ha->tgt.tgt_ops->update_sess(sess, fcport->d_id, fcport->loop_id,
|
||||||
(fcport->flags & FCF_CONF_COMP_SUPPORTED));
|
(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",
|
"Adding sess %p to tgt %p via ->check_initiator_node_acl()\n",
|
||||||
sess, vha->vha_tgt.qla_tgt);
|
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);
|
sess->conf_compl_supported = (fcport->flags & FCF_CONF_COMP_SUPPORTED);
|
||||||
BUILD_BUG_ON(sizeof(sess->port_name) != sizeof(fcport->port_name));
|
BUILD_BUG_ON(sizeof(sess->port_name) != sizeof(fcport->port_name));
|
||||||
memcpy(sess->port_name, fcport->port_name, sizeof(sess->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,
|
fcport->loop_id, sess->s_id.b.domain, sess->s_id.b.area,
|
||||||
sess->s_id.b.al_pa, sess->conf_compl_supported ? "" : "not ");
|
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;
|
return sess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user