Hi Himanshu & Quinn, On Thu, 2016-02-04 at 11:45 -0500, Himanshu Madhani wrote: > From: Quinn Tran <quinn.tran@xxxxxxxxxx> > > #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.tran@xxxxxxxxxx> > Signed-off-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx> > --- > 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(-) > So looking at this patch beyond the debugfs part, it does change where ->check_initiator_node_acl() gets call during qlt_create_sess(). I assume this is related to new debugfs attribute, and these changes (plus others in qlt_del_sess_work_fn) are not bug-fixes on their own, correct..? Aside from that, I don't have an objection to merge as v4.6 for-next code if QLogic finds it useful for debugging. > 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; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html