public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Robert Love <robert.w.love@intel.com>
To: James.Bottomley@HansenPartnership.com, linux-scsi@vger.kernel.org
Cc: Chris Leech <christopher.leech@intel.com>,
	Robert Love <robert.w.love@intel.com>
Subject: [PATCH 22/35] libfc: combine name server registration request functions
Date: Fri, 11 Sep 2009 16:58:52 -0700	[thread overview]
Message-ID: <20090911235852.27223.61607.stgit@localhost.localdomain> (raw)
In-Reply-To: <20090911235655.27223.69728.stgit@localhost.localdomain>

From: Chris Leech <christopher.leech@intel.com>

Signed-off-by: Chris Leech <christopher.leech@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---

 drivers/scsi/libfc/fc_lport.c |  164 +++++++++++------------------------------
 1 files changed, 42 insertions(+), 122 deletions(-)

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 5e7b560..f6fc9f4 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -108,10 +108,7 @@ static void fc_lport_error(struct fc_lport *, struct fc_frame *);
 static void fc_lport_enter_reset(struct fc_lport *);
 static void fc_lport_enter_flogi(struct fc_lport *);
 static void fc_lport_enter_dns(struct fc_lport *);
-static void fc_lport_enter_rnn_id(struct fc_lport *);
-static void fc_lport_enter_rsnn_nn(struct fc_lport *);
-static void fc_lport_enter_rspn_id(struct fc_lport *);
-static void fc_lport_enter_rft_id(struct fc_lport *);
+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 *);
@@ -157,7 +154,7 @@ static void fc_lport_rport_callback(struct fc_lport *lport,
 	case RPORT_EV_READY:
 		if (lport->state == LPORT_ST_DNS) {
 			lport->dns_rp = rdata;
-			fc_lport_enter_rnn_id(lport);
+			fc_lport_enter_ns(lport, LPORT_ST_RNN_ID);
 		} else {
 			FC_LPORT_DBG(lport, "Received an READY event "
 				     "on port (%6x) for the directory "
@@ -1031,13 +1028,13 @@ static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp,
 	    ntohs(ct->ct_cmd) == FC_FS_ACC)
 		switch (lport->state) {
 		case LPORT_ST_RNN_ID:
-			fc_lport_enter_rsnn_nn(lport);
+			fc_lport_enter_ns(lport, LPORT_ST_RSNN_NN);
 			break;
 		case LPORT_ST_RSNN_NN:
-			fc_lport_enter_rspn_id(lport);
+			fc_lport_enter_ns(lport, LPORT_ST_RSPN_ID);
 			break;
 		case LPORT_ST_RSPN_ID:
-			fc_lport_enter_rft_id(lport);
+			fc_lport_enter_ns(lport, LPORT_ST_RFT_ID);
 			break;
 		case LPORT_ST_RFT_ID:
 			fc_lport_enter_scr(lport);
@@ -1130,133 +1127,62 @@ static void fc_lport_enter_scr(struct fc_lport *lport)
 }
 
 /**
- * fc_lport_enter_rft_id() - Register FC4-types with the name server
+ * fc_lport_enter_ns() - register some object with the name server
  * @lport: Fibre Channel local port to register
  *
  * Locking Note: The lport lock is expected to be held before calling
  * this routine.
  */
-static void fc_lport_enter_rft_id(struct fc_lport *lport)
-{
-	struct fc_frame *fp;
-	struct fc_ns_fts *lps;
-	int i;
-
-	FC_LPORT_DBG(lport, "Entered RFT_ID state from %s state\n",
-		     fc_lport_state(lport));
-
-	fc_lport_state_enter(lport, LPORT_ST_RFT_ID);
-
-	lps = &lport->fcts;
-	i = sizeof(lps->ff_type_map) / sizeof(lps->ff_type_map[0]);
-	while (--i >= 0)
-		if (ntohl(lps->ff_type_map[i]) != 0)
-			break;
-	if (i < 0) {
-		/* nothing to register, move on to SCR */
-		fc_lport_enter_scr(lport);
-		return;
-	}
-
-	fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) +
-			    sizeof(struct fc_ns_rft));
-	if (!fp) {
-		fc_lport_error(lport, fp);
-		return;
-	}
-
-	if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RFT_ID,
-				  fc_lport_ns_resp,
-				  lport, lport->e_d_tov))
-		fc_lport_error(lport, fp);
-}
-
-/**
- * fc_rport_enter_rspn_id() - Register symbolic port name with the name server
- * @lport: Fibre Channel local port to register
- *
- * Locking Note: The lport lock is expected to be held before calling
- * this routine.
- */
-static void fc_lport_enter_rspn_id(struct fc_lport *lport)
-{
-	struct fc_frame *fp;
-	size_t len;
-
-	FC_LPORT_DBG(lport, "Entered RSPN_ID state from %s state\n",
-		     fc_lport_state(lport));
-
-	fc_lport_state_enter(lport, LPORT_ST_RSPN_ID);
-
-	len = strnlen(fc_host_symbolic_name(lport->host), 255);
-	fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) +
-			    sizeof(struct fc_ns_rspn) + len);
-	if (!fp) {
-		fc_lport_error(lport, fp);
-		return;
-	}
-
-	if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RSPN_ID,
-				  fc_lport_ns_resp,
-				  lport, lport->e_d_tov))
-		fc_lport_error(lport, fp);
-}
-
-/**
- * fc_rport_enter_rsnn_nn() - Register symbolic node name with the name server
- * @lport: Fibre Channel local port to register
- *
- * Locking Note: The lport lock is expected to be held before calling
- * this routine.
- */
-static void fc_lport_enter_rsnn_nn(struct fc_lport *lport)
+static void fc_lport_enter_ns(struct fc_lport *lport, enum fc_lport_state state)
 {
 	struct fc_frame *fp;
+	enum fc_ns_req cmd;
+	int size = sizeof(struct fc_ct_hdr);
 	size_t len;
 
-	FC_LPORT_DBG(lport, "Entered RSNN_NN state from %s state\n",
+	FC_LPORT_DBG(lport, "Entered %s state from %s state\n",
+		     fc_lport_state_names[state],
 		     fc_lport_state(lport));
 
-	fc_lport_state_enter(lport, LPORT_ST_RSNN_NN);
+	fc_lport_state_enter(lport, state);
 
-	len = strnlen(fc_host_symbolic_name(lport->host), 255);
-	fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) +
-			    sizeof(struct fc_ns_rsnn) + len);
-	if (!fp) {
-		fc_lport_error(lport, fp);
+	switch (state) {
+	case LPORT_ST_RNN_ID:
+		cmd = FC_NS_RNN_ID;
+		size += sizeof(struct fc_ns_rn_id);
+		break;
+	case LPORT_ST_RSNN_NN:
+		len = strnlen(fc_host_symbolic_name(lport->host), 255);
+		/* if there is no symbolic name, skip to RFT_ID */
+		if (!len)
+			return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID);
+		cmd = FC_NS_RSNN_NN;
+		size += sizeof(struct fc_ns_rsnn) + len;
+		break;
+	case LPORT_ST_RSPN_ID:
+		len = strnlen(fc_host_symbolic_name(lport->host), 255);
+		/* if there is no symbolic name, skip to RFT_ID */
+		if (!len)
+			return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID);
+		cmd = FC_NS_RSPN_ID;
+		size += sizeof(struct fc_ns_rspn) + len;
+		break;
+	case LPORT_ST_RFT_ID:
+		cmd = FC_NS_RFT_ID;
+		size += sizeof(struct fc_ns_rft);
+		break;
+	default:
+		fc_lport_error(lport, NULL);
 		return;
 	}
 
