aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fcoe
diff options
context:
space:
mode:
authorChris Leech <christopher.leech@intel.com>2009-08-25 16:59:08 -0400
committerJames Bottomley <James.Bottomley@suse.de>2009-09-10 13:07:28 -0400
commita4b7cfaee487caef913be978dce60896fe741268 (patch)
tree42de6baeef3390b94b1cb99a05cc4c44d94cefce /drivers/scsi/fcoe
parent05cc7390735c49357b9ae67bf97f1c1579547f5b (diff)
[SCSI] libfcoe: fcoe_ctlr_destroy use cancel_work_sync instead of flush_work
Use cancel_work_sync() in place of flush_work(), so that fcoe_ctlr_destroy() can be called from a workqueue. Also, purge the receive queue after the recv_work has been cancled because if recv_work isn't run it's not guaranteed to be empty now. Signed-off-by: Chris Leech <christopher.leech@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r--drivers/scsi/fcoe/libfcoe.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
index d0b5208e1a45..62a4c2026072 100644
--- a/drivers/scsi/fcoe/libfcoe.c
+++ b/drivers/scsi/fcoe/libfcoe.c
@@ -148,13 +148,17 @@ static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip)
148 */ 148 */
149void fcoe_ctlr_destroy(struct fcoe_ctlr *fip) 149void fcoe_ctlr_destroy(struct fcoe_ctlr *fip)
150{ 150{
151 flush_work(&fip->recv_work); 151 cancel_work_sync(&fip->recv_work);
152 spin_lock_bh(&fip->fip_recv_list.lock);
153 __skb_queue_purge(&fip->fip_recv_list);
154 spin_unlock_bh(&fip->fip_recv_list.lock);
155
152 spin_lock_bh(&fip->lock); 156 spin_lock_bh(&fip->lock);
153 fip->state = FIP_ST_DISABLED; 157 fip->state = FIP_ST_DISABLED;
154 fcoe_ctlr_reset_fcfs(fip); 158 fcoe_ctlr_reset_fcfs(fip);
155 spin_unlock_bh(&fip->lock); 159 spin_unlock_bh(&fip->lock);
156 del_timer_sync(&fip->timer); 160 del_timer_sync(&fip->timer);
157 flush_work(&fip->link_work); 161 cancel_work_sync(&fip->link_work);
158} 162}
159EXPORT_SYMBOL(fcoe_ctlr_destroy); 163EXPORT_SYMBOL(fcoe_ctlr_destroy);
160 164