From: Herbert Xu Date: Thu, 17 Nov 2005 17:47:45 +0000 (-0800) Subject: [PATCH] USB: fix race in kaweth disconnect X-Git-Tag: v2.6.15-rc2~48 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d23b536bb715673ca0ccbdaac2b6ce2c001d06e9;p=linux-2.6 [PATCH] USB: fix race in kaweth disconnect this patch from Herbert Xu fixes a race by moving termination of the URBs into close() exclusively. Signed-off-by: Herbert Xu Signed-off-by: Oliver Neukum Signed-off-by: Greg Kroah-Hartman Signed-off-by: Linus Torvalds --- diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index 6bef1be6b3..b577651802 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c @@ -219,7 +219,6 @@ struct kaweth_device __u32 status; int end; - int removed; int suspend_lowmem_rx; int suspend_lowmem_ctrl; int linkstate; @@ -699,6 +698,7 @@ static int kaweth_close(struct net_device *net) usb_kill_urb(kaweth->irq_urb); usb_kill_urb(kaweth->rx_urb); + usb_kill_urb(kaweth->tx_urb); flush_scheduled_work(); @@ -750,13 +750,6 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) spin_lock(&kaweth->device_lock); - if (kaweth->removed) { - /* our device is undergoing disconnection - we bail out */ - spin_unlock(&kaweth->device_lock); - dev_kfree_skb_irq(skb); - return 0; - } - kaweth_async_set_rx_mode(kaweth); netif_stop_queue(net); @@ -1136,10 +1129,6 @@ static void kaweth_disconnect(struct usb_interface *intf) return; } netdev = kaweth->net; - kaweth->removed = 1; - usb_kill_urb(kaweth->irq_urb); - usb_kill_urb(kaweth->rx_urb); - usb_kill_urb(kaweth->tx_urb); kaweth_dbg("Unregistering net device"); unregister_netdev(netdev);