summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2012-11-07 22:35:00 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-12 03:10:46 +0100
commit2f02bc8af3abb846823811af65ec6cc46a4d525d (patch)
treed2d5930a67122733e3af7aee09560eebd2a912b3
parentUSB: EHCI: bugfix: urb->hcpriv should not be NULL (diff)
downloadlinux-2f02bc8af3abb846823811af65ec6cc46a4d525d.tar.xz
linux-2f02bc8af3abb846823811af65ec6cc46a4d525d.zip
USB: report submission of active URBs
This patch (as1633) changes slightly the way usbcore handled submissions of URBs that are already active. It will now return -EBUSY rather than -EINVAL, and it will call WARN_ONCE to draw people's attention to the bug. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/usb/error-codes.txt2
-rw-r--r--drivers/usb/core/urb.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/Documentation/usb/error-codes.txt b/Documentation/usb/error-codes.txt
index 8d1e2a9ebbba..9c3eb845ebe5 100644
--- a/Documentation/usb/error-codes.txt
+++ b/Documentation/usb/error-codes.txt
@@ -21,6 +21,8 @@ Non-USB-specific:
USB-specific:
+-EBUSY The URB is already active.
+
-ENODEV specified USB-device or bus doesn't exist
-ENOENT specified interface or endpoint does not exist or
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index 3662287e2f4f..e0d9d948218c 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -321,8 +321,13 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
struct usb_host_endpoint *ep;
int is_out;
- if (!urb || urb->hcpriv || !urb->complete)
+ if (!urb || !urb->complete)
return -EINVAL;
+ if (urb->hcpriv) {
+ WARN_ONCE(1, "URB %p submitted while active\n", urb);
+ return -EBUSY;
+ }
+
dev = urb->dev;
if ((!dev) || (dev->state < USB_STATE_UNAUTHENTICATED))
return -ENODEV;