Index: /trunk/src/VBox/Storage/VD.cpp
===================================================================
--- /trunk/src/VBox/Storage/VD.cpp	(revision 46711)
+++ /trunk/src/VBox/Storage/VD.cpp	(revision 46712)
@@ -430,11 +430,11 @@
 
 /** Default flags for an I/O context, i.e. unblocked and async. */
-#define VDIOCTX_FLAGS_DEFAULT                   (0)
+#define VDIOCTX_FLAGS_DEFAULT                         (0)
 /** Flag whether the context is blocked. */
-#define VDIOCTX_FLAGS_BLOCKED          RT_BIT_32(0)
+#define VDIOCTX_FLAGS_BLOCKED                RT_BIT_32(0)
 /** Flag whether the I/O context is using synchronous I/O. */
-#define VDIOCTX_FLAGS_SYNC             RT_BIT_32(1)
+#define VDIOCTX_FLAGS_SYNC                   RT_BIT_32(1)
 /** Flag whether the read should update the cache. */
-#define VDIOCTX_FLAGS_READ_UDATE_CACHE RT_BIT_32(2)
+#define VDIOCTX_FLAGS_READ_UPDATE_CACHE      RT_BIT_32(2)
 /** Flag whether free blocks should be zeroed.
  * If false and no image has data for sepcified
@@ -444,8 +444,10 @@
  * of the range.
  */
-#define VDIOCTX_FLAGS_ZERO_FREE_BLOCKS RT_BIT_32(3)
+#define VDIOCTX_FLAGS_ZERO_FREE_BLOCKS       RT_BIT_32(3)
 /** Don't free the I/O context when complete because
  * it was alloacted elsewhere (stack, ...). */
-#define VDIOCTX_FLAGS_DONT_FREE        RT_BIT_32(4)
+#define VDIOCTX_FLAGS_DONT_FREE              RT_BIT_32(4)
+/* Don't set the modified flag for this I/O context when writing. */
+#define VDIOCTX_FLAGS_DONT_SET_MODIFIED_FLAG RT_BIT_32(5)
 
 /** NIL I/O context pointer value. */
@@ -1776,5 +1778,5 @@
                 /* If the read was successful, write the data back into the cache. */
                 if (   RT_SUCCESS(rc)
-                    && pIoCtx->fFlags & VDIOCTX_FLAGS_READ_UDATE_CACHE)
+                    && pIoCtx->fFlags & VDIOCTX_FLAGS_READ_UPDATE_CACHE)
                 {
                     rc = vdCacheWriteHelper(pDisk->pCache, uOffset, cbThisRead,
@@ -1950,5 +1952,5 @@
         fFlags |= VDIOCTX_FLAGS_ZERO_FREE_BLOCKS;
     if (fUpdateCache)
-        fFlags |= VDIOCTX_FLAGS_READ_UDATE_CACHE;
+        fFlags |= VDIOCTX_FLAGS_READ_UPDATE_CACHE;
 
     Segment.pvSeg = pvBuf;
@@ -2032,13 +2034,11 @@
                            PVDIMAGE pImageParentOverride, uint64_t uOffset,
                            const void *pvBuf, size_t cbWrite,
-                           bool fUpdateCache, unsigned cImagesRead)
-{
-    uint32_t fFlags = VDIOCTX_FLAGS_SYNC | VDIOCTX_FLAGS_DONT_FREE;
+                           uint32_t fFlags, unsigned cImagesRead)
+{
     RTSGSEG Segment;
     RTSGBUF SgBuf;
     VDIOCTX IoCtx;
 
-    if (fUpdateCache)
-        fFlags |= VDIOCTX_FLAGS_READ_UDATE_CACHE;
+    fFlags |= VDIOCTX_FLAGS_SYNC | VDIOCTX_FLAGS_DONT_FREE;
 
     Segment.pvSeg = (void *)pvBuf;
@@ -2062,8 +2062,8 @@
  */
 static int vdWriteHelper(PVBOXHDD pDisk, PVDIMAGE pImage, uint64_t uOffset,
-                         const void *pvBuf, size_t cbWrite, bool fUpdateCache)
+                         const void *pvBuf, size_t cbWrite, uint32_t fFlags)
 {
     return vdWriteHelperEx(pDisk, pImage, NULL, uOffset, pvBuf, cbWrite,
-                           fUpdateCache, 0);
+                           fFlags, 0);
 }
 
@@ -2163,5 +2163,5 @@
             /* Only do collapsed I/O if we are copying the data blockwise. */
             rc = vdWriteHelperEx(pDiskTo, pDiskTo->pLast, NULL, uOffset, pvBuf,
-                                 cbThisRead, false /* fUpdateCache */,
+                                 cbThisRead, VDIOCTX_FLAGS_DONT_SET_MODIFIED_FLAG /* fFlags */,
                                  fBlockwiseCopy ? cImagesToRead : 0);
             if (RT_FAILURE(rc))
@@ -2618,7 +2618,10 @@
     size_t cbPreRead, cbPostRead;
 
-    rc = vdSetModifiedFlagAsync(pDisk, pIoCtx);
-    if (RT_FAILURE(rc)) /* Includes I/O in progress. */
-        return rc;
+    if (!(pIoCtx->fFlags & VDIOCTX_FLAGS_DONT_SET_MODIFIED_FLAG))
+    {
+        rc = vdSetModifiedFlagAsync(pDisk, pIoCtx);
+        if (RT_FAILURE(rc)) /* Includes I/O in progress. */
+            return rc;
+    }
 
     rc = vdDiscardSetRangeAllocated(pDisk, uOffset, cbWrite);
@@ -6786,5 +6789,5 @@
                         rc = vdWriteHelperEx(pDisk, pImageTo, pImageFrom->pPrev,
                                              uOffset, pvBuf, cbThisRead,
-                                             true /* fUpdateCache */, 0);
+                                             VDIOCTX_FLAGS_READ_UPDATE_CACHE, 0);
                         if (RT_FAILURE(rc))
                             break;
@@ -6910,5 +6913,5 @@
                         break;
                     rc = vdWriteHelper(pDisk, pImageTo, uOffset, pvBuf,
-                                       cbThisRead, true /* fUpdateCache */);
+                                       cbThisRead, VDIOCTX_FLAGS_READ_UPDATE_CACHE);
                     if (RT_FAILURE(rc))
                         break;
@@ -8042,5 +8045,5 @@
         vdSetModifiedFlag(pDisk);
         rc = vdWriteHelper(pDisk, pImage, uOffset, pvBuf, cbWrite,
-                           true /* fUpdateCache */);
+                           VDIOCTX_FLAGS_READ_UPDATE_CACHE);
         if (RT_FAILURE(rc))
             break;
@@ -8056,5 +8059,5 @@
         if (RT_UNLIKELY(pDisk->pImageRelay))
             rc = vdWriteHelper(pDisk, pDisk->pImageRelay, uOffset,
-                               pvBuf, cbWrite, false /* fUpdateCache */);
+                               pvBuf, cbWrite, VDIOCTX_FLAGS_DEFAULT);
     } while (0);
 