-	if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RSNN_NN,
-				  fc_lport_ns_resp,
-				  lport, lport->e_d_tov))
-		fc_lport_error(lport, fp);
-}
-
-/**
- * fc_rport_enter_rnn_id() - Register node name with the name server
- * @lport: Fibre Channel local port to register
- *
- * Locking Note: The lport lock is expected to be held before calling
- * this routine.
- */
-static void fc_lport_enter_rnn_id(struct fc_lport *lport)
-{
-	struct fc_frame *fp;
-
-	FC_LPORT_DBG(lport, "Entered RNN_ID state from %s state\n",
-		     fc_lport_state(lport));
-
-	fc_lport_state_enter(lport, LPORT_ST_RNN_ID);
-
-	fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) +
-			    sizeof(struct fc_ns_rn_id));
+	fp = fc_frame_alloc(lport, size);
 	if (!fp) {
 		fc_lport_error(lport, fp);
 		return;
 	}
 
-	if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RNN_ID,
+	if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, cmd,
 				  fc_lport_ns_resp,
 				  lport, lport->e_d_tov))
 		fc_lport_error(lport, fp);
@@ -1321,16 +1247,10 @@ static void fc_lport_timeout(struct work_struct *work)
 		fc_lport_enter_dns(lport);
 		break;
 	case LPORT_ST_RNN_ID:
-		fc_lport_enter_rnn_id(lport);
-		break;
 	case LPORT_ST_RSNN_NN:
-		fc_lport_enter_rsnn_nn(lport);
-		break;
 	case LPORT_ST_RSPN_ID:
-		fc_lport_enter_rspn_id(lport);
-		break;
 	case LPORT_ST_RFT_ID:
