[Open-FCoE] [RFC PATCH 1/5] libfc: fix logo resp handling to use logo req during lport reset also

Vasu Dev vasu.dev at intel.com
Fri Jan 14 20:13:29 UTC 2011


Currently logo response handler goes through fc_lport_reset_locked
while no lport logo request during lport reset, so this patch
optimizes these code paths to use fc_lport_reset_locked to
send logo and then use this common code path for both lport reset
and fc_fabric_logoff during i/f destroy.

This completely removes fc_lport_enter_disabled as its porocessing
is now covered by fc_lport_reset_locked code paths.

Signed-off-by: Vasu Dev <vasu.dev at intel.com>
---

 drivers/scsi/libfc/fc_lport.c |   52 ++++++++++-------------------------------
 1 files changed, 13 insertions(+), 39 deletions(-)

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index c5a10f9..903a5db 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -114,6 +114,7 @@ static void fc_lport_enter_ns(struct fc_lport *, enum fc_lport_state);
 static void fc_lport_enter_scr(struct fc_lport *);
 static void fc_lport_enter_ready(struct fc_lport *);
 static void fc_lport_enter_logo(struct fc_lport *);
+static void fc_lport_reset_locked(struct fc_lport *);
 
 static const char *fc_lport_state_names[] = {
 	[LPORT_ST_DISABLED] = "disabled",
@@ -600,13 +601,9 @@ int fc_fabric_logoff(struct fc_lport *lport)
 {
 	lport->tt.disc_stop_final(lport);
 	mutex_lock(&lport->lp_mutex);
-	if (lport->dns_rdata)
-		lport->tt.rport_logoff(lport->dns_rdata);
+	fc_lport_reset_locked(lport);
 	mutex_unlock(&lport->lp_mutex);
 	lport->tt.rport_flush_queue();
-	mutex_lock(&lport->lp_mutex);
-	fc_lport_enter_logo(lport);
-	mutex_unlock(&lport->lp_mutex);
 	cancel_delayed_work_sync(&lport->retry_work);
 	return 0;
 }
@@ -944,10 +941,11 @@ static void fc_lport_reset_locked(struct fc_lport *lport)
 		lport->tt.rport_logoff(lport->ptp_rdata);
 		kref_put(&lport->ptp_rdata->kref, lport->tt.rport_destroy);
 		lport->ptp_rdata = NULL;
+	} else {
+		lport->tt.disc_stop(lport);
+		fc_lport_enter_logo(lport);
 	}
 
-	lport->tt.disc_stop(lport);
-
 	lport->tt.exch_mgr_reset(lport, 0, 0);
 	fc_host_fabric_name(lport->host) = 0;
 
@@ -984,23 +982,6 @@ static void fc_lport_enter_reset(struct fc_lport *lport)
 }
 
 /**
- * fc_lport_enter_disabled() - Disable the local port
- * @lport: The local port to be reset
- *
- * Locking Note: The lport lock is expected to be held before calling
- * this routine.
- */
-static void fc_lport_enter_disabled(struct fc_lport *lport)
-{
-	FC_LPORT_DBG(lport, "Entered disabled state from %s state\n",
-		     fc_lport_state(lport));
-
-	fc_lport_state_enter(lport, LPORT_ST_DISABLED);
-	fc_vports_linkchange(lport);
-	fc_lport_reset_locked(lport);
-}
-
-/**
  * fc_lport_error() - Handler for any errors
  * @lport: The local port that the error was on
  * @fp:	   The error code encoded in a frame pointer
@@ -1353,28 +1334,21 @@ void fc_lport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,
 
 	mutex_lock(&lport->lp_mutex);
 
+	if (IS_ERR(fp))
+		goto err;
+
 	if (lport->state != LPORT_ST_LOGO) {
 		FC_LPORT_DBG(lport, "Received a LOGO response, but in state "
 			     "%s\n", fc_lport_state(lport));
-		if (IS_ERR(fp))
-			goto err;
-		goto out;
-	}
-
-	if (IS_ERR(fp)) {
-		fc_lport_error(lport, fp);
-		goto err;
+	} else {
+		op = fc_frame_payload_op(fp);
+		if (op == ELS_LS_ACC)
+			fc_lport_state_enter(lport, LPORT_ST_DISABLED);
 	}
 
-	op = fc_frame_payload_op(fp);
-	if (op == ELS_LS_ACC)
-		fc_lport_enter_disabled(lport);
-	else
-		fc_lport_error(lport, fp);
-
-out:
 	fc_frame_free(fp);
 err:
+	fc_lport_error(lport, fp);
 	mutex_unlock(&lport->lp_mutex);
 }
 EXPORT_SYMBOL(fc_lport_logo_resp);




More information about the devel mailing list