VirtualBox

Changeset 76904 in vbox


Ignore:
Timestamp:
Jan 20, 2019 7:48:25 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128272
Message:

Storage/VMDK: Don't try to flush the image when closing it after opening failed due to an invalid format caused by data corruption

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/VMDK.cpp

    r76553 r76904  
    539539static int vmdkFlushImage(PVMDKIMAGE pImage, PVDIOCTX pIoCtx);
    540540static int vmdkSetImageComment(PVMDKIMAGE pImage, const char *pszComment);
    541 static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete);
     541static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete, bool fFlush);
    542542
    543543static DECLCALLBACK(int) vmdkAllocGrainComplete(void *pBackendData, PVDIOCTX pIoCtx,
     
    33653365    }
    33663366    else
    3367         vmdkFreeImage(pImage, false);
     3367        vmdkFreeImage(pImage, false, false /*fFlush*/); /* Don't try to flush anything if opening failed. */
    33683368    return rc;
    33693369}
     
    40934093    }
    40944094    else
    4095         vmdkFreeImage(pImage, rc != VERR_ALREADY_EXISTS);
     4095        vmdkFreeImage(pImage, rc != VERR_ALREADY_EXISTS, false /*fFlush*/);
    40964096    return rc;
    40974097}
     
    42074207 * delete the image from disk.
    42084208 */
    4209 static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete)
     4209static int vmdkFreeImage(PVMDKIMAGE pImage, bool fDelete, bool fFlush)
    42104210{
    42114211    int rc = VINF_SUCCESS;
     
    43174317            }
    43184318        }
    4319         else if (!fDelete)
     4319        else if (!fDelete && fFlush)
    43204320            vmdkFlushImage(pImage, NULL);
    43214321
     
    52085208         * much as possible in vmdkOpenImage. */
    52095209        rc = vmdkOpenImage(pImage, VD_OPEN_FLAGS_INFO | VD_OPEN_FLAGS_READONLY);
    5210         vmdkFreeImage(pImage, false);
     5210        vmdkFreeImage(pImage, false, false /*fFlush*/);
    52115211        RTMemFree(pImage);
    52125212
     
    53325332                if (uOpenFlags & VD_OPEN_FLAGS_READONLY)
    53335333                {
    5334                     vmdkFreeImage(pImage, false);
     5334                    vmdkFreeImage(pImage, false, true /*fFlush*/);
    53355335                    rc = vmdkOpenImage(pImage, uOpenFlags);
    53365336                }
     
    54955495         * re-open the whole thing later.
    54965496         */
    5497         vmdkFreeImage(pImage, false);
     5497        vmdkFreeImage(pImage, false, true /*fFlush*/);
    54985498    }
    54995499
     
    56065606        {
    56075607            /* Release all old stuff. */
    5608             rc = vmdkFreeImage(pImage, false);
     5608            rc = vmdkFreeImage(pImage, false, true /*fFlush*/);
    56095609            if (RT_SUCCESS(rc))
    56105610            {
     
    56795679    PVMDKIMAGE pImage = (PVMDKIMAGE)pBackendData;
    56805680
    5681     int rc = vmdkFreeImage(pImage, fDelete);
     5681    int rc = vmdkFreeImage(pImage, fDelete, true /*fFlush*/);
    56825682    RTMemFree(pImage);
    56835683
     
    61506150        {
    61516151            /* Implement this operation via reopening the image. */
    6152             vmdkFreeImage(pImage, false);
     6152            vmdkFreeImage(pImage, false, true /*fFlush*/);
    61536153            rc = vmdkOpenImage(pImage, uOpenFlags);
    61546154        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette