VirtualBox

Ignore:
Timestamp:
Feb 29, 2012 11:29:35 AM (13 years ago)
Author:
vboxsync
Message:

RTVfsMemFile bugfix: rtVfsMemFile_Write regression from previous fix.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/vfs/vfsmemory.cpp

    r40127 r40292  
    172172    if (!pExtent || pExtent->off < off)
    173173    {
    174         pExtent = RTListGetFirst(&pThis->ExtentHead, RTVFSMEMEXTENT, Entry);
     174        /* Consider the last entry first (for writes). */
     175        pExtent = RTListGetLast(&pThis->ExtentHead, RTVFSMEMEXTENT, Entry);
    175176        if (!pExtent)
    176177        {
     
    178179            return NULL;
    179180        }
     181        if (off - pExtent->off < pExtent->cb)
     182        {
     183            *pfHit = true;
     184            pThis->pCurExt = pExtent;
     185            return pExtent;
     186        }
     187
     188        /* Otherwise, start from the head. */
     189        pExtent = RTListGetFirst(&pThis->ExtentHead, RTVFSMEMEXTENT, Entry);
    180190    }
    181191
     
    188198        {
    189199            *pfHit = false;
    190             return pExtent;
     200            return pNext;
    191201        }
    192202
     
    201211
    202212/**
    203  * Locates the extent covering the specified offset, or then one before it.
     213 * Locates the extent covering the specified offset, or the one after it.
    204214 *
    205215 * @returns The closest extent.  NULL if off is 0 and there are no extent
     
    285295        for (;;)
    286296        {
    287             PRTVFSMEMEXTENT pNext;
    288             size_t          cbThisRead;
    289             Assert(!pExtent || pExtent->off <= offUnsigned);
     297            size_t      cbThisRead;
    290298
    291299            /*
    292              * Do we hit an extent covering the the current file surface?
     300             * Do we hit an extent covering the current file surface?
    293301             */
    294302            if (fHit)
    295303            {
     304                /* Yes, copy the data. */
     305                Assert(offUnsigned - pExtent->off < pExtent->cb);
    296306                size_t const offExtent = (size_t)(offUnsigned - pExtent->off);
    297307                cbThisRead = pExtent->cb - offExtent;
     
    307317                pbDst        += cbThisRead;
    308318
    309                 pNext = RTListGetNext(&pThis->ExtentHead, pExtent, RTVFSMEMEXTENT, Entry);
     319                /* Advance, looping immediately if not sparse. */
     320                PRTVFSMEMEXTENT pNext = RTListGetNext(&pThis->ExtentHead, pExtent, RTVFSMEMEXTENT, Entry);
    310321                if (   pNext
    311322                    && pNext->off == pExtent->off + pExtent->cb)
     
    314325                    continue;
    315326                }
     327
     328                Assert(!pNext || pNext->off > pExtent->off);
     329                pExtent = pNext;
    316330                fHit = false;
    317331            }
     332            else
     333                Assert(!pExtent || pExtent->off > offUnsigned);
    318334
    319335            /*
    320              * No extent of this portion (sparse file).
     336             * No extent of this portion (sparse file) - Read zeros.
    321337             */
    322             else if (pExtent)
    323                 pNext = RTListGetNext(&pThis->ExtentHead, pExtent, RTVFSMEMEXTENT, Entry);
    324             else
    325                 pNext = NULL;
    326             Assert(!pNext || pNext->off > pExtent->off);
    327 
    328             if (   !pNext
    329                 || offUnsigned + cbLeftToRead <= pNext->off)
     338            if (   !pExtent
     339                || offUnsigned + cbLeftToRead <= pExtent->off)
    330340                cbThisRead = cbLeftToRead;
    331341            else
    332                 cbThisRead = (size_t)(pNext->off - offUnsigned);
     342                cbThisRead = (size_t)(pExtent->off - offUnsigned);
    333343
    334344            RT_BZERO(pbDst, cbThisRead);
     
    341351
    342352            /* Go on and read content from the next extent. */
    343             fHit     = true;
    344             pExtent  = pNext;
     353            fHit = true;
    345354        }
    346355    }
     
    359368 * @param   cbToWrite           The number of bytes we're interested in writing
    360369 *                              starting at @a offUnsigned.
    361  * @param   pPrev               The extention before @a offUnsigned.  NULL if
    362  *                              none.
     370 * @param   pNext               The extention after @a offUnsigned.  NULL if
     371 *                              none, i.e. we're allocating space at the end of
     372 *                              the file.
    363373 */
    364374static PRTVFSMEMEXTENT rtVfsMemFile_AllocExtent(PRTVFSMEMFILE pThis, uint64_t offUnsigned, size_t cbToWrite,
    365                                                 PRTVFSMEMEXTENT pPrev)
     375                                                PRTVFSMEMEXTENT pNext)
    366376{
    367377    /*
     
    395405    uint32_t        cbExtent  = pThis->cbExtent;
    396406
     407    PRTVFSMEMEXTENT pPrev     = pNext
     408                              ? RTListGetPrev(&pThis->ExtentHead, pNext, RTVFSMEMEXTENT, Entry)
     409                              : RTListGetLast(&pThis->ExtentHead, RTVFSMEMEXTENT, Entry);
    397410    uint64_t const  offPrev   = pPrev ? pPrev->off + pPrev->cb : 0;
    398411    if (offExtent < offPrev)
    399412        offExtent = offPrev;
    400413
    401     PRTVFSMEMEXTENT pNext     = pPrev
    402                               ? RTListGetNext(&pThis->ExtentHead, pPrev, RTVFSMEMEXTENT, Entry)
    403                               : RTListGetFirst(&pThis->ExtentHead, RTVFSMEMEXTENT, Entry);
    404414    if (pNext)
    405415    {
     
    462472        if (!fHit)
    463473        {
    464             Assert(!pExtent || offUnsigned < pExtent->off);
     474            Assert(!pExtent || pExtent->off > offUnsigned);
    465475
    466476            /* Skip leading zeros if there is a whole bunch of them. */
     
    493503            }
    494504        }
     505        Assert(offUnsigned - pExtent->off < pExtent->cb);
    495506
    496507        /*
Note: See TracChangeset for help on using the changeset viewer.

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