Index: /trunk/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp	(revision 52947)
+++ /trunk/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp	(revision 52948)
@@ -281,6 +281,7 @@
 static void usbProxyLinuxUrbLinkInFlight(PUSBPROXYDEVLNX pDevLnx, PUSBPROXYURBLNX pUrbLnx)
 {
+    LogFlowFunc(("pDevLnx=%p pUrbLnx=%p\n", pDevLnx, pUrbLnx));
     Assert(RTCritSectIsOwner(&pDevLnx->CritSect));
-    Assert(!pUrbLnx->pSplitHead);
+    Assert(!pUrbLnx->pSplitHead || pUrbLnx->pSplitHead == pUrbLnx);
     RTListAppend(&pDevLnx->ListInFlight, &pUrbLnx->NodeList);
 }
@@ -294,4 +295,5 @@
 static void usbProxyLinuxUrbUnlinkInFlight(PUSBPROXYDEVLNX pDevLnx, PUSBPROXYURBLNX pUrbLnx)
 {
+    LogFlowFunc(("pDevLnx=%p pUrbLnx=%p\n", pDevLnx, pUrbLnx));
     RTCritSectEnter(&pDevLnx->CritSect);
 
@@ -302,5 +304,4 @@
 
     RTListNodeRemove(&pUrbLnx->NodeList);
-    pUrbLnx->pSplitHead = pUrbLnx->pSplitNext = NULL;
 
     RTCritSectLeave(&pDevLnx->CritSect);
@@ -319,4 +320,6 @@
     PUSBPROXYURBLNX pUrbLnx;
 
+    LogFlowFunc(("pProxyDev=%p pSplitHead=%p\n", pProxyDev, pSplitHead));
+
     RTCritSectEnter(&pDevLnx->CritSect);
 
@@ -342,4 +345,5 @@
     pUrbLnx->fCanceledBySubmit = false;
     pUrbLnx->fSplitElementReaped = false;
+    LogFlowFunc(("returns pUrbLnx=%p\n", pUrbLnx));
     return pUrbLnx;
 }
@@ -356,11 +360,11 @@
     PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
+    LogFlowFunc(("pProxyDev=%p pUrbLnx=%p\n", pProxyDev, pUrbLnx));
+
+    /*
+     * Link it into the free list.
+     */
     RTCritSectEnter(&pDevLnx->CritSect);
-
-    /*
-     * Link it into the free list.
-     */
     RTListAppend(&pDevLnx->ListFree, &pUrbLnx->NodeList);
-
     RTCritSectLeave(&pDevLnx->CritSect);
 }
@@ -376,4 +380,6 @@
 {
     PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
+
+    LogFlowFunc(("pProxyDev=%p pUrbLnx=%p\n", pProxyDev, pUrbLnx));
 
     RTCritSectEnter(&pDevLnx->CritSect);
@@ -1306,4 +1312,6 @@
     uint8_t             *pb = (uint8_t *)pCur->KUrb.buffer;
 
+    LogFlowFunc(("pProxyDev=%p pHead=%p pCur=%p\n", pProxyDev, pHead, pCur));
+
     Assert(cbLeft != 0);
     pNew = pCur->pSplitNext = usbProxyLinuxUrbAlloc(pProxyDev, pHead);
@@ -1324,4 +1332,5 @@
     Assert(cbLeft < INT32_MAX);
     pNew->cbSplitRemaining = cbLeft;
+    LogFlowFunc(("returns pNew=%p\n", pNew));
     return pNew;
 }
@@ -1523,4 +1532,5 @@
         if (errno == ENODEV)
         {
+            rc = RTErrConvertFromErrno(errno);
             Log(("usbProxyLinuxUrbQueue: ENODEV -> unplugged. pProxyDev=%s\n", usbProxyGetName(pProxyDev)));
             if (pUrb->enmType == VUSBXFERTYPE_MSG)
@@ -1530,5 +1540,5 @@
             usbProxyLinuxUrbFree(pProxyDev, pUrbLnx);
             usbProxLinuxUrbUnplugged(pProxyDev);
-            return RTErrConvertFromErrno(errno);
+            return rc;
         }
 
@@ -1792,4 +1802,5 @@
             }
             pUrb->cbData = pbEnd - &pUrb->abData[0];
+            usbProxyLinuxUrbUnlinkInFlight(pDevLnx, pUrbLnx);
             usbProxyLinuxUrbFreeSplitList(pProxyDev, pUrbLnx);
         }
