Index: /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 29329)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 29330)
@@ -335,6 +335,11 @@
     PDRVSCSI pThis = (PDRVSCSI)pVScsiDeviceUser;
 
+    ASMAtomicDecU32(&pThis->StatIoDepth);
+
     pThis->pDevScsiPort->pfnSCSIRequestCompleted(pThis->pDevScsiPort, (PPDMSCSIREQUEST)pVScsiReqUser,
                                                  rcReq);
+
+    if (RT_UNLIKELY(pThis->fDummySignal) && !pThis->StatIoDepth)
+        PDMDrvHlpAsyncNotificationCompleted(pThis->pDrvIns);
 }
 
@@ -492,27 +497,39 @@
     PDRVSCSI pThis = PDMINS_2_DATA(pDrvIns, PDRVSCSI);
 
-    if (!pThis->pQueueRequests)
+    if (!pThis->pDrvBlockAsync)
+    {
+        if (!pThis->pQueueRequests)
+            return;
+
+        ASMAtomicWriteBool(&pThis->fDummySignal, true);
+        if (drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
+        {
+            if (!RTReqIsBusy(pThis->pQueueRequests))
+            {
+                ASMAtomicWriteBool(&pThis->fDummySignal, false);
+                return;
+            }
+
+            PRTREQ pReq;
+            int rc = RTReqCall(pThis->pQueueRequests, &pReq, 0 /*ms*/, (PFNRT)drvscsiAsyncIOLoopSyncCallback, 1, pThis);
+            if (RT_SUCCESS(rc))
+            {
+                ASMAtomicWriteBool(&pThis->fDummySignal, false);
+                RTReqFree(pReq);
+                return;
+            }
+
+            pThis->pPendingDummyReq = pReq;
+        }
+    }
+    else
+    {
+        if (pThis->StatIoDepth > 0)
+        {
+            ASMAtomicWriteBool(&pThis->fDummySignal, true);
+        }
         return;
-
-    ASMAtomicWriteBool(&pThis->fDummySignal, true);
-    if (drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
-    {
-        if (!RTReqIsBusy(pThis->pQueueRequests))
-        {
-            ASMAtomicWriteBool(&pThis->fDummySignal, false);
-            return;
-        }
-
-        PRTREQ pReq;
-        int rc = RTReqCall(pThis->pQueueRequests, &pReq, 0 /*ms*/, (PFNRT)drvscsiAsyncIOLoopSyncCallback, 1, pThis);
-        if (RT_SUCCESS(rc))
-        {
-            ASMAtomicWriteBool(&pThis->fDummySignal, false);
-            RTReqFree(pReq);
-            return;
-        }
-
-        pThis->pPendingDummyReq = pReq;
-    }
+    }
+
     PDMDrvHlpSetAsyncNotification(pDrvIns, pfnAsyncNotify);
 }
@@ -528,9 +545,19 @@
     PDRVSCSI pThis = PDMINS_2_DATA(pDrvIns, PDRVSCSI);
 
-    if (!drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
-        return false;
-    ASMAtomicWriteBool(&pThis->fDummySignal, false);
-    PDMR3ThreadSuspend(pThis->pAsyncIOThread);
-    return true;
+    if (pThis->pDrvBlockAsync)
+    {
+        if (pThis->StatIoDepth > 0)
+            return false;
+        else
+            return true;
+    }
+    else
+    {
+        if (!drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
+            return false;
+        ASMAtomicWriteBool(&pThis->fDummySignal, false);
+        PDMR3ThreadSuspend(pThis->pAsyncIOThread);
+        return true;
+    }
 }
 
@@ -561,8 +588,18 @@
     PDRVSCSI pThis = PDMINS_2_DATA(pDrvIns, PDRVSCSI);
 
-    if (!drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
-        return false;
-    ASMAtomicWriteBool(&pThis->fDummySignal, false);
-    return true;
+    if (pThis->pDrvBlockAsync)
+    {
+        if (pThis->StatIoDepth > 0)
+            return false;
+        else
+            return true;
+    }
+    else
+    {
+        if (!drvscsiAsyncIOLoopNoPendingDummy(pThis, 0 /*ms*/))
+            return false;
+        ASMAtomicWriteBool(&pThis->fDummySignal, false);
+        return true;
+    }
 }
 
@@ -690,8 +727,4 @@
     rc = VSCSIDeviceLunAttach(pThis->hVScsiDevice, pThis->hVScsiLun, 0);
     AssertMsgReturn(RT_SUCCESS(rc), ("Failed to attached the LUN to the SCSI device\n"), rc);
-
-    /* Create request queue. */
-    rc = RTReqCreateQueue(&pThis->pQueueRequests);
-    AssertMsgReturn(RT_SUCCESS(rc), ("Failed to create request queue rc=%Rrc\n"), rc);
 
     /* Register statistics counter. */
@@ -709,9 +742,14 @@
                             "Number of active tasks.", "/Devices/SCSI0/%d/IoDepth", pDrvIns->iInstance);
 
-
-    /* Create I/O thread. */
-    rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pAsyncIOThread, pThis, drvscsiAsyncIOLoop,
-                               drvscsiAsyncIOLoopWakeup, 0, RTTHREADTYPE_IO, "SCSI async IO");
-    AssertMsgReturn(RT_SUCCESS(rc), ("Failed to create async I/O thread rc=%Rrc\n"), rc);
+    if (!pThis->pDrvBlockAsync)
+    {
+        /* Create request queue. */
+        rc = RTReqCreateQueue(&pThis->pQueueRequests);
+        AssertMsgReturn(RT_SUCCESS(rc), ("Failed to create request queue rc=%Rrc\n"), rc);
+        /* Create I/O thread. */
+        rc = PDMDrvHlpThreadCreate(pDrvIns, &pThis->pAsyncIOThread, pThis, drvscsiAsyncIOLoop,
+                                   drvscsiAsyncIOLoopWakeup, 0, RTTHREADTYPE_IO, "SCSI async IO");
+        AssertMsgReturn(RT_SUCCESS(rc), ("Failed to create async I/O thread rc=%Rrc\n"), rc);
+    }
 
     return VINF_SUCCESS;
