aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/fcoe/libfcoe.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
index 99f583f40df3..787e7225ddde 100644
--- a/drivers/scsi/fcoe/libfcoe.c
+++ b/drivers/scsi/fcoe/libfcoe.c
@@ -156,9 +156,7 @@ static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip)
156void fcoe_ctlr_destroy(struct fcoe_ctlr *fip) 156void fcoe_ctlr_destroy(struct fcoe_ctlr *fip)
157{ 157{
158 cancel_work_sync(&fip->recv_work); 158 cancel_work_sync(&fip->recv_work);
159 spin_lock_bh(&fip->fip_recv_list.lock); 159 skb_queue_purge(&fip->fip_recv_list);
160 __skb_queue_purge(&fip->fip_recv_list);
161 spin_unlock_bh(&fip->fip_recv_list.lock);
162 160
163 spin_lock_bh(&fip->lock); 161 spin_lock_bh(&fip->lock);
164 fip->state = FIP_ST_DISABLED; 162 fip->state = FIP_ST_DISABLED;
@@ -1005,13 +1003,11 @@ static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip,
1005 * @fip: The FCoE controller that received the packet 1003 * @fip: The FCoE controller that received the packet
1006 * @skb: The received FIP packet 1004 * @skb: The received FIP packet
1007 * 1005 *
1008 * This is called from NET_RX_SOFTIRQ. 1006 * This may be called from either NET_RX_SOFTIRQ or IRQ.
1009 */ 1007 */
1010void fcoe_ctlr_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) 1008void fcoe_ctlr_recv(struct fcoe_ctlr *fip, struct sk_buff *skb)
1011{ 1009{
1012 spin_lock_bh(&fip->fip_recv_list.lock); 1010 skb_queue_tail(&fip->fip_recv_list, skb);
1013 __skb_queue_tail(&fip->fip_recv_list, skb);
1014 spin_unlock_bh(&fip->fip_recv_list.lock);
1015 schedule_work(&fip->recv_work); 1011 schedule_work(&fip->recv_work);
1016} 1012}
1017EXPORT_SYMBOL(fcoe_ctlr_recv); 1013EXPORT_SYMBOL(fcoe_ctlr_recv);
@@ -1251,13 +1247,8 @@ static void fcoe_ctlr_recv_work(struct work_struct *recv_work)
1251 struct sk_buff *skb; 1247 struct sk_buff *skb;
1252 1248
1253 fip = container_of(recv_work, struct fcoe_ctlr, recv_work); 1249 fip = container_of(recv_work, struct fcoe_ctlr, recv_work);
1254 spin_lock_bh(&fip->fip_recv_list.lock); 1250 while ((skb = skb_dequeue(&fip->fip_recv_list)))
1255 while ((skb = __skb_dequeue(&fip->fip_recv_list))) {
1256 spin_unlock_bh(&fip->fip_recv_list.lock);
1257 fcoe_ctlr_recv_handler(fip, skb); 1251 fcoe_ctlr_recv_handler(fip, skb);
1258 spin_lock_bh(&fip->fip_recv_list.lock);
1259 }
1260 spin_unlock_bh(&fip->fip_recv_list.lock);
1261} 1252}
1262 1253
1263/** 1254/**