Index: /trunk/src/VBox/VMM/PDMAsyncCompletionFile.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMAsyncCompletionFile.cpp	(revision 23958)
+++ /trunk/src/VBox/VMM/PDMAsyncCompletionFile.cpp	(revision 23959)
@@ -555,4 +555,5 @@
     PPDMASYNCCOMPLETIONENDPOINTFILE pEpFile = (PPDMASYNCCOMPLETIONENDPOINTFILE)pEndpoint;
     PPDMASYNCCOMPLETIONEPCLASSFILE pEpClassFile = (PPDMASYNCCOMPLETIONEPCLASSFILE)pEndpoint->pEpClass;
+    bool fUseFailsafeManager = pEpClassFile->fFailsafe;
 
     AssertMsgReturn((fFlags & ~(PDMACEP_FILE_FLAGS_READ_ONLY | PDMACEP_FILE_FLAGS_CACHING)) == 0,
@@ -610,9 +611,12 @@
          *
          * On Linux we have the same problem with cifs.
-         * Shouldn't be a big problem here either because
-         * it's a network filesystem and the data is on another
-         * computer.
+         * Have to disable async I/O here too because it requires O_DIRECT.
          */
         fFileFlags &= ~RTFILE_O_NO_CACHE;
+
+#ifdef RT_OS_LINUX
+        fFileFlags &= ~RTFILE_O_ASYNC_IO;
+        fUseFailsafeManager = true;
+#endif
 
         /* Open again. */
@@ -644,8 +648,8 @@
                 pEpFile->cTasksCached = 0;
 
-                if (pEpClassFile->fFailsafe)
+                if (fUseFailsafeManager)
                 {
                     /* Safe mode. Every file has its own async I/O manager. */
-                    rc = pdmacFileAioMgrCreate(pEpClassFile, &pAioMgr, false);
+                    rc = pdmacFileAioMgrCreate(pEpClassFile, &pAioMgr, true);
                     AssertRC(rc);
                 }
Index: /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp
===================================================================
--- /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp	(revision 23958)
+++ /trunk/src/VBox/VMM/PDMAsyncCompletionFileNormal.cpp	(revision 23959)
@@ -880,4 +880,7 @@
                             PPDMACEPFILEMGR pAioMgrFailsafe;
 
+                            LogRel(("%s: Request %#p failed with rc=%Rrc, migrating endpoint %s to failsafe manager.\n",
+                                    RTThreadGetName(pAioMgr->Thread), pTask, rcReq, pEndpoint->Core.pszUri)); 
+
                             pEndpoint->AioMgr.fMoving = true;
 
@@ -887,4 +890,7 @@
 
                             pEndpoint->AioMgr.pAioMgrDst = pAioMgrFailsafe;
+
+                            /* Update the flags to open the file with. Disable async I/O and enable the host cache. */
+                            pEndpoint->fFlags &= ~(RTFILE_O_ASYNC_IO | RTFILE_O_NO_CACHE);
                         }
 
@@ -974,5 +980,5 @@
                             else if (RT_UNLIKELY(!pEndpoint->AioMgr.cRequestsActive && pEndpoint->AioMgr.fMoving))
                             {
-                                /* If we the endpoint is about to be migrated do it now. */
+                                /* If the endpoint is about to be migrated do it now. */
                                 bool fReqsPending = pdmacFileAioMgrNormalRemoveEndpoint(pEndpoint);
                                 Assert(!fReqsPending);
