David:

This patch fixes the bug you ran across in the scatter-gather library.  
(It includes my earlier change to suppress incorrect error messages as 
well).

The problem turned out to be the way io->count was handled.  I'm assuming
that field was meant to be a count of outstanding URBs.  If it wasn't...  
well, it is now.  It was initialized before the URBs were submitted and
the code tried to adjust for that when a submission failed, but it failed
to adjust when submissions didn't take place for any other reason.  As a
result the struct completion was never signalled, causing a hang.

The patch increments io->count every time a submission succeeds, so no 
adjustments are needed.  This fixes the bug (as determined by inserting an 
msleep() call after usb_submit_urb() to force the race to occur).

Take a look and send it on to Greg if it's okay.

Alan Stern



Signed-off-by: Alan Stern <[EMAIL PROTECTED]>

===== drivers/usb/core/message.c 1.92 vs edited =====
--- 1.92/drivers/usb/core/message.c     Fri Jun 11 07:49:33 2004
+++ edited/drivers/usb/core/message.c   Tue Jun 15 16:54:00 2004
@@ -248,7 +248,7 @@
                 * unlink pending urbs so they won't rx/tx bad data.
                 */
                for (i = 0, found = 0; i < io->entries; i++) {
-                       if (!io->urbs [i])
+                       if (!io->urbs [i] || !io->urbs [i]->dev)
                                continue;
                        if (found) {
                                status = usb_unlink_urb (io->urbs [i]);
@@ -347,7 +347,7 @@
        if (usb_pipein (pipe))
                urb_flags |= URB_SHORT_NOT_OK;
 
-       for (i = 0; i < io->entries; i++, io->count = i) {
+       for (i = 0; i < io->entries; i++) {
                unsigned                len;
 
                io->urbs [i] = usb_alloc_urb (0, mem_flags);
@@ -449,6 +449,8 @@
 
                io->urbs [i]->dev = io->dev;
                retval = usb_submit_urb (io->urbs [i], SLAB_ATOMIC);
+               if (retval == 0)
+                       ++io->count;
 
                /* after we submit, let completions or cancelations fire;
                 * we handshake using io->status.
@@ -478,7 +480,6 @@
                        /* fail any uncompleted urbs */
                default:
                        spin_lock_irq (&io->lock);
-                       io->count -= entries - i;
                        if (io->status == -EINPROGRESS)
                                io->status = retval;
                        if (io->count == 0)



-------------------------------------------------------
This SF.Net email is sponsored by The 2004 JavaOne(SM) Conference
Learn from the experts at JavaOne(SM), Sun's Worldwide Java Developer
Conference, June 28 - July 1 at the Moscone Center in San Francisco, CA
REGISTER AND SAVE! http://java.sun.com/javaone/sf Priority Code NWMGYKND
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to