From c3142d8d7c692487f50dda956396e9492fb869c3 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Mon, 18 Aug 2008 16:36:52 +0200 Subject: [PATCH] --- yaml --- r: 108969 b: refs/heads/master c: 77571f05a483c0259e42ba2f482c82debc9a63af h: refs/heads/master i: 108967: ce05f8715a1ffb0975ced617d35a4d69f1956047 v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/urb.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 8afdf10f8b8d..dc34078aed05 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f8033827d8e92db6159d34ed45c608522674ecd8 +refs/heads/master: 77571f05a483c0259e42ba2f482c82debc9a63af diff --git a/trunk/drivers/usb/core/urb.c b/trunk/drivers/usb/core/urb.c index c0b1ae25ae2a..47111e88f791 100644 --- a/trunk/drivers/usb/core/urb.c +++ b/trunk/drivers/usb/core/urb.c @@ -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);