Index: /trunk/src/VBox/Devices/Storage/DrvVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 74837)
+++ /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 74838)
@@ -2915,5 +2915,8 @@
     bool fXchg = ASMAtomicCmpXchgU32((volatile uint32_t *)&pIoReq->enmState, VDIOREQSTATE_COMPLETING, VDIOREQSTATE_ACTIVE);
     if (fXchg)
-        ASMAtomicDecU32(&pThis->cIoReqsActive);
+    {
+        uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
+        AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
+    }
     else
     {
@@ -3062,7 +3065,9 @@
             RTListAppend(&pThis->LstIoReqRedo, &pIoReq->NdLstWait);
             RTCritSectLeave(&pThis->CritSectIoReqRedo);
-            ASMAtomicDecU32(&pThis->cIoReqsActive);
+            uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
+            AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
             pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
                                                          PDMMEDIAEXIOREQSTATE_SUSPENDED);
+            LogFlowFunc(("Suspended I/O request %#p\n", pIoReq));
             rcReq = VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS;
         }
@@ -3157,4 +3162,5 @@
                 pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
                                                              PDMMEDIAEXIOREQSTATE_SUSPENDED);
+            LogFlowFunc(("Suspended I/O request %#p\n", pIoReq));
             RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
             rc = VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS;
@@ -3703,6 +3709,9 @@
     }
 
-    if (fXchg)
-        ASMAtomicDecU32(&pThis->cIoReqsActive);
+    if (fXchg && enmStateOld == VDIOREQSTATE_ACTIVE)
+    {
+        uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
+        AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
+    }
 
     return fXchg;
@@ -3746,4 +3755,5 @@
         pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReqCur, &pIoReqCur->abAlloc[0],
                                                      PDMMEDIAEXIOREQSTATE_SUSPENDED);
+        LogFlowFunc(("Suspended I/O request %#p\n", pIoReqCur));
     }
     RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
@@ -4753,4 +4763,5 @@
     drvvdSetWritable(pThis);
     pThis->fSuspending      = false;
+    pThis->fRedo            = false;
 
     if (pThis->pBlkCache)
@@ -4770,4 +4781,5 @@
                                                          PDMMEDIAEXIOREQSTATE_ACTIVE);
             ASMAtomicIncU32(&pThis->cIoReqsActive);
+            LogFlowFunc(("Resumed I/O request %#p\n", pIoReq));
         }
         RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
@@ -4783,8 +4795,10 @@
             ASMAtomicIncU32(&pThis->cIoReqsActive);
 
+            LogFlowFunc(("Resuming I/O request %#p fXchg=%RTbool\n", pIoReq, fXchg));
             if (fXchg)
             {
                 pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
                                                              PDMMEDIAEXIOREQSTATE_ACTIVE);
+                LogFlowFunc(("Resumed I/O request %#p\n", pIoReq));
                 if (   pIoReq->enmType == PDMMEDIAEXIOREQTYPE_READ
                     || pIoReq->enmType == PDMMEDIAEXIOREQTYPE_WRITE)
@@ -4987,4 +5001,5 @@
     pThis->pRegionList                  = NULL;
     pThis->fSuspending                  = false;
+    pThis->fRedo                        = false;
 
     for (unsigned i = 0; i < RT_ELEMENTS(pThis->aIoReqAllocBins); i++)
