Index: /trunk/src/VBox/Storage/VMDK.cpp
===================================================================
--- /trunk/src/VBox/Storage/VMDK.cpp	(revision 76903)
+++ /trunk/src/VBox/Storage/VMDK.cpp	(revision 76904)
@@ -539,5 +539,5 @@
 static int vmdkFlushImage(PVMDKIMAGE pImage, PVDIOCTX pIoCtx);
 static int vmdkSetImageComment(PVMDKIMAGE pImage, const char *pszComment);
-static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete);
+static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete, bool fFlush);
 
 static DECLCALLBACK(int) vmdkAllocGrainComplete(void *pBackendData, PVDIOCTX pIoCtx,
@@ -3365,5 +3365,5 @@
     }
     else
-        vmdkFreeImage(pImage, false);
+        vmdkFreeImage(pImage, false, false /*fFlush*/); /* Don't try to flush anything if opening failed. */
     return rc;
 }
@@ -4093,5 +4093,5 @@
     }
     else
-        vmdkFreeImage(pImage, rc != VERR_ALREADY_EXISTS);
+        vmdkFreeImage(pImage, rc != VERR_ALREADY_EXISTS, false /*fFlush*/);
     return rc;
 }
@@ -4207,5 +4207,5 @@
  * delete the image from disk.
  */
-static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete)
+static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete, bool fFlush)
 {
     int rc = VINF_SUCCESS;
@@ -4317,5 +4317,5 @@
             }
         }
-        else if (!fDelete)
+        else if (!fDelete && fFlush)
             vmdkFlushImage(pImage, NULL);
 
@@ -5208,5 +5208,5 @@
          * much as possible in vmdkOpenImage. */
         rc = vmdkOpenImage(pImage, VD_OPEN_FLAGS_INFO | VD_OPEN_FLAGS_READONLY);
-        vmdkFreeImage(pImage, false);
+        vmdkFreeImage(pImage, false, false /*fFlush*/);
         RTMemFree(pImage);
 
@@ -5332,5 +5332,5 @@
                 if (uOpenFlags & VD_OPEN_FLAGS_READONLY)
                 {
-                    vmdkFreeImage(pImage, false);
+                    vmdkFreeImage(pImage, false, true /*fFlush*/);
                     rc = vmdkOpenImage(pImage, uOpenFlags);
                 }
@@ -5495,5 +5495,5 @@
          * re-open the whole thing later.
          */
-        vmdkFreeImage(pImage, false);
+        vmdkFreeImage(pImage, false, true /*fFlush*/);
     }
 
@@ -5606,5 +5606,5 @@
         {
             /* Release all old stuff. */
-            rc = vmdkFreeImage(pImage, false);
+            rc = vmdkFreeImage(pImage, false, true /*fFlush*/);
             if (RT_SUCCESS(rc))
             {
@@ -5679,5 +5679,5 @@
     PVMDKIMAGE pImage = (PVMDKIMAGE)pBackendData;
 
-    int rc = vmdkFreeImage(pImage, fDelete);
+    int rc = vmdkFreeImage(pImage, fDelete, true /*fFlush*/);
     RTMemFree(pImage);
 
@@ -6150,5 +6150,5 @@
         {
             /* Implement this operation via reopening the image. */
-            vmdkFreeImage(pImage, false);
+            vmdkFreeImage(pImage, false, true /*fFlush*/);
             rc = vmdkOpenImage(pImage, uOpenFlags);
         }
