USB: dummy-hcd: disable interrupts during req->complete
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>pull/6/head
parent
be0c8015a2
commit
b4dbda1a22
|
|
@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
|
||||||
if (!dum->driver)
|
if (!dum->driver)
|
||||||
return -ESHUTDOWN;
|
return -ESHUTDOWN;
|
||||||
|
|
||||||
spin_lock_irqsave (&dum->lock, flags);
|
local_irq_save (flags);
|
||||||
|
spin_lock (&dum->lock);
|
||||||
list_for_each_entry (req, &ep->queue, queue) {
|
list_for_each_entry (req, &ep->queue, queue) {
|
||||||
if (&req->req == _req) {
|
if (&req->req == _req) {
|
||||||
list_del_init (&req->queue);
|
list_del_init (&req->queue);
|
||||||
|
|
@ -618,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore (&dum->lock, flags);
|
spin_unlock (&dum->lock);
|
||||||
|
|
||||||
if (retval == 0) {
|
if (retval == 0) {
|
||||||
dev_dbg (udc_dev(dum),
|
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, _ep->name, _req->length, _req->buf);
|
||||||
_req->complete (_ep, _req);
|
_req->complete (_ep, _req);
|
||||||
}
|
}
|
||||||
|
local_irq_restore (flags);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue