Index: /trunk/src/VBox/VMM/PDMAsyncCompletionFileInternal.h
===================================================================
--- /trunk/src/VBox/VMM/PDMAsyncCompletionFileInternal.h	(revision 29465)
+++ /trunk/src/VBox/VMM/PDMAsyncCompletionFileInternal.h	(revision 29466)
@@ -669,4 +669,9 @@
     /** Flag whether this is a prefetch request. */
     bool                                 fPrefetch;
+    /** Already prepared native I/O request.
+     * Used if the request is prepared already but
+     * was not queued because the host has not enough
+     * resources. */
+    RTFILEAIOREQ                         hReq;
     /** Completion function to call on completion. */
     PFNPDMACTASKCOMPLETED                pfnCompleted;
Index: /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp	(revision 29465)
+++ /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp	(revision 29466)
@@ -596,20 +596,6 @@
                     if (rc == VERR_FILE_AIO_INSUFFICIENT_RESSOURCES)
                     {
-                        PPDMACTASKFILE pTasksWaiting;
-
-                        pdmacFileAioMgrNormalRequestFree(pAioMgr, pahReqs[i]);
-
-                        if (pTask->cbBounceBuffer)
-                            RTMemPageFree(pTask->pvBounceBuffer, pTask->cbBounceBuffer);
-
-                        pTask->fPrefetch = false;
-                        pTask->cbBounceBuffer = 0;
-
-                        /* Free the lock and process pending tasks if neccessary */
-                        pTasksWaiting = pdmacFileAioMgrNormalRangeLockFree(pAioMgr, pEndpoint, pTask->pRangeLock);
-
+                        pTask->hReq = pahReqs[i];
                         pdmacFileAioMgrEpAddTask(pEndpoint, pTask);
-                        if (pTasksWaiting)
-                            pdmacFileAioMgrEpAddTaskList(pEndpoint, pTasksWaiting);
                     }
                     else
@@ -627,4 +613,6 @@
                     int rc2 = RTFileAioCtxSubmit(pAioMgr->hAioCtx, ahReqsResubmit, cReqsResubmit);
                     AssertRC(rc2);
+                    pEndpoint->AioMgr.cRequestsActive += cReqsResubmit;
+                    pAioMgr->cRequestsActive += cReqsResubmit;
                     cReqsResubmit = 0;
                 }
@@ -636,4 +624,6 @@
                 int rc2 = RTFileAioCtxSubmit(pAioMgr->hAioCtx, ahReqsResubmit, cReqsResubmit);
                 AssertRC(rc2);
+                pEndpoint->AioMgr.cRequestsActive += cReqsResubmit;
+                pAioMgr->cRequestsActive += cReqsResubmit;
                 cReqsResubmit = 0;
             }
@@ -1064,12 +1054,20 @@
                 RTFILEAIOREQ hReq = NIL_RTFILEAIOREQ;
 
-                if (pEndpoint->enmBackendType == PDMACFILEEPBACKEND_BUFFERED)
-                    rc = pdmacFileAioMgrNormalTaskPrepareBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
-                else if (pEndpoint->enmBackendType == PDMACFILEEPBACKEND_NON_BUFFERED)
-                    rc = pdmacFileAioMgrNormalTaskPrepareNonBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
+                if (pCurr->hReq == NIL_RTFILEAIOREQ)
+                {
+                    if (pEndpoint->enmBackendType == PDMACFILEEPBACKEND_BUFFERED)
+                        rc = pdmacFileAioMgrNormalTaskPrepareBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
+                    else if (pEndpoint->enmBackendType == PDMACFILEEPBACKEND_NON_BUFFERED)
+                        rc = pdmacFileAioMgrNormalTaskPrepareNonBuffered(pAioMgr, pEndpoint, pCurr, &hReq);
+                    else
+                        AssertMsgFailed(("Invalid backend type %d\n", pEndpoint->enmBackendType));
+
+                    AssertRC(rc);
+                }
                 else
-                    AssertMsgFailed(("Invalid backend type %d\n", pEndpoint->enmBackendType));
-
-                AssertRC(rc);
+                {
+                    LogFlow(("Task %#p has I/O request %#p already\n", pCurr, pCurr->hReq));
+                    hReq = pCurr->hReq;
+                }
 
                 LogFlow(("Read/Write request %#p\n", hReq));
@@ -1078,5 +1076,4 @@
                 {
                     apReqs[cRequests] = hReq;
-                    pEndpoint->AioMgr.cReqsProcessed++;
                     cRequests++;
                 }
@@ -1345,5 +1342,13 @@
     PPDMACTASKFILE pTasksWaiting;
 
+    LogFlowFunc(("pAioMgr=%#p hReq=%#p\n", pAioMgr, hReq));
+
     pEndpoint = pTask->pEndpoint;
+
+    pTask->hReq = NIL_RTFILEAIOREQ;
+
+    pAioMgr->cRequestsActive--;
+    pEndpoint->AioMgr.cRequestsActive--;
+    pEndpoint->AioMgr.cReqsProcessed++;
 
     /*
@@ -1358,8 +1363,4 @@
         pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
 
-        pAioMgr->cRequestsActive--;
-        pEndpoint->AioMgr.cRequestsActive--;
-        pEndpoint->AioMgr.cReqsProcessed++;
-
         if (pTask->enmTransferType == PDMACTASKFILETRANSFER_FLUSH)
         {
@@ -1435,8 +1436,4 @@
             pEndpoint->pFlushReq = NULL;
             pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
-
-            pAioMgr->cRequestsActive--;
-            pEndpoint->AioMgr.cRequestsActive--;
-            pEndpoint->AioMgr.cReqsProcessed++;
 
             /* Call completion callback */
@@ -1494,9 +1491,10 @@
 
                 AssertRC(rc);
-                rc = RTFileAioCtxSubmit(pAioMgr->hAioCtx, &hReq, 1);
-                AssertRC(rc);
-        }
-        else if (pTask->fPrefetch)
-        {
+                rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, &hReq, 1);
+                AssertMsg(RT_SUCCESS(rc) || (rc == VERR_FILE_AIO_INSUFFICIENT_RESSOURCES),
+                          ("Unexpected return code rc=%Rrc\n", rc));
+            }
+            else if (pTask->fPrefetch)
+            {
                 Assert(pTask->enmTransferType == PDMACTASKFILETRANSFER_WRITE);
                 Assert(pTask->cbBounceBuffer);
@@ -1521,6 +1519,7 @@
                                               offStart, pTask->pvBounceBuffer, cbToTransfer, pTask);
                 AssertRC(rc);
-                rc = RTFileAioCtxSubmit(pAioMgr->hAioCtx, &hReq, 1);
-                AssertRC(rc);
+                rc = pdmacFileAioMgrNormalReqsEnqueue(pAioMgr, pEndpoint, &hReq, 1);
+                AssertMsg(RT_SUCCESS(rc) || (rc == VERR_FILE_AIO_INSUFFICIENT_RESSOURCES),
+                          ("Unexpected return code rc=%Rrc\n", rc));
             }
             else
@@ -1537,8 +1536,4 @@
 
                 pdmacFileAioMgrNormalRequestFree(pAioMgr, hReq);
-
-                pAioMgr->cRequestsActive--;
-                pEndpoint->AioMgr.cRequestsActive--;
-                pEndpoint->AioMgr.cReqsProcessed++;
 
                 /* Free the lock and process pending tasks if neccessary */
