Index: /trunk/src/VBox/Devices/Storage/DrvDiskIntegrity.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvDiskIntegrity.cpp	(revision 29411)
+++ /trunk/src/VBox/Devices/Storage/DrvDiskIntegrity.cpp	(revision 29412)
@@ -41,10 +41,23 @@
 
 /**
+ * Transfer direction.
+ */
+typedef enum DRVDISKAIOTXDIR
+{
+    /** Read */
+    DRVDISKAIOTXDIR_READ = 0,
+    /** Write */
+    DRVDISKAIOTXDIR_WRITE,
+    /** Flush */
+    DRVDISKAIOTXDIR_FLUSH
+} DRVDISKAIOTXDIR;
+
+/**
  * async I/O request.
  */
 typedef struct DRVDISKAIOREQ
 {
-    /** Flag whether this is a read or write request. */
-    bool      fRead;
+    /** Transfer direction. */
+    DRVDISKAIOTXDIR enmTxDir;
     /** Start offset. */
     uint64_t  off;
@@ -156,5 +169,5 @@
  *
  * @returns New I/O request.
- * @param   fRead         Flag whether this is a read or a write.
+ * @param   enmTxDir      Transfer direction.
  * @param   off           Start offset.
  * @param   paSeg         Segment array.
@@ -163,5 +176,5 @@
  * @param   pvUser        User argument.
  */
-static PDRVDISKAIOREQ drvdiskintIoReqAlloc(bool fRead, uint64_t off, PCRTSGSEG paSeg,
+static PDRVDISKAIOREQ drvdiskintIoReqAlloc(DRVDISKAIOTXDIR enmTxDir, uint64_t off, PCRTSGSEG paSeg,
                                            unsigned cSeg, size_t cbTransfer, void *pvUser)
 {
@@ -170,5 +183,5 @@
     if (RT_LIKELY(pIoReq))
     {
-        pIoReq->fRead      = fRead;
+        pIoReq->enmTxDir   = enmTxDir;
         pIoReq->off        = off;
         pIoReq->cbTransfer = cbTransfer;
@@ -529,5 +542,5 @@
              uOffset, paSeg, cSeg, cbRead, pvUser));
     PDRVDISKINTEGRITY pThis = PDMIMEDIAASYNC_2_DRVDISKINTEGRITY(pInterface);
-    PDRVDISKAIOREQ pIoReq = drvdiskintIoReqAlloc(true, uOffset, paSeg, cSeg, cbRead, pvUser);
+    PDRVDISKAIOREQ pIoReq = drvdiskintIoReqAlloc(DRVDISKAIOTXDIR_READ, uOffset, paSeg, cSeg, cbRead, pvUser);
     AssertPtr(pIoReq);
 
@@ -564,5 +577,5 @@
              uOffset, paSeg, cSeg, cbWrite, pvUser));
     PDRVDISKINTEGRITY pThis = PDMIMEDIAASYNC_2_DRVDISKINTEGRITY(pInterface);
-    PDRVDISKAIOREQ pIoReq = drvdiskintIoReqAlloc(false, uOffset, paSeg, cSeg, cbWrite, pvUser);
+    PDRVDISKAIOREQ pIoReq = drvdiskintIoReqAlloc(DRVDISKAIOTXDIR_WRITE, uOffset, paSeg, cSeg, cbWrite, pvUser);
     AssertPtr(pIoReq);
 
@@ -593,4 +606,14 @@
 }
 
+/** @copydoc PDMIMEDIAASYNC::pfnStartFlush */
+static DECLCALLBACK(int) drvdiskintStartFlush(PPDMIMEDIAASYNC pInterface, void *pvUser)
+{
+    PDRVDISKINTEGRITY pThis = PDMIMEDIAASYNC_2_DRVDISKINTEGRITY(pInterface);
+    PDRVDISKAIOREQ pIoReq = drvdiskintIoReqAlloc(DRVDISKAIOTXDIR_FLUSH, 0, NULL, 0, 0, pvUser);
+    AssertPtr(pIoReq);
+
+    return pThis->pDrvMediaAsync->pfnStartFlush(pThis->pDrvMediaAsync, pIoReq);
+}
+
 /** @copydoc PDMIMEDIA::pfnFlush */
 static DECLCALLBACK(int) drvdiskintFlush(PPDMIMEDIA pInterface)
@@ -672,8 +695,10 @@
     if (RT_SUCCESS(rcReq) && pThis->fCheckConsistency)
     {
-        if (pIoReq->fRead)
+        if (pIoReq->enmTxDir == DRVDISKAIOTXDIR_READ)
             rc = drvdiskintReadVerify(pThis, pIoReq->paSeg, pIoReq->cSeg, pIoReq->off, pIoReq->cbTransfer);
+        else if (pIoReq->enmTxDir == DRVDISKAIOTXDIR_WRITE)
+            rc = drvdiskintWriteRecord(pThis, pIoReq->paSeg, pIoReq->cSeg, pIoReq->off, pIoReq->cbTransfer);
         else
-            rc = drvdiskintWriteRecord(pThis, pIoReq->paSeg, pIoReq->cSeg, pIoReq->off, pIoReq->cbTransfer);
+            AssertMsg(pIoReq->enmTxDir == DRVDISKAIOTXDIR_FLUSH, ("Huh?\n"));
 
         AssertRC(rc);
@@ -789,4 +814,5 @@
     pThis->IMediaAsync.pfnStartRead      = drvdiskintStartRead;
     pThis->IMediaAsync.pfnStartWrite     = drvdiskintStartWrite;
+    pThis->IMediaAsync.pfnStartFlush     = drvdiskintStartFlush;
 
     /* IMediaAsyncPort. */
