Commit 31c37a6f21d86e6bca095b71d603ed543ae070ad

Authored by Neerav Parikh
Committed by James Bottomley
1 parent bd756ddea1

[SCSI] fcoe: Fix write errors on NPIV ports

SCSI errors were generated while writing to LUNs
connected via NPIV ports.

Debugging this it was found that the FCoE packets
transmitted via the NPIV ports were not tagged with
correct user priority as negotiated with peer by DCB
agent. This resulted in FCoE traffic going with priority
zero(0) that did not have priority flow control (PFC)
enabled for it. The initiator after transferring data
to the target never saw any reply indicating the transfer
was complete. This resulted in error recovery (ABTS) and
SCSI command retries by the scsi-mid layer; eventually
resulting in I/O errors.

This patch fixes this issue by keeping the FCoE user
priority information in the fcoe_interface instance
that is common for both the physical port as well as
NPIV ports connected to that physical port; instead
of storing it in fcoe_port structure that has a per
port instance.

Signed-off-by: Neerav Parikh <Neerav.Parikh@intel.com>
Acked-by: Yi Zou <yi.zou@intel.com>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Marcus Dennis <marcusx.e.dennis@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

Showing 3 changed files with 7 additions and 11 deletions Side-by-side Diff

drivers/scsi/fcoe/fcoe.c
... ... @@ -1643,7 +1643,7 @@
1643 1643 skb_reset_network_header(skb);
1644 1644 skb->mac_len = elen;
1645 1645 skb->protocol = htons(ETH_P_FCOE);
1646   - skb->priority = port->priority;
  1646 + skb->priority = fcoe->priority;
1647 1647  
1648 1648 if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN &&
1649 1649 fcoe->realdev->features & NETIF_F_HW_VLAN_TX) {
... ... @@ -1917,7 +1917,6 @@
1917 1917 struct fcoe_ctlr *ctlr;
1918 1918 struct fcoe_interface *fcoe;
1919 1919 struct net_device *netdev;
1920   - struct fcoe_port *port;
1921 1920 int prio;
1922 1921  
1923 1922 if (entry->app.selector != DCB_APP_IDTYPE_ETHTYPE)
... ... @@ -1946,10 +1945,8 @@
1946 1945 entry->app.protocol == ETH_P_FCOE)
1947 1946 ctlr->priority = prio;
1948 1947  
1949   - if (entry->app.protocol == ETH_P_FCOE) {
1950   - port = lport_priv(ctlr->lp);
1951   - port->priority = prio;
1952   - }
  1948 + if (entry->app.protocol == ETH_P_FCOE)
  1949 + fcoe->priority = prio;
1953 1950  
1954 1951 return NOTIFY_OK;
1955 1952 }
... ... @@ -2180,7 +2177,6 @@
2180 2177 u8 fup, up;
2181 2178 struct net_device *netdev = fcoe->realdev;
2182 2179 struct fcoe_ctlr *ctlr = fcoe_to_ctlr(fcoe);
2183   - struct fcoe_port *port = lport_priv(ctlr->lp);
2184 2180 struct dcb_app app = {
2185 2181 .priority = 0,
2186 2182 .protocol = ETH_P_FCOE
... ... @@ -2202,8 +2198,8 @@
2202 2198 fup = dcb_getapp(netdev, &app);
2203 2199 }
2204 2200  
2205   - port->priority = ffs(up) ? ffs(up) - 1 : 0;
2206   - ctlr->priority = ffs(fup) ? ffs(fup) - 1 : port->priority;
  2201 + fcoe->priority = ffs(up) ? ffs(up) - 1 : 0;
  2202 + ctlr->priority = ffs(fup) ? ffs(fup) - 1 : fcoe->priority;
2207 2203 }
2208 2204 #endif
2209 2205 }
drivers/scsi/fcoe/fcoe.h
... ... @@ -71,6 +71,7 @@
71 71 * @oem: The offload exchange manager for all local port
72 72 * instances associated with this port
73 73 * @removed: Indicates fcoe interface removed from net device
  74 + * @priority: Priority for the FCoE packet (DCB)
74 75 * This structure is 1:1 with a net device.
75 76 */
76 77 struct fcoe_interface {
... ... @@ -81,6 +82,7 @@
81 82 struct packet_type fip_packet_type;
82 83 struct fc_exch_mgr *oem;
83 84 u8 removed;
  85 + u8 priority;
84 86 };
85 87  
86 88 #define fcoe_to_ctlr(x) \
include/scsi/libfcoe.h
... ... @@ -327,7 +327,6 @@
327 327 * @lport: The associated local port
328 328 * @fcoe_pending_queue: The pending Rx queue of skbs
329 329 * @fcoe_pending_queue_active: Indicates if the pending queue is active
330   - * @priority: Packet priority (DCB)
331 330 * @max_queue_depth: Max queue depth of pending queue
332 331 * @min_queue_depth: Min queue depth of pending queue
333 332 * @timer: The queue timer
... ... @@ -343,7 +342,6 @@
343 342 struct fc_lport *lport;
344 343 struct sk_buff_head fcoe_pending_queue;
345 344 u8 fcoe_pending_queue_active;
346   - u8 priority;
347 345 u32 max_queue_depth;
348 346 u32 min_queue_depth;
349 347 struct timer_list timer;