VirtualBox

Changeset 56577 in vbox for trunk/src/VBox/Main/src-server


Ignore:
Timestamp:
Jun 22, 2015 3:08:04 PM (9 years ago)
Author:
vboxsync
Message:

Main/MachineImplCloneVM.cpp: fix cloning of VMs with floppy (handled regularly, like writethrough disks) and DVD attachments, which previously could lead to hangs (especially when the image was located in the VM directory), and some tweaking of the error handling code path to make it more robust.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r56563 r56577  
    4646{
    4747    RTCList<MEDIUMTASK>     chain;
     48    DeviceType_T            devType;
    4849    bool                    fCreateDiffs;
    4950    bool                    fAttachLinked;
     
    270271            if (FAILED(rc)) return rc;
    271272
    272             /* Only harddisk's are of interest. */
    273             if (type != DeviceType_HardDisk)
     273            /* Only harddisks and floppies are of interest. */
     274            if (   type != DeviceType_HardDisk
     275                && type != DeviceType_Floppy)
    274276                continue;
    275277
     
    278280            rc = pAtt->COMGETTER(Medium)(pSrcMedium.asOutParam());
    279281            if (FAILED(rc)) return rc;
     282
    280283            if (pSrcMedium.isNull())
    281284                continue;
     
    284287             * contain one image only. */
    285288            MEDIUMTASKCHAIN mtc;
     289            mtc.devType       = type;
    286290            mtc.fCreateDiffs  = fCreateDiffs;
    287291            mtc.fAttachLinked = fAttachLinked;
     
    377381            if (FAILED(rc)) return rc;
    378382
    379             /* Only harddisk's are of interest. */
    380             if (type != DeviceType_HardDisk)
     383            /* Only harddisks and floppies are of interest. */
     384            if (   type != DeviceType_HardDisk
     385                && type != DeviceType_Floppy)
    381386                continue;
    382387
     
    390395
    391396            MEDIUMTASKCHAIN mtc;
     397            mtc.devType       = type;
    392398            mtc.fCreateDiffs  = fCreateDiffs;
    393399            mtc.fAttachLinked = fAttachLinked;
     
    520526            if (FAILED(rc)) return rc;
    521527
    522             /* Only harddisk's are of interest. */
    523             if (type != DeviceType_HardDisk)
     528            /* Only harddisks and floppies are of interest. */
     529            if (   type != DeviceType_HardDisk
     530                && type != DeviceType_Floppy)
    524531                continue;
    525532
     
    528535            rc = pAtt->COMGETTER(Medium)(pSrcMedium.asOutParam());
    529536            if (FAILED(rc)) return rc;
     537
    530538            if (pSrcMedium.isNull())
    531539                continue;
     
    535543             * will not create a full copy of the base/child relationship.) */
    536544            MEDIUMTASKCHAIN mtc;
     545            mtc.devType       = type;
    537546            mtc.fCreateDiffs  = fCreateDiffs;
    538547            mtc.fAttachLinked = fAttachLinked;
     
    646655             ++it4)
    647656        {
    648             if (   it4->deviceType == DeviceType_HardDisk
     657            if (   (   it4->deviceType == DeviceType_HardDisk
     658                    || it4->deviceType == DeviceType_Floppy)
    649659                && it4->uuid == bstrOldId)
    650660            {
     
    9961006        /* Reset media registry. */
    9971007        trgMCF.mediaRegistry.llHardDisks.clear();
     1008        trgMCF.mediaRegistry.llDvdImages.clear();
     1009        trgMCF.mediaRegistry.llFloppyImages.clear();
    9981010        /* If we got a valid snapshot id, replace the hardware/storage section
    9991011         * with the stuff from the snapshot. */
     
    11471159                        /* Default format? */
    11481160                        Utf8Str strDefaultFormat;
    1149                         p->mParent->i_getDefaultHardDiskFormat(strDefaultFormat);
     1161                        if (mtc.devType == DeviceType_HardDisk)
     1162                            p->mParent->i_getDefaultHardDiskFormat(strDefaultFormat);
     1163                        else
     1164                            strDefaultFormat = "RAW";
     1165
    11501166                        Bstr bstrSrcFormat(strDefaultFormat);
    11511167
     
    12251241                                           strFile,
    12261242                                           Guid::Empty /* empty media registry */,
    1227                                            DeviceType_HardDisk);
     1243                                           mtc.devType);
    12281244                        if (FAILED(rc)) throw rc;
    12291245
     
    12311247                        pTarget->i_updateId(newId);
    12321248
    1233                         srcLock.release();
    12341249                        /* Do the disk cloning. */
    12351250                        ComPtr<IProgress> progress2;
    12361251
    12371252                        ComObjPtr<Medium> pLMedium = static_cast<Medium*>((IMedium*)pMedium);
     1253                        srcLock.release();
    12381254                        rc = pLMedium->i_cloneToEx(pTarget,
    12391255                                                   srcVar,
     
    12421258                                                   uSrcParentIdx,
    12431259                                                   uTrgParentIdx);
     1260                        srcLock.acquire();
    12441261                        if (FAILED(rc)) throw rc;
    12451262
    12461263                        /* Wait until the async process has finished. */
     1264                        srcLock.release();
    12471265                        rc = d->pProgress->WaitForAsyncProgressCompletion(progress2);
    12481266                        srcLock.acquire();
     
    12641282                        rc = pMedium->COMGETTER(Type)(&type);
    12651283                        if (FAILED(rc)) throw rc;
     1284                        trgLock.release();
     1285                        srcLock.release();
    12661286                        rc = pTarget->COMSETTER(Type)(type);
     1287                        srcLock.acquire();
     1288                        trgLock.acquire();
    12671289                        if (FAILED(rc)) throw rc;
    12681290                        map.insert(TStrMediumPair(Utf8Str(bstrSrcId), pTarget));
    1269                         /* register the new harddisk */
     1291                        /* register the new medium */
    12701292                        {
    12711293                            AutoWriteLock tlock(p->mParent->i_getMediaTreeLockHandle() COMMA_LOCKVAL_SRC_POS);
    12721294                            rc = p->mParent->i_registerMedium(pTarget, &pTarget,
    1273                                                             tlock);
     1295                                                              tlock);
    12741296                            if (FAILED(rc)) throw rc;
    12751297                        }
     
    14631485    catch (HRESULT rc2)
    14641486    {
     1487        /* Error handling code only works correctly without locks held. */
     1488        trgLock.release();
     1489        srcLock.release();
    14651490        rc = rc2;
    14661491    }
     
    14881513            const ComObjPtr<Medium> &pMedium = newMedia.at(i - 1);
    14891514            mrc = pMedium->i_deleteStorage(NULL /* aProgress */,
    1490                                          true /* aWait */);
     1515                                           true /* aWait */);
    14911516            pMedium->Close();
    14921517        }
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