USB: dummy-hcd: disable interrupts during req->complete
authorAlan Stern <stern@rowland.harvard.edu>
Fri, 28 Jul 2006 21:07:34 +0000 (17:07 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 2 Aug 2006 23:41:42 +0000 (16:41 -0700)
This patch (as756) fixes a bug in dummy-hcd found by the lockdep
checker.  In one of the code paths, the driver did not disable
interrupts before calling a request completion routine.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/dummy_hcd.c

index 4be47195bd38d633b3b6dca431682cc69543bcfa..7d1c22c34957bfa94ebc5dfe067a6b98ffa86e28 100644 (file)
@@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
        if (!dum->driver)
                return -ESHUTDOWN;
 
-       spin_lock_irqsave (&dum->lock, flags);
+       local_irq_save (flags);
+       spin_lock (&dum->lock);
        list_for_each_entry (req, &ep->queue, queue) {
                if (&req->req == _req) {
                        list_del_init (&req->queue);
@@ -618,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
                        break;
                }
        }
-       spin_unlock_irqrestore (&dum->lock, flags);
+       spin_unlock (&dum->lock);
 
        if (retval == 0) {
                dev_dbg (udc_dev(dum),
@@ -626,6 +627,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
                                req, _ep->name, _req->length, _req->buf);
                _req->complete (_ep, _req);
        }
+       local_irq_restore (flags);
        return retval;
 }