From: Robert Love <robert.w.love@intel.com>
To: James.Bottomley@HansenPartnership.com, linux-scsi@vger.kernel.org
Cc: Joe Eykholt <jeykholt@cisco.com>, Robert Love <robert.w.love@intel.com>
Subject: [PATCH 21/24] libfcoe: fcoe: simplify receive FLOGI response
Date: Fri, 18 Sep 2009 15:50:53 -0700 [thread overview]
Message-ID: <20090918225053.5928.88737.stgit@localhost.localdomain> (raw)
In-Reply-To: <20090918224847.5928.52092.stgit@localhost.localdomain>
From: Joe Eykholt <jeykholt@cisco.com>
There was a locking problem where the fip->lock was held during
the call to update_mac(). The rtnl_lock() must be taken before
the fip->lock, not the other way around. This fixes that.
Now that fcoe_ctlr_recv_flog() is called only from the response handler
to a FLOGI request, some checking can be eliminated. Instead of calling
update_mac(), just fill in the granted_mac address for the passed-in
frame (skb).
Eliminate the passed-in source MAC address since it is also in the skb.
Also, in fcoe, call fcoe_set_src_mac() directly instead of going thru
the fip function pointer. This will generate less code.
Then, since fip isn't needed for LOGO response, use lport as the arg.
Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
drivers/scsi/fcoe/fcoe.c | 15 +++++----------
drivers/scsi/fcoe/libfcoe.c | 12 ++++++------
include/scsi/libfcoe.h | 2 +-
3 files changed, 12 insertions(+), 17 deletions(-)
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index d8a5169..be07a45 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -2248,15 +2248,12 @@ static void fcoe_flogi_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
mac = fr_cb(fp)->granted_mac;
if (is_zero_ether_addr(mac)) {
/* pre-FIP */
- mac = eth_hdr(&fp->skb)->h_source;
- if (fcoe_ctlr_recv_flogi(fip, lport, fp, mac)) {
+ if (fcoe_ctlr_recv_flogi(fip, lport, fp)) {
fc_frame_free(fp);
return;
}
- } else {
- /* FIP, libfcoe has already seen it */
- fip->update_mac(lport, fr_cb(fp)->granted_mac);
}
+ fcoe_update_src_mac(lport, mac);
done:
fc_lport_flogi_resp(seq, fp, lport);
}
@@ -2272,13 +2269,11 @@ done:
*/
static void fcoe_logo_resp(struct fc_seq *seq, struct fc_frame *fp, void *arg)
{
- struct fcoe_ctlr *fip = arg;
- struct fc_exch *exch = fc_seq_exch(seq);
- struct fc_lport *lport = exch->lp;
+ struct fc_lport *lport = arg;
static u8 zero_mac[ETH_ALEN] = { 0 };
if (!IS_ERR(fp))
- fip->update_mac(lport, zero_mac);
+ fcoe_update_src_mac(lport, zero_mac);
fc_lport_logo_resp(seq, fp, lport);
}
@@ -2313,7 +2308,7 @@ static struct fc_seq *fcoe_elsct_send(struct fc_lport *lport, u32 did,
if (ntoh24(fh->fh_d_id) != FC_FID_FLOGI)
break;
return fc_elsct_send(lport, did, fp, op, fcoe_logo_resp,
- fip, timeout);
+ lport, timeout);
}
return fc_elsct_send(lport, did, fp, op, resp, arg, timeout);
}
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
index 062ad15..e4508c8 100644
--- a/drivers/scsi/fcoe/libfcoe.c
+++ b/drivers/scsi/fcoe/libfcoe.c
@@ -1255,10 +1255,9 @@ static void fcoe_ctlr_recv_work(struct work_struct *recv_work)
}
/**
- * fcoe_ctlr_recv_flogi() - Snoop pre-FIP receipt of FLOGI response or request
+ * fcoe_ctlr_recv_flogi() - Snoop pre-FIP receipt of FLOGI response
* @fip: The FCoE controller
* @fp: The FC frame to snoop
- * @sa: Ethernet source MAC address from received FCoE frame
*
* Snoop potential response to FLOGI or even incoming FLOGI.
*
@@ -1266,16 +1265,18 @@ static void fcoe_ctlr_recv_work(struct work_struct *recv_work)
* by fip->flogi_oxid != FC_XID_UNKNOWN.
*
* The caller is responsible for freeing the frame.
+ * Fill in the granted_mac address.
*
* Return non-zero if the frame should not be delivered to libfc.
*/
int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *fip, struct fc_lport *lport,
- struct fc_frame *fp, u8 *sa)
+ struct fc_frame *fp)
{
struct fc_frame_header *fh;
u8 op;
- u8 mac[ETH_ALEN];
+ u8 *sa;
+ sa = eth_hdr(&fp->skb)->h_source;
fh = fc_frame_header_get(fp);
if (fh->fh_type != FC_TYPE_ELS)
return 0;
@@ -1306,9 +1307,8 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *fip, struct fc_lport *lport,
fip->map_dest = 0;
}
fip->flogi_oxid = FC_XID_UNKNOWN;
- fc_fcoe_set_mac(mac, fh->fh_d_id);
- fip->update_mac(lport, mac);
spin_unlock_bh(&fip->lock);
+ fc_fcoe_set_mac(fr_cb(fp)->granted_mac, fh->fh_d_id);
} else if (op == ELS_FLOGI && fh->fh_r_ctl == FC_RCTL_ELS_REQ && sa) {
/*
* Save source MAC for point-to-point responses.
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
index e38ffa0..3837872 100644
--- a/include/scsi/libfcoe.h
+++ b/include/scsi/libfcoe.h
@@ -165,7 +165,7 @@ int fcoe_ctlr_link_down(struct fcoe_ctlr *);
int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct fc_lport *, struct sk_buff *);
void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *);
int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *,
- struct fc_frame *, u8 *);
+ struct fc_frame *);
/* libfcoe funcs */
u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);
next prev parent reply other threads:[~2009-09-18 22:50 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-18 22:48 [PATCH 00/24] libfc, libfcoe, fcoe and fnic updates for 2.6.32 Robert Love
2009-09-18 22:48 ` [PATCH 01/24] libfc: lport: fix minor documentation errors Robert Love
2009-09-18 22:48 ` [PATCH 02/24] libfcoe: Allow FIP to be disabled by the driver Robert Love
2009-09-18 22:49 ` [PATCH 03/24] libfcoe: fip: use SCSI host number to identify debug messages Robert Love
2009-09-18 22:49 ` [PATCH 04/24] libfcoe: fip: allow FIP receive to be called from IRQ Robert Love
2009-09-18 22:49 ` [PATCH 05/24] libfcoe: FIP should report link to libfc whether selected or not Robert Love
2009-09-18 22:49 ` [PATCH 06/24] libfc: don't WARN_ON in lport_timeout for RESET state Robert Love
2009-09-18 22:49 ` [PATCH 07/24] libfcoe: don't send ELS in FIP mode if no FCF selected Robert Love
2009-09-18 22:49 ` [PATCH 08/24] fcoe: remove extra function decalrations Robert Love
2009-09-18 22:49 ` [PATCH 09/24] libfc: removes initializing fc_cpu_order and fc_cpu_mask per lport Robert Love
2009-09-18 22:49 ` [PATCH 10/24] libfc: adds missing exch release for accepted RRQ Robert Love
2009-09-18 22:49 ` [PATCH 11/24] libfc: removes unused disc_work and ex_list Robert Love
2009-09-18 22:50 ` [PATCH 12/24] fcoe: Use NETIF_F_FCOE_MTU flag to set up max frame size (lport->mfs) Robert Love
2009-09-18 22:50 ` [PATCH 13/24] fcoe: Call ndo_fcoe_enable/disable to turn FCoE feature on/off in LLD Robert Love
2009-09-18 22:50 ` [PATCH 14/24] fcoe: initialize return value in fcoe_destroy Robert Love
2009-09-18 22:50 ` [PATCH 15/24] fcoe: add check to fail gracefully in bonding mode Robert Love
2009-09-18 22:50 ` [PATCH 16/24] libfc: fix RNN_ID smashing skb payload Robert Love
2009-09-18 22:50 ` [PATCH 17/24] libfc: fix symbolic name registrations smashing skb data Robert Love
2009-09-18 22:50 ` [PATCH 18/24] libfc: fix fc_els_resp_type to correct display of CT responses Robert Love
2009-09-18 22:50 ` [PATCH 19/24] libfc: add set_fid function to libfc template Robert Love
2009-09-18 22:50 ` [PATCH 20/24] libfc: add host number to lport link up/down messages Robert Love
2009-09-18 22:50 ` Robert Love [this message]
2009-09-18 22:50 ` [PATCH 22/24] fnic: Add FIP support to the fnic driver Robert Love
2009-09-18 22:51 ` [PATCH 23/24] libfc: register FC4 features with the FC switch Robert Love
2009-09-18 22:51 ` [PATCH 24/24] MAINTAINERS: Update for libfc, libfcoe, fcoe Robert Love
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=20090918225053.5928.88737.stgit@localhost.localdomain \
--to=robert.w.love@intel.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=jeykholt@cisco.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