提交 b4dbda1a 编写于 作者: A Alan Stern 提交者: Greg Kroah-Hartman

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: NAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 be0c8015
...@@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册