Commit 31c37a6f21d86e6bca095b71d603ed543ae070ad
Committed by
James Bottomley
1 parent
bd756ddea1
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
[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; |