Index: /trunk/src/VBox/Devices/Storage/DevATA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 32942)
+++ /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 32943)
@@ -1436,5 +1436,5 @@
     int rc;
     LogRel(("PIIX3 ATA: Host disk full\n"));
-    rc = PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "DevATA_DISKFULL",
+    rc = PDMDevHlpVMSetRuntimeError(pDevIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DevATA_DISKFULL",
                                     N_("Host system reported disk full. VM execution is suspended. You can resume after freeing some space"));
     AssertRC(rc);
@@ -1445,5 +1445,5 @@
     int rc;
     LogRel(("PIIX3 ATA: File too big\n"));
-    rc = PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "DevATA_FILETOOBIG",
+    rc = PDMDevHlpVMSetRuntimeError(pDevIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DevATA_FILETOOBIG",
                                     N_("Host system reported that the file size limit of the host file system has been exceeded. VM execution is suspended. You need to move your virtual hard disk to a filesystem which allows bigger files"));
     AssertRC(rc);
@@ -1454,29 +1454,10 @@
     int rc;
     LogRel(("PIIX3 ATA: iSCSI target unavailable\n"));
-    rc = PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "DevATA_ISCSIDOWN",
+    rc = PDMDevHlpVMSetRuntimeError(pDevIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DevATA_ISCSIDOWN",
                                     N_("The iSCSI target has stopped responding. VM execution is suspended. You can resume when it is available again"));
     AssertRC(rc);
 }
 
-/**
- * Suspend I/O operations on a controller. Also suspends EMT, because it's
- * waiting for I/O to make progress. The next attempt to perform an I/O
- * operation will be made when EMT is resumed up again (as the resume
- * callback below restarts I/O).
- *
- * @param pCtl      Controller for which to suspend I/O.
- */
-static void ataSuspendRedo(PATACONTROLLER pCtl)
-{
-    PPDMDEVINS  pDevIns = CONTROLLER_2_DEVINS(pCtl);
-    int         rc;
-
-    pCtl->fRedoIdle = true;
-    rc = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
-                         (PFNRT)PDMDevHlpVMSuspend, 1, pDevIns);
-    AssertReleaseRC(rc);
-}
-
-bool ataIsRedoSetWarning(ATADevState *s, int rc)
+static bool ataIsRedoSetWarning(ATADevState *s, int rc)
 {
     PATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s);
@@ -1484,20 +1465,20 @@
     if (rc == VERR_DISK_FULL)
     {
+        pCtl->fRedoIdle = true;
         ataWarningDiskFull(ATADEVSTATE_2_DEVINS(s));
-        ataSuspendRedo(pCtl);
         return true;
     }
     if (rc == VERR_FILE_TOO_BIG)
     {
+        pCtl->fRedoIdle = true;
         ataWarningFileTooBig(ATADEVSTATE_2_DEVINS(s));
-        ataSuspendRedo(pCtl);
         return true;
     }
     if (rc == VERR_BROKEN_PIPE || rc == VERR_NET_CONNECTION_REFUSED)
     {
+        pCtl->fRedoIdle = true;
         /* iSCSI connection abort (first error) or failure to reestablish
          * connection (second error). Pause VM. On resume we'll retry. */
         ataWarningISCSI(ATADEVSTATE_2_DEVINS(s));
-        ataSuspendRedo(pCtl);
         return true;
     }
@@ -1506,5 +1487,6 @@
 
 
-static int ataReadSectors(ATADevState *s, uint64_t u64Sector, void *pvBuf, uint32_t cSectors, bool *fRedo)
+static int ataReadSectors(ATADevState *s, uint64_t u64Sector, void *pvBuf,
+                          uint32_t cSectors, bool *pfRedo)
 {
     PATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s);
@@ -1522,7 +1504,7 @@
 
     if (RT_SUCCESS(rc))
-        *fRedo = false;
+        *pfRedo = false;
     else
-        *fRedo = ataIsRedoSetWarning(s, rc);
+        *pfRedo = ataIsRedoSetWarning(s, rc);
 
     STAM_PROFILE_START(&pCtl->StatLockWait, a);
@@ -1533,5 +1515,6 @@
 
 
-static int ataWriteSectors(ATADevState *s, uint64_t u64Sector, const void *pvBuf, uint32_t cSectors, bool *fRedo)
+static int ataWriteSectors(ATADevState *s, uint64_t u64Sector,
+                           const void *pvBuf, uint32_t cSectors, bool *pfRedo)
 {
     PATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s);
@@ -1557,7 +1540,7 @@
 
     if (RT_SUCCESS(rc))
-        *fRedo = false;
+        *pfRedo = false;
     else
-        *fRedo = ataIsRedoSetWarning(s, rc);
+        *pfRedo = ataIsRedoSetWarning(s, rc);
 
     STAM_PROFILE_START(&pCtl->StatLockWait, a);
@@ -4923,5 +4906,4 @@
                         LogRel(("PIIX3 ATA: Ctl#%d: redo PIO operation\n", ATACONTROLLER_IDX(pCtl)));
                         ataAsyncIOPutRequest(pCtl, &g_ataPIORequest);
-                        ataSuspendRedo(pCtl);
                         break;
                     }
@@ -5681,4 +5663,6 @@
             ASMAtomicWriteU32(&pThis->aCts[i].fShutdown, true);
             rc = RTSemEventSignal(pThis->aCts[i].AsyncIOSem);
+            AssertRC(rc);
+            rc = RTSemEventSignal(pThis->aCts[i].SuspendIOSem);
             AssertRC(rc);
         }
