VirtualBox

Changeset 14931 in vbox for trunk/src


Ignore:
Timestamp:
Dec 3, 2008 12:33:47 AM (16 years ago)
Author:
vboxsync
Message:

Main: HardDisk2: Obey VD_CAP_UUID.

Location:
trunk/src/VBox/Main
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/HardDisk2Impl.cpp

    r14929 r14931  
    18741874           HardDiskFormatCapabilities_CreateFixed)))
    18751875        return setError (VBOX_E_NOT_SUPPORTED,
    1876             tr ("Hard disk format '%ls' does not support storage deletion "),
     1876            tr ("Hard disk format '%ls' does not support storage deletion"),
    18771877            mm.format.raw());
    18781878
     
    24102410                  E_FAIL);
    24112411
    2412     /* are we dealing with a hard disk just opened from the existing path? */
    2413     bool isNew = mm.format.isNull();
    2414 
    2415     if (isNew ||
     2412    /* are we dealing with a new hard disk constructed using the existing
     2413     * location? */
     2414    bool isImport = mm.format.isNull();
     2415
     2416    if (isImport ||
    24162417        (mm.formatObj->capabilities() & HardDiskFormatCapabilities_File))
    24172418    {
     
    24662467                location.raw(), vrc);
    24672468
    2468         /* detect the backend from the storage unit if new */
    2469         if (isNew)
     2469        /* detect the backend from the storage unit if importing */
     2470        if (isImport)
    24702471        {
    24712472            char *backendName = NULL;
     
    25102511            m.locationFull = locationFull;
    25112512
    2512             /* assign a new UUID if we generated it */
    2513             if (!id.isEmpty())
     2513            if (m.state == MediaState_NotCreated)
     2514            {
     2515                /* assign a new UUID (this UUID will be used when calling
     2516                 * VDCreateBase/VDCreateDiff as a wanted UUID). Note that we
     2517                 * also do that if we didn't generate it to make sure it is
     2518                 * either generated by us or reset to null */
    25142519                unconst (m.id) = id;
     2520            }
    25152521        }
    25162522        else
     
    26572663        Utf8Str location (m.locationFull);
    26582664
    2659         /* are we dealing with a hard disk opened from the existing path? */
    2660         bool isNew = m.id.isEmpty();
     2665        /* are we dealing with a new hard disk constructed using the existing
     2666         * location? */
     2667        bool isImport = m.id.isEmpty();
    26612668
    26622669        PVBOXHDD hdd;
     
    26732680             * time in VirtualBox (such as VMDK for which VDOpen() needs to
    26742681             * generate an UUID if it is missing) */
    2675             if (!isNew)
     2682            if (!isImport)
    26762683                flags |= VD_OPEN_FLAGS_READONLY;
    26772684
     
    26862693            }
    26872694
    2688             /* check the UUID */
    2689             RTUUID uuid;
    2690             vrc = VDGetUuid (hdd, 0, &uuid);
    2691             ComAssertRCThrow (vrc, E_FAIL);
    2692 
    2693             if (isNew)
     2695            if (mm.formatObj->capabilities() & HardDiskFormatCapabilities_Uuid)
    26942696            {
    2695                 unconst (m.id) = uuid;
     2697                /* check the UUID */
     2698                RTUUID uuid;
     2699                vrc = VDGetUuid (hdd, 0, &uuid);
     2700                ComAssertRCThrow (vrc, E_FAIL);
     2701
     2702                if (isImport)
     2703                {
     2704                    unconst (m.id) = uuid;
     2705                }
     2706                else
     2707                {
     2708                    Assert (!m.id.isEmpty());
     2709
     2710                    if (m.id != uuid)
     2711                    {
     2712                        lastAccessError = Utf8StrFmt (
     2713                            tr ("UUID {%RTuuid} of the hard disk '%ls' does "
     2714                                "not match the value {%RTuuid} stored in the "
     2715                                "media registry ('%ls')"),
     2716                            &uuid, m.locationFull.raw(), m.id.raw(),
     2717                            mVirtualBox->settingsFileName().raw());
     2718                        throw S_OK;
     2719                    }
     2720                }
    26962721            }
    26972722            else
    26982723            {
    2699                 if (m.id != uuid)
    2700                 {
    2701                     lastAccessError = Utf8StrFmt (
    2702                         tr ("UUID {%RTuuid} of the hard disk '%ls' "
    2703                             "does not match the value {%RTuuid} stored in the "
    2704                             "media registry ('%ls')"),
    2705                         &uuid, m.locationFull.raw(), m.id.raw(),
    2706                         mVirtualBox->settingsFileName().raw());
    2707                     throw S_OK;
    2708                 }
     2724                /* the backend does not support storing UUIDs within the
     2725                 * underlying storage so use what we store in XML */
     2726
     2727                /* generate an UUID for an imported UUID-less hard disk */
     2728                if (isImport)
     2729                    unconst (m.id).create();
    27092730            }
    27102731
     
    27162737            if (type == VD_IMAGE_TYPE_DIFF)
    27172738            {
    2718                 vrc = VDGetParentUuid (hdd, 0, &uuid);
     2739                RTUUID parentId;
     2740                vrc = VDGetParentUuid (hdd, 0, &parentId);
    27192741                ComAssertRCThrow (vrc, E_FAIL);
    27202742
    2721                 if (isNew)
     2743                if (isImport)
    27222744                {
    27232745                    /* the parent must be known to us. Note that we freely
     
    27282750                     * fail if this method reporst MediaState_Inaccessible) */
    27292751
    2730                     Guid id = uuid;
     2752                    Guid id = parentId;
    27312753                    ComObjPtr <HardDisk2> parent;
    27322754                    rc = mVirtualBox->findHardDisk2 (&id, NULL,
     
    27392761                                "hard disk '%ls' is not found in the media "
    27402762                                "registry ('%ls')"),
    2741                             &uuid, m.locationFull.raw(),
     2763                            &parentId, m.locationFull.raw(),
    27422764                            mVirtualBox->settingsFileName().raw());
    27432765                        throw S_OK;
     
    27772799                    AutoReadLock parentLock (mParent);
    27782800                    if (mParent->state() != MediaState_Inaccessible &&
    2779                         mParent->id() != uuid)
     2801                        mParent->id() != parentId)
    27802802                    {
    27812803                        lastAccessError = Utf8StrFmt (
     
    27832805                                "does not match UUID {%RTuuid} of its parent "
    27842806                                "hard disk stored in the media registry ('%ls')"),
    2785                             &uuid, m.locationFull.raw(),
     2807                            &parentId, m.locationFull.raw(),
    27862808                            mParent->id().raw(),
    27872809                            mVirtualBox->settingsFileName().raw());
     
    31183140
    31193141            /* these parameters we need after creation */
    3120             RTUUID uuid;
    31213142            uint64_t size = 0, logicalSize = 0;
     3143
     3144            /* the object may request a specific UUID (through a special
     3145             * form of the setLocation() argumet) */
     3146            Guid id = that->m.id;
    31223147
    31233148            try
     
    31293154                Utf8Str format (that->mm.format);
    31303155                Utf8Str location (that->m.locationFull);
     3156                ULONG capabilities = that->mm.formatObj->capabilities();
    31313157
    31323158                /* unlock before the potentially lengthy operation */
     
    31513177                                        task->d.size * _1M,
    31523178                                        VD_IMAGE_FLAGS_NONE,
    3153                                         NULL, &geo, &geo, NULL,
     3179                                        NULL, &geo, &geo,
     3180                                        id.isEmpty() ? NULL : id.raw(),
    31543181                                        VD_OPEN_FLAGS_NORMAL,
    31553182                                        NULL, that->mm.vdDiskIfaces);
     
    31633190                    }
    31643191
    3165                     vrc = VDGetUuid (hdd, 0, &uuid);
    3166                     ComAssertRCThrow (vrc, E_FAIL);
     3192                    if (capabilities & HardDiskFormatCapabilities_Uuid)
     3193                    {
     3194                        RTUUID uuid;
     3195                        vrc = VDGetUuid (hdd, 0, &uuid);
     3196                        ComAssertRCThrow (vrc, E_FAIL);
     3197
     3198                        if (!id.isEmpty())
     3199                            Assert (id == uuid);
     3200                        else
     3201                            id = uuid;
     3202                    }
     3203                    else
     3204                    {
     3205                        /* we have to generate an UUID ourselves */
     3206                        id.create();
     3207                    }
    31673208
    31683209                    size = VDGetFileSize (hdd, 0);
     
    31813222                thatLock.enter();
    31823223
    3183                 unconst (that->m.id) = uuid;
     3224                unconst (that->m.id) = id;
    31843225
    31853226                that->m.size = size;
     
    37073748            that->m.state = MediaState_NotCreated;
    37083749
     3750            /* Reset UUID to prevent Create* from reusing it again */
     3751            unconst (that->m.id).clear();
     3752
    37093753            break;
    37103754        }
  • trunk/src/VBox/Main/MediumImpl.cpp

    r14772 r14931  
    5959    CheckComRCReturnRC (autoCaller.rc());
    6060
    61     /* m.id is constant during life time, no need to lock */
     61    AutoReadLock alock (this);
     62
    6263    m.id.cloneTo (aId);
    6364
  • trunk/src/VBox/Main/VirtualBoxImpl.cpp

    r14922 r14931  
    490490# error "Port me!"
    491491#endif
    492     /* Unload plugin backends. */
     492
     493    /* Unload hard disk plugin backends. */
    493494    VDShutdown();
    494495
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r14874 r14931  
    66476647        UUID of the medium. For a newly created medium, this value is a randomly
    66486648        generated UUID.
     6649
     6650        <note>
     6651          For media in one of MediaState::NotCreated, MediaState::Creating or
     6652          MediaState::Deleting states, the value of this property is undefined
     6653          and will most likely be an empty UUID.
     6654        </note>
    66496655      </desc>
    66506656    </attribute>
     
    76017607          <link to="IHardDiskFormat::capabilities"/>.
    76027608        </result>
     7609
     7610        <note>
     7611          If the deletion operation fails, it is not guaranteed that the storage
     7612          unit still exists. You may check the <link to="IMedium::state"/> value
     7613          to answer this question.
     7614        </note>
    76037615      </desc>
    76047616      <param name="progress" type="IProgress" dir="return">
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