-		fc_lport_enter_rft_id(lport);
+		fc_lport_enter_ns(lport, lport->state);
 		break;
 	case LPORT_ST_SCR:
 		fc_lport_enter_scr(lport);


  parent reply	other threads:[~2009-09-11 23:58 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-11 23:56 [PATCH 00/35] libfc, libfcoe and fcoe updates for 2.6.32 Robert Love
2009-09-11 23:57 ` [PATCH 01/35] libfc: fix typo in retry check on received PRLI Robert Love
2009-09-11 23:57 ` [PATCH 02/35] fcoe: Increase FCOE_MAX_LUN to 0xFFFF (65535) Robert Love
2009-09-11 23:57 ` [PATCH 03/35] libfc: Move non-common routines and prototypes out of libfc.h Robert Love
2009-09-11 23:57 ` [PATCH 04/35] libfc: Remove fc_fcp_complete Robert Love
2009-09-11 23:57 ` [PATCH 05/35] libfc: Add libfc/fc_libfc.[ch] for libfc internal routines Robert Love
2009-09-11 23:57 ` [PATCH 06/35] libfc: Move libfc_init and libfc_exit to fc_libfc.c Robert Love
2009-09-11 23:57 ` [PATCH 07/35] libfc: fix ddp in fc_fcp for 0 xid Robert Love
2009-09-11 23:57 ` [PATCH 08/35] fcoe: remove redundant checking of netdev->netdev_ops Robert Love
2009-09-11 23:57 ` [PATCH 09/35] libfc, fcoe: fixes for highmem skb linearize panics Robert Love
2009-09-11 23:57 ` [PATCH 10/35] libfc: changes to libfc_host_alloc to consolidate initialization with allocation Robert Love
2009-09-11 23:57 ` [PATCH 11/35] libfc: add some generic NPIV support routines to libfc Robert Love
2009-09-11 23:57 ` [PATCH 12/35] libfc: vport link handling and fc_vport state managment Robert Love
2009-09-11 23:58 ` [PATCH 13/35] libfc, libfcoe: FDISC ELS for NPIV Robert Love
2009-09-11 23:58 ` [PATCH 14/35] libfcoe, fcoe: libfcoe NPIV support Robert Love
2009-09-11 23:58 ` [PATCH 15/35] fcoe: add a separate scsi transport template for NPIV vports Robert Love
2009-09-11 23:58 ` [PATCH 16/35] fcoe: NPIV vport create/destroy Robert Love
2009-09-11 23:58 ` [PATCH 17/35] libfc: RPN_ID is obsolete and unnecessary Robert Love
2009-09-11 23:58 ` [PATCH 18/35] libfc: RNN_ID may be required before RSNN_NN with some switches Robert Love
2009-09-11 23:58 ` [PATCH 19/35] libfc: Register Symbolic Node Name (RSNN_NN) Robert Love
2009-09-11 23:58 ` [PATCH 20/35] libfc: Register Symbolic Port Name (RSPN_ID) Robert Love
2009-09-11 23:58 ` [PATCH 21/35] libfc: combine name server registration response handlers Robert Love
2009-09-11 23:58 ` Robert Love [this message]
2009-09-11 23:58 ` [PATCH 23/35] fcoe: vport symbolic name support Robert Love
2009-09-11 23:59 ` [PATCH 24/35] libfc: Export FC headers Robert Love
2009-09-11 23:59 ` [PATCH 25/35] libfc: Add routine to copy data from a buffer to a SG list Robert Love
2009-09-11 23:59 ` [PATCH 26/35] libfc, fcoe: Add FC passthrough support Robert Love
2009-09-11 23:59 ` [PATCH 27/35] libfc, fcoe: Don't EXPORT_SYMBOLS unnecessarily Robert Love
2009-09-11 23:59 ` [PATCH 28/35] libfc: Remove unused fc_lport pointer from fc_fcp_pkt_abort Robert Love
2009-09-11 23:59 ` [PATCH 29/35] libfc: Formatting cleanups across libfc Robert Love
2009-09-11 23:59 ` [PATCH 30/35] libfcoe: formatting and comment cleanups Robert Love
2009-09-11 23:59 ` [PATCH 31/35] fcoe: Formatting cleanups and commenting Robert Love
2009-09-11 23:59 ` [PATCH 32/35] libfc: Fix wrong scsi return status under FC_DATA_UNDRUN Robert Love
2009-09-11 23:59 ` [PATCH 33/35] fcoe, libfc: use single frame allocation API Robert Love
2009-09-12  0:00 ` [PATCH 34/35] libfc: reduce can_queue for all FCP frame allocation failures Robert Love
2009-09-12  0:00 ` [PATCH 35/35] libfc: adds can_queue ramp up Robert Love
2009-09-14 17:18   ` Mike Christie
2009-09-14 23:23     ` Vasu Dev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090911235852.27223.61607.stgit@localhost.localdomain \
    --to=robert.w.love@intel.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=christopher.leech@intel.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox