Message ID | 20200902072548.11491-3-njavali@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | qla2xxx misc features and bug fixes | expand |
> On Sep 2, 2020, at 2:25 AM, Nilesh Javali <njavali@marvell.com> wrote: > > From: Arun Easi <aeasi@marvell.com> > > Create a base for adding remote port related entries in debugfs. > > Signed-off-by: Arun Easi <aeasi@marvell.com> > Signed-off-by: Himanshu Madhani <hmadhani@marvell.com> > Signed-off-by: Saurav Kashyap <skashyap@marvell.com> > Signed-off-by: Nilesh Javali <njavali@marvell.com> > --- > drivers/scsi/qla2xxx/qla_def.h | 4 +++ > drivers/scsi/qla2xxx/qla_dfs.c | 42 ++++++++++++++++++++++++++++++- > drivers/scsi/qla2xxx/qla_gbl.h | 2 ++ > drivers/scsi/qla2xxx/qla_init.c | 2 ++ > drivers/scsi/qla2xxx/qla_target.c | 2 ++ > 5 files changed, 51 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h > index 1bc090d8a71b..074d8753cfc3 100644 > --- a/drivers/scsi/qla2xxx/qla_def.h > +++ b/drivers/scsi/qla2xxx/qla_def.h > @@ -2544,6 +2544,8 @@ typedef struct fc_port { > u8 last_login_state; > u16 n2n_link_reset_cnt; > u16 n2n_chip_reset; > + > + struct dentry *dfs_rport_dir; > } fc_port_t; > > enum { > @@ -4780,6 +4782,8 @@ typedef struct scsi_qla_host { > uint16_t ql2xexchoffld; > uint16_t ql2xiniexchg; > > + struct dentry *dfs_rport_root; > + > struct purex_list { > struct list_head head; > spinlock_t lock; > diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c > index e62b2115235e..3c4b9b549b17 100644 > --- a/drivers/scsi/qla2xxx/qla_dfs.c > +++ b/drivers/scsi/qla2xxx/qla_dfs.c > @@ -12,6 +12,29 @@ > static struct dentry *qla2x00_dfs_root; > static atomic_t qla2x00_dfs_root_count; > > +void > +qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp) > +{ > + char wwn[32]; > + > + if (!vha->dfs_rport_root || fp->dfs_rport_dir) > + return; > + > + sprintf(wwn, "pn-%016llx", wwn_to_u64(fp->port_name)); > + fp->dfs_rport_dir = debugfs_create_dir(wwn, vha->dfs_rport_root); > + if (!fp->dfs_rport_dir) > + return; > +} > + > +void > +qla2x00_dfs_remove_rport(scsi_qla_host_t *vha, struct fc_port *fp) > +{ > + if (!vha->dfs_rport_root || !fp->dfs_rport_dir) > + return; > + debugfs_remove_recursive(fp->dfs_rport_dir); > + fp->dfs_rport_dir = NULL; > +} > + > static int > qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused) > { > @@ -473,9 +496,21 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) > ha->tgt.dfs_tgt_sess = debugfs_create_file("tgt_sess", > S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_sess_ops); > > - if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) > + if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) { > ha->tgt.dfs_naqp = debugfs_create_file("naqp", > 0400, ha->dfs_dir, vha, &dfs_naqp_ops); > + if (!ha->tgt.dfs_naqp) { > + ql_log(ql_log_warn, vha, 0xd011, > + "Unable to create debugFS naqp node.\n"); > + goto out; > + } > + } > + vha->dfs_rport_root = debugfs_create_dir("rports", ha->dfs_dir); > + if (!vha->dfs_rport_root) { > + ql_log(ql_log_warn, vha, 0xd012, > + "Unable to create debugFS rports node.\n"); > + goto out; > + } > out: > return 0; > } > @@ -515,6 +550,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha) > ha->dfs_fce = NULL; > } > > + if (vha->dfs_rport_root) { > + debugfs_remove_recursive(vha->dfs_rport_root); > + vha->dfs_rport_root = NULL; > + } > + > if (ha->dfs_dir) { > debugfs_remove(ha->dfs_dir); > ha->dfs_dir = NULL; > diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h > index 0ced18f3104e..36c210c24f72 100644 > --- a/drivers/scsi/qla2xxx/qla_gbl.h > +++ b/drivers/scsi/qla2xxx/qla_gbl.h > @@ -935,6 +935,8 @@ void qlt_clr_qp_table(struct scsi_qla_host *vha); > void qlt_set_mode(struct scsi_qla_host *); > int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode); > extern void qla24xx_process_purex_list(struct purex_list *); > +extern void qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp); > +extern void qla2x00_dfs_remove_rport(scsi_qla_host_t *vha, struct fc_port *fp); > > /* nvme.c */ > void qla_nvme_unregister_remote_port(struct fc_port *fcport); > diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c > index 57a2d76aa691..b4d53eb4e53e 100644 > --- a/drivers/scsi/qla2xxx/qla_init.c > +++ b/drivers/scsi/qla2xxx/qla_init.c > @@ -5486,6 +5486,8 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) > > qla2x00_iidma_fcport(vha, fcport); > > + qla2x00_dfs_create_rport(vha, fcport); > + > if (NVME_TARGET(vha->hw, fcport)) { > qla_nvme_register_remote(vha, fcport); > qla2x00_set_fcport_disc_state(fcport, DSC_LOGIN_COMPLETE); > diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c > index 1237d952973d..e28a977b0770 100644 > --- a/drivers/scsi/qla2xxx/qla_target.c > +++ b/drivers/scsi/qla2xxx/qla_target.c > @@ -1111,6 +1111,8 @@ void qlt_free_session_done(struct work_struct *work) > spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); > sess->free_pending = 0; > > + qla2x00_dfs_remove_rport(vha, sess); > + > ql_dbg(ql_dbg_disc, vha, 0xf001, > "Unregistration of sess %p %8phC finished fcp_cnt %d\n", > sess, sess->port_name, vha->fcport_count); > -- > 2.19.0.rc0 > Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 1bc090d8a71b..074d8753cfc3 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2544,6 +2544,8 @@ typedef struct fc_port { u8 last_login_state; u16 n2n_link_reset_cnt; u16 n2n_chip_reset; + + struct dentry *dfs_rport_dir; } fc_port_t; enum { @@ -4780,6 +4782,8 @@ typedef struct scsi_qla_host { uint16_t ql2xexchoffld; uint16_t ql2xiniexchg; + struct dentry *dfs_rport_root; + struct purex_list { struct list_head head; spinlock_t lock; diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c index e62b2115235e..3c4b9b549b17 100644 --- a/drivers/scsi/qla2xxx/qla_dfs.c +++ b/drivers/scsi/qla2xxx/qla_dfs.c @@ -12,6 +12,29 @@ static struct dentry *qla2x00_dfs_root; static atomic_t qla2x00_dfs_root_count; +void +qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp) +{ + char wwn[32]; + + if (!vha->dfs_rport_root || fp->dfs_rport_dir) + return; + + sprintf(wwn, "pn-%016llx", wwn_to_u64(fp->port_name)); + fp->dfs_rport_dir = debugfs_create_dir(wwn, vha->dfs_rport_root); + if (!fp->dfs_rport_dir) + return; +} + +void +qla2x00_dfs_remove_rport(scsi_qla_host_t *vha, struct fc_port *fp) +{ + if (!vha->dfs_rport_root || !fp->dfs_rport_dir) + return; + debugfs_remove_recursive(fp->dfs_rport_dir); + fp->dfs_rport_dir = NULL; +} + static int qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused) { @@ -473,9 +496,21 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) ha->tgt.dfs_tgt_sess = debugfs_create_file("tgt_sess", S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_sess_ops); - if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) + if (IS_QLA27XX(ha) || IS_QLA83XX(ha) || IS_QLA28XX(ha)) { ha->tgt.dfs_naqp = debugfs_create_file("naqp", 0400, ha->dfs_dir, vha, &dfs_naqp_ops); + if (!ha->tgt.dfs_naqp) { + ql_log(ql_log_warn, vha, 0xd011, + "Unable to create debugFS naqp node.\n"); + goto out; + } + } + vha->dfs_rport_root = debugfs_create_dir("rports", ha->dfs_dir); + if (!vha->dfs_rport_root) { + ql_log(ql_log_warn, vha, 0xd012, + "Unable to create debugFS rports node.\n"); + goto out; + } out: return 0; } @@ -515,6 +550,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha) ha->dfs_fce = NULL; } + if (vha->dfs_rport_root) { + debugfs_remove_recursive(vha->dfs_rport_root); + vha->dfs_rport_root = NULL; + } + if (ha->dfs_dir) { debugfs_remove(ha->dfs_dir); ha->dfs_dir = NULL; diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 0ced18f3104e..36c210c24f72 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -935,6 +935,8 @@ void qlt_clr_qp_table(struct scsi_qla_host *vha); void qlt_set_mode(struct scsi_qla_host *); int qla2x00_set_data_rate(scsi_qla_host_t *vha, uint16_t mode); extern void qla24xx_process_purex_list(struct purex_list *); +extern void qla2x00_dfs_create_rport(scsi_qla_host_t *vha, struct fc_port *fp); +extern void qla2x00_dfs_remove_rport(scsi_qla_host_t *vha, struct fc_port *fp); /* nvme.c */ void qla_nvme_unregister_remote_port(struct fc_port *fcport); diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 57a2d76aa691..b4d53eb4e53e 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -5486,6 +5486,8 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) qla2x00_iidma_fcport(vha, fcport); + qla2x00_dfs_create_rport(vha, fcport); + if (NVME_TARGET(vha->hw, fcport)) { qla_nvme_register_remote(vha, fcport); qla2x00_set_fcport_disc_state(fcport, DSC_LOGIN_COMPLETE); diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 1237d952973d..e28a977b0770 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -1111,6 +1111,8 @@ void qlt_free_session_done(struct work_struct *work) spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); sess->free_pending = 0; + qla2x00_dfs_remove_rport(vha, sess); + ql_dbg(ql_dbg_disc, vha, 0xf001, "Unregistration of sess %p %8phC finished fcp_cnt %d\n", sess, sess->port_name, vha->fcport_count);