VirtualBox

忽略:
時間撮記:
2010-4-20 下午02:05:45 (15 年 以前)
作者:
vboxsync
訊息:

Main/MediumImpl: fix regression when creating diff images

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Main/MediumImpl.cpp

    r28401 r28526  
    21522152    /* Apply the normal locking logic to the entire chain. */
    21532153    MediumLockList *pMediumLockList(new MediumLockList());
    2154     HRESULT rc = createMediumLockList(true, this, *pMediumLockList);
     2154    HRESULT rc = diff->createMediumLockList(true, this, *pMediumLockList);
    21552155    if (FAILED(rc))
    21562156    {
     
    31013101        pMedium = pMedium->getParent();
    31023102        if (pMedium.isNull() && pToBeParent)
     3103        {
    31033104            pMedium = pToBeParent;
     3105            pToBeParent = NULL;
     3106        }
    31043107    }
    31053108
     
    41624165        else
    41634166            rc = createMediumLockList(false, NULL, *aMediumLockList);
    4164         if (FAILED(rc))
    4165         {
    4166             delete aMediumLockList;
    4167             aMediumLockList = NULL;
    4168             throw rc;
    4169         }
    4170 
    4171         /* sanity checking */
     4167        if (FAILED(rc)) throw rc;
     4168
     4169        /* sanity checking, must be after lock list creation as it depends on
     4170         * valid medium states. The medium objects must be accessible. */
    41724171        {
    41734172            AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     
    42474246
    42484247        /* Update medium states appropriately */
    4249         switch (m->state)
    4250         {
    4251             case MediumState_Created:
    4252                 m->state = MediumState_Deleting;
    4253                 break;
    4254             default:
    4255                 throw setStateError();
    4256         }
     4248        if (m->state == MediumState_Created)
     4249        {
     4250            rc = markForDeletion();
     4251            if (FAILED(rc)) throw rc;
     4252        }
     4253        else
     4254            throw setStateError();
     4255
    42574256        if (fMergeForward)
    42584257        {
     
    42794278        {
    42804279            AutoWriteLock alock(pLast COMMA_LOCKVAL_SRC_POS);
    4281             switch (pLast->m->state)
     4280            if (pLast->m->state == MediumState_Created)
    42824281            {
    4283                 case MediumState_Created:
    4284                     pLast->m->state = MediumState_Deleting;
    4285                     break;
    4286                 default:
    4287                     throw pLast->setStateError();
     4282                rc = pLast->markForDeletion();
     4283                if (FAILED(rc)) throw rc;
    42884284            }
     4285            else
     4286                throw pLast->setStateError();
    42894287        }
    42904288
     
    45074505
    45084506    AssertReturnVoid(aMediumLockList != NULL);
     4507
     4508    /* Revert media marked for deletion to previous state. */
     4509    HRESULT rc;
     4510    MediumLockList::Base::const_iterator mediumListBegin =
     4511        aMediumLockList->GetBegin();
     4512    MediumLockList::Base::const_iterator mediumListEnd =
     4513        aMediumLockList->GetEnd();
     4514    for (MediumLockList::Base::const_iterator it = mediumListBegin;
     4515         it != mediumListEnd;
     4516         ++it)
     4517    {
     4518        const MediumLock &mediumLock = *it;
     4519        const ComObjPtr<Medium> &pMedium = mediumLock.GetMedium();
     4520        AutoWriteLock alock(pMedium COMMA_LOCKVAL_SRC_POS);
     4521
     4522        if (pMedium->m->state == MediumState_Deleting)
     4523        {
     4524            rc = pMedium->unmarkForDeletion();
     4525            AssertComRC(rc);
     4526        }
     4527    }
    45094528
    45104529    /* the destructor will do the work */
     
    50255044            MediumLockList::Base::const_iterator targetListEnd =
    50265045                task.mpMediumLockList->GetEnd();
    5027             targetListEnd--;
    50285046            for (MediumLockList::Base::const_iterator it = targetListBegin;
    50295047                 it != targetListEnd;
     
    50345052
    50355053                AutoReadLock alock(pMedium COMMA_LOCKVAL_SRC_POS);
     5054
     5055                /* Skip over the target diff image */
     5056                if (pMedium->m->state == MediumState_Creating)
     5057                    continue;
    50365058
    50375059                /* sanity check */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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