USB: fix bug in usb_unlink_anchored_urbs()
authorOliver Neukum <oliver@neukum.org>
Mon, 18 Aug 2008 14:36:52 +0000 (16:36 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 21 Aug 2008 17:26:32 +0000 (10:26 -0700)
Irqs must not accidentally be reenabled.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/urb.c

index c0b1ae25ae2a8923cf463bd670f3873acaf87102..47111e88f791ad748956d4cbae7317145cfd8927 100644 (file)
@@ -601,15 +601,20 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs);
 void usb_unlink_anchored_urbs(struct usb_anchor *anchor)
 {
        struct urb *victim;
+       unsigned long flags;
 
-       spin_lock_irq(&anchor->lock);
+       spin_lock_irqsave(&anchor->lock, flags);
        while (!list_empty(&anchor->urb_list)) {
                victim = list_entry(anchor->urb_list.prev, struct urb,
                                    anchor_list);
+               usb_get_urb(victim);
+               spin_unlock_irqrestore(&anchor->lock, flags);
                /* this will unanchor the URB */
                usb_unlink_urb(victim);
+               usb_put_urb(victim);
+               spin_lock_irqsave(&anchor->lock, flags);
        }
-       spin_unlock_irq(&anchor->lock);
+       spin_unlock_irqrestore(&anchor->lock, flags);
 }
 EXPORT_SYMBOL_GPL(usb_unlink_anchored_urbs);