|
@@ -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);
|
|
|
|