[Open-FCoE] [RFC PATCH 06/16] libfc: event callback pointer moved to RP private data

Robert Love robert.w.love at intel.com
Tue Sep 9 17:22:56 UTC 2008


Move the RP event callback out of the transport template and
into the fc_rport_libfc_priv structure.

Signed-off-by: Robert Love <robert.w.love at intel.com>
---

 drivers/scsi/libfc/fc_lport.c |   10 ++++------
 drivers/scsi/libfc/fc_ns.c    |    2 ++
 drivers/scsi/libfc/fc_rport.c |    3 ++-
 include/scsi/libfc/libfc.h    |    9 +++++++--
 4 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 3b45d66..bdd2760 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -58,8 +58,8 @@ static int fc_frame_drop(struct fc_lport *lp, struct fc_frame *fp)
 	return 0;
 }
 
-static int fc_lport_rport_event(struct fc_lport *lport, struct fc_rport *rport,
-				enum fc_lport_event event)
+static void fc_lport_rport_event(struct fc_lport *lport, struct fc_rport *rport,
+				 enum fc_lport_event event)
 {
 	fc_lport_lock(lport);
 	if (rport->port_id == FC_FID_DIR_SERV) {
@@ -73,8 +73,6 @@ static int fc_lport_rport_event(struct fc_lport *lport, struct fc_rport *rport,
 		}
 	}
 	fc_lport_unlock(lport);
-
-	return 0;
 }
 
 static const char *fc_lport_state(struct fc_lport *lp)
@@ -926,8 +924,8 @@ int fc_lport_init(struct fc_lport *lp)
 	if (!lp->tt.lport_logout)
 		lp->tt.lport_logout = fc_lport_logout;
 
-	if (!lp->tt.lport_event)
-		lp->tt.lport_event = fc_lport_rport_event;
+	if (!lp->tt.event_callback)
+		lp->tt.event_callback = fc_lport_rport_event;
 
 	return 0;
 }
diff --git a/drivers/scsi/libfc/fc_ns.c b/drivers/scsi/libfc/fc_ns.c
index 97464db..65dff77 100644
--- a/drivers/scsi/libfc/fc_ns.c
+++ b/drivers/scsi/libfc/fc_ns.c
@@ -624,6 +624,7 @@ static int fc_ns_new_target(struct fc_lport *lp,
 		}
 		if (rport) {
 			rp = rport->dd_data;
+			rp->event_callback = lp->tt.event_callback;
 			rp->rp_state = RPORT_ST_INIT;
 			lp->tt.rport_login(rport);
 		}
@@ -1067,6 +1068,7 @@ static void fc_ns_enter_dns(struct fc_lport *lp)
 	 * If dNS session isn't ready, start its logon.
 	 */
 	if (rp->rp_state != RPORT_ST_READY) {
+		rp->event_callback = lp->tt.event_callback;
 		lp->tt.rport_login(rport);
 	} else {
 		del_timer(&lp->state_timer);
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 3eac78f..d21261d 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -340,7 +340,8 @@ static void fc_rport_enter_ready(struct fc_rport *rport)
 	if (fc_rp_debug)
 		FC_DBG("remote %6x ready\n", rport->port_id);
 
-	lport->tt.lport_event(lport, rport, LPORT_EV_RPORT_CREATED);
+	if (rdata->event_callback)
+		rdata->event_callback(lport, rport, LPORT_EV_RPORT_CREATED);
 }
 
 /*
diff --git a/include/scsi/libfc/libfc.h b/include/scsi/libfc/libfc.h
index 5936c78..03e4e0a 100644
--- a/include/scsi/libfc/libfc.h
+++ b/include/scsi/libfc/libfc.h
@@ -143,6 +143,7 @@ struct fc_ns_port {
  * @r_a_tov: resource allocation timeout value (in msec)
  * @rp_lock: lock protects state
  * @retry_work:
+ * @event_callback: Callback for rport READY, FAILED or LOGO
  */
 struct fc_rport_libfc_priv {
 	struct fc_lport		*local_port;
@@ -156,6 +157,9 @@ struct fc_rport_libfc_priv {
 	unsigned int	r_a_tov;
 	spinlock_t	rp_lock;
 	struct delayed_work	retry_work;
+	void (*event_callback)(struct fc_lport *,
+			       struct fc_rport *,
+			       enum fc_lport_event);
 };
 
 struct fc_rport *fc_ns_create_dummy_rport(struct fc_ns_port *);
@@ -342,8 +346,9 @@ struct libfc_function_template {
 	int (*lport_reset)(struct fc_lport *);
 	int (*lport_logout)(struct fc_lport *);
 
-	int (*lport_event)(struct fc_lport *, struct fc_rport *,
-			   enum fc_lport_event);
+	void (*event_callback)(struct fc_lport *,
+			       struct fc_rport *,
+			       enum fc_lport_event);
 
 	/**
 	 * Remote Port interfaces




More information about the devel mailing list