Re: [PATCH 11/22] qla2xxx: Refactor session management code.

2016-12-14 Thread Christoph Hellwig
On Tue, Dec 06, 2016 at 12:30:40PM -0800, Himanshu Madhani wrote:
>  9 files changed, 762 insertions(+), 474 deletions(-)

Again, a refactor that almost doubles the amount of code is a bad
one, please go back to the drawing board.
--
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


[PATCH 11/22] qla2xxx: Refactor session management code.

2016-12-06 Thread Himanshu Madhani
From: Quinn Tran 

Current code has 2 structures/codes tracking the same
remote port (fc_port & qla_tgt_sess). Merge these structures
and code under same fc_port.

In target mode, current code does not communicate session
state change to initiator side, Merget target and initiator
mode sessions into same session.

In driver unload path, schedule all session for deletion
and wait for deletion complete before allowing driver unload
to advance.

This patch also refactors unused session deletion in target mode
and does cleanup of dead code.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h |   3 +-
 drivers/scsi/qla2xxx/qla_gbl.h |   1 +
 drivers/scsi/qla2xxx/qla_gs.c  |  58 ++-
 drivers/scsi/qla2xxx/qla_init.c| 159 ---
 drivers/scsi/qla2xxx/qla_isr.c |  43 +-
 drivers/scsi/qla2xxx/qla_os.c  |  46 +-
 drivers/scsi/qla2xxx/qla_target.c  | 905 ++---
 drivers/scsi/qla2xxx/qla_target.h  |   4 +-
 drivers/scsi/qla2xxx/tcm_qla2xxx.c |  17 +-
 9 files changed, 762 insertions(+), 474 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index f281f3d..6370aca 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2162,6 +2162,7 @@ enum fcport_mgt_event {
unsigned int keep_nport_handle:1;
unsigned int send_els_logo:1;
unsigned int login_pause:1;
+   unsigned int login_succ:1;
 
struct fc_port *conflict;
unsigned char logout_completed;
@@ -2254,7 +2255,6 @@ struct event_arg {
 #define FCF_FCP2_DEVICEBIT_2
 #define FCF_ASYNC_SENT BIT_3
 #define FCF_CONF_COMP_SUPPORTED BIT_4
-#define FCF_DELETE_DEV BIT_5
 
 /* No loop ID flag. */
 #define FC_NO_LOOP_ID  0x1000
@@ -4008,6 +4008,7 @@ struct qla_tgt_counters {
struct name_list_extended gnl;
/* Count of active session/fcport */
int fcport_count;
+   wait_queue_head_t fcport_waitQ;
 } scsi_qla_host_t;
 
 struct qla27xx_image_status {
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 94fc7b4..3593a39 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -844,6 +844,7 @@ void qlt_plogi_ack_link(struct scsi_qla_host *, 
qlt_plogi_ack_t *,
struct fc_port *, qlt_plogi_link_t);
 void qlt_plogi_ack_unref(struct scsi_qla_host *, qlt_plogi_ack_t *);
 extern void qlt_schedule_sess_for_deletion(struct fc_port *, bool);
+extern void qlt_schedule_sess_for_deletion_lock(struct fc_port *);
 extern struct fc_port *qlt_find_sess_invalidate_other(scsi_qla_host_t *,
uint64_t wwn, port_id_t port_id, uint16_t loop_id, struct fc_port **);
 void qla24xx_delete_sess_fn(struct work_struct *);
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index d7164da..fa49470 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -2777,28 +2777,55 @@ void qla24xx_handle_gidpn_event(scsi_qla_host_t *vha, 
struct event_arg *ea)
default:
if (atomic_read(>state) == 
FCS_ONLINE)
break;
+
+   ql_dbg(ql_dbg_disc, vha, 0x,
+  "%s %d %8phC post gnl\n",
+  __func__, __LINE__, 
fcport->port_name);
+
qla24xx_post_gnl_work(vha, fcport);
break;
}
} else { /* fcport->d_id.b24 != ea->id.b24 */
fcport->d_id.b24 = ea->id.b24;
 
-   if (fcport->deleted == QLA_SESS_DELETED)
-   qlt_schedule_sess_for_deletion(fcport, 
true);
+   if (fcport->deleted == QLA_SESS_DELETED) {
+   ql_dbg(ql_dbg_disc, vha, 0x,
+  "%s %d %8phC post del 
sess\n",
+  __func__, __LINE__, 
fcport->port_name);
+   
qlt_schedule_sess_for_deletion_lock(fcport);
+   }
}
} else { /* ea->sp->gen1 != fcport->rscn_gen */
/* rscn came in while cmd was out */
+   ql_dbg(ql_dbg_disc, vha, 0x,
+  "%s %d %8phC post gidpn\n",
+  __func__, __LINE__, fcport->port_name);
+
qla24xx_post_gidpn_work(vha, fcport);
}
} else { /* ea->rc */
/* cable pulled */
if (ea->sp->gen1 ==