Index: /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 64220)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 64221)
@@ -206,5 +206,5 @@
     void *pvIoReqAlloc;
     int rc = pThis->pDrvMediaEx->pfnIoReqAlloc(pThis->pDrvMediaEx, &hIoReq, &pvIoReqAlloc, u64Tag,
-                                               PDMIMEDIAEX_F_DEFAULT);
+                                               PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR);
     if (RT_SUCCESS(rc))
     {
@@ -454,5 +454,5 @@
 
     PDRVSCSI pThis = RT_FROM_MEMBER(pInterface, DRVSCSI, IPortEx);
-    VSCSIIOREQ hVScsiIoReq = (VSCSIIOREQ)((uint8_t *)pvIoReqAlloc + sizeof(PDMMEDIAEXIOREQ));
+    VSCSIIOREQ hVScsiIoReq = DRVSCSI_PDMMEDIAEXIOREQ_2_VSCSIIOREQ(pvIoReqAlloc);
     VSCSIIOREQTXDIR enmTxDir = VSCSIIoReqTxDirGet(hVScsiIoReq);
 
@@ -600,6 +600,26 @@
                                                    void *pvIoReqAlloc, PDMMEDIAEXIOREQSTATE enmState)
 {
-    RT_NOREF4(pInterface, hIoReq, pvIoReqAlloc, enmState);
-    AssertLogRelMsgFailed(("This should not be hit because I/O requests should not be suspended\n"));
+    RT_NOREF2(hIoReq, pvIoReqAlloc);
+    PDRVSCSI pThis = RT_FROM_MEMBER(pInterface, DRVSCSI, IPortEx);
+
+    switch (enmState)
+    {
+        case PDMMEDIAEXIOREQSTATE_SUSPENDED:
+        {
+            /* Make sure the request is not accounted for so the VM can suspend successfully. */
+            uint32_t cTasksActive = ASMAtomicDecU32(&pThis->StatIoDepth);
+            if (!cTasksActive && pThis->fDummySignal)
+                PDMDrvHlpAsyncNotificationCompleted(pThis->pDrvIns);
+            break;
+        }
+        case PDMMEDIAEXIOREQSTATE_ACTIVE:
+            /* Make sure the request is accounted for so the VM suspends only when the request is complete. */
+            ASMAtomicIncU32(&pThis->StatIoDepth);
+            break;
+        default:
+            AssertMsgFailed(("Invalid request state given %u\n", enmState));
+    }
+
+    pThis->pDevMediaExPort->pfnIoReqStateChanged(pThis->pDevMediaExPort, hIoReq, pvIoReqAlloc, enmState);
 }
 
@@ -852,7 +872,4 @@
     RT_NOREF1(pInterface);
     PDRVSCSIREQ pReq = (PDRVSCSIREQ)hIoReq;
-
-    if (pReq->pvBuf)
-        RTMemFree(pReq->pvBuf);
 
     RTMemFree(pReq);
@@ -1028,5 +1045,6 @@
 
     /* Sync buffers. */
-    if (   pReq->cbBuf
+    if (   RT_SUCCESS(rcReq)
+        && pReq->cbBuf
         && (   pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN
             || pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE))
@@ -1038,4 +1056,10 @@
         if (RT_FAILURE(rcCopy))
             rcReq = rcCopy;
+    }
+
+    if (pReq->pvBuf)
+    {
+        RTMemFree(pReq->pvBuf);
+        pReq->pvBuf = NULL;
     }
 
