VirtualBox

Changeset 37824 in vbox for trunk/src


Ignore:
Timestamp:
Jul 7, 2011 3:29:03 PM (13 years ago)
Author:
vboxsync
Message:

Main/Machine+MediumAttachment+Console: add method for marking a 'hard disk' as non-rotational, which optimizes performance in modern guest OSes
Frontends/VBoxManage+VirtualBox: support the new method
ChangeLog: add quite a few forgotten improvements and fixes

Location:
trunk/src/VBox
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r37817 r37824  
    467467                     "                            [--passthrough on|off]\n"
    468468                     "                            [--tempeject on|off]\n"
     469                     "                            [--nonrotational on|off]\n"
    469470                     "                            [--bandwidthgroup <name>]\n"
    470471                     "                            [--forceunmount]\n"
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp

    r37709 r37824  
    5353    { "--passthrough",      'h', RTGETOPT_REQ_STRING },
    5454    { "--tempeject",        'e', RTGETOPT_REQ_STRING },
     55    { "--nonrotational",    'n', RTGETOPT_REQ_STRING },
    5556    { "--bandwidthgroup",   'b', RTGETOPT_REQ_STRING },
    5657    { "--forceunmount",     'f', RTGETOPT_REQ_NOTHING },
     
    8687    const char *pszPassThrough = NULL;
    8788    const char *pszTempEject = NULL;
     89    const char *pszNonRotational = NULL;
    8890    const char *pszBandwidthGroup = NULL;
    8991    Bstr bstrNewUuid;
     
    178180            }
    179181
     182            case 'n':   // nonrotational <on|off>
     183            {
     184                if (ValueUnion.psz)
     185                    pszNonRotational = ValueUnion.psz;
     186                else
     187                    rc = E_FAIL;
     188                break;
     189            }
     190
    180191            case 'b':   // bandwidthgroup <name>
    181192            {
     
    410421                if (ctlType == StorageControllerType_I82078)        // floppy controller
    411422                    devTypeRequested = DeviceType_Floppy;
    412                 else if (pszMedium)
     423                else
    413424                {
    414425                    /*
     
    428439                        mediumAttachment->COMGETTER(Type)(&deviceType);
    429440
    430                         ComPtr<IMedium> pExistingMedium;
    431                         rc = findMedium(a, pszMedium, deviceType, true /* fSilent */,
    432                                         pExistingMedium);
    433                         if (SUCCEEDED(rc) && pExistingMedium)
     441                        if (pszMedium)
    434442                        {
    435                             if (    (deviceType == DeviceType_DVD)
    436                                  || (deviceType == DeviceType_HardDisk)
    437                                )
    438                                 devTypeRequested = deviceType;
     443                            ComPtr<IMedium> pExistingMedium;
     444                            rc = findMedium(a, pszMedium, deviceType, true /* fSilent */,
     445                                            pExistingMedium);
     446                            if (SUCCEEDED(rc) && pExistingMedium)
     447                            {
     448                                if (    (deviceType == DeviceType_DVD)
     449                                     || (deviceType == DeviceType_HardDisk)
     450                                   )
     451                                    devTypeRequested = deviceType;
     452                            }
    439453                        }
     454                        else
     455                            devTypeRequested = deviceType;
    440456                    }
    441457                }
    442                 /* for all other cases lets ask the user what type of drive it is */
    443458            }
    444459
     
    573588            else
    574589            {
    575                 Bstr bstrMedium(pszMedium);
    576                 if (bstrMedium.isEmpty())
    577                     throw Utf8Str("Missing --medium argument");
    578 
    579                 rc = findOrOpenMedium(a, pszMedium, devTypeRequested,
    580                                       pMedium2Mount, fSetNewUuid, NULL);
    581                 if (FAILED(rc) || !pMedium2Mount)
    582                     throw Utf8StrFmt("Invalid UUID or filename \"%s\"", pszMedium);
     590                if (!pszMedium)
     591                {
     592                    ComPtr<IMediumAttachment> mediumAttachment;
     593                    rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(), port,
     594                                                      device,
     595                                                      mediumAttachment.asOutParam());
     596                    if (FAILED(rc))
     597                        throw Utf8Str("Missing --medium argument");
     598                }
     599                else
     600                {
     601                    Bstr bstrMedium(pszMedium);
     602                    rc = findOrOpenMedium(a, pszMedium, devTypeRequested,
     603                                          pMedium2Mount, fSetNewUuid, NULL);
     604                    if (FAILED(rc) || !pMedium2Mount)
     605                        throw Utf8StrFmt("Invalid UUID or filename \"%s\"", pszMedium);
     606                }
    583607            }
    584608
    585609            // set medium/parent medium UUID, if so desired
    586             if (fSetNewUuid || fSetNewParentUuid)
     610            if (pMedium2Mount && (fSetNewUuid || fSetNewParentUuid))
    587611            {
    588612                CHECK_ERROR(pMedium2Mount, SetIDs(fSetNewUuid, bstrNewUuid.raw(),
     
    605629            }
    606630
    607             switch (devTypeRequested)
    608             {
    609                 case DeviceType_DVD:
    610                 case DeviceType_Floppy:
    611                 {
    612                     if (!fRunTime)
     631            if (pszMedium)
     632            {
     633                switch (devTypeRequested)
     634                {
     635                    case DeviceType_DVD:
     636                    case DeviceType_Floppy:
    613637                    {
    614                         ComPtr<IMediumAttachment> mediumAttachment;
    615                         // check if there is a dvd/floppy drive at the given location, if not attach one first
    616                         rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(),
    617                                                           port,
    618                                                           device,
    619                                                           mediumAttachment.asOutParam());
    620                         if (SUCCEEDED(rc))
     638                        if (!fRunTime)
    621639                        {
    622                             DeviceType_T deviceType;
    623                             mediumAttachment->COMGETTER(Type)(&deviceType);
    624                             if (deviceType != devTypeRequested)
     640                            ComPtr<IMediumAttachment> mediumAttachment;
     641                            // check if there is a dvd/floppy drive at the given location, if not attach one first
     642                            rc = machine->GetMediumAttachment(Bstr(pszCtl).raw(),
     643                                                              port,
     644                                                              device,
     645                                                              mediumAttachment.asOutParam());
     646                            if (SUCCEEDED(rc))
    625647                            {
    626                                 machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
     648                                DeviceType_T deviceType;
     649                                mediumAttachment->COMGETTER(Type)(&deviceType);
     650                                if (deviceType != devTypeRequested)
     651                                {
     652                                    machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
     653                                    rc = machine->AttachDevice(Bstr(pszCtl).raw(),
     654                                                               port,
     655                                                               device,
     656                                                               devTypeRequested,    // DeviceType_DVD or DeviceType_Floppy
     657                                                               NULL);
     658                                }
     659                            }
     660                            else
     661                            {
    627662                                rc = machine->AttachDevice(Bstr(pszCtl).raw(),
    628663                                                           port,
     
    632667                            }
    633668                        }
    634                         else
     669
     670                        if (pMedium2Mount)
    635671                        {
    636                             rc = machine->AttachDevice(Bstr(pszCtl).raw(),
    637                                                        port,
    638                                                        device,
    639                                                        devTypeRequested,    // DeviceType_DVD or DeviceType_Floppy
    640                                                        NULL);
     672                            CHECK_ERROR(machine, MountMedium(Bstr(pszCtl).raw(),
     673                                                             port,
     674                                                             device,
     675                                                             pMedium2Mount,
     676                                                             fForceUnmount));
    641677                        }
     678                    } // end DeviceType_DVD or DeviceType_Floppy:
     679                    break;
     680
     681                    case DeviceType_HardDisk:
     682                    {
     683                        // if there is anything attached at the given location, remove it
     684                        machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
     685                        CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl).raw(),
     686                                                          port,
     687                                                          device,
     688                                                          DeviceType_HardDisk,
     689                                                          pMedium2Mount));
    642690                    }
    643 
    644                     if (pMedium2Mount)
    645                     {
    646                         CHECK_ERROR(machine, MountMedium(Bstr(pszCtl).raw(),
    647                                                          port,
    648                                                          device,
    649                                                          pMedium2Mount,
    650                                                          fForceUnmount));
    651                     }
    652                 } // end DeviceType_DVD or DeviceType_Floppy:
    653                 break;
    654 
    655                 case DeviceType_HardDisk:
    656                 {
    657                     // if there is anything attached at the given location, remove it
    658                     machine->DetachDevice(Bstr(pszCtl).raw(), port, device);
    659                     CHECK_ERROR(machine, AttachDevice(Bstr(pszCtl).raw(),
    660                                                       port,
    661                                                       device,
    662                                                       DeviceType_HardDisk,
    663                                                       pMedium2Mount));
    664                 }
    665                 break;
     691                    break;
     692                }
    666693            }
    667694        }
     
    714741                else
    715742                    throw Utf8StrFmt("Invalid --tempeject argument '%s'", pszTempEject);
     743            }
     744            else
     745                throw Utf8StrFmt("Couldn't find the controller attachment for the controller '%s'\n", pszCtl);
     746        }
     747
     748        if (   pszNonRotational
     749            && (SUCCEEDED(rc)))
     750        {
     751            ComPtr<IMediumAttachment> mattach;
     752            CHECK_ERROR(machine, GetMediumAttachment(Bstr(pszCtl).raw(), port,
     753                                                     device, mattach.asOutParam()));
     754
     755            if (SUCCEEDED(rc))
     756            {
     757                if (!RTStrICmp(pszNonRotational, "on"))
     758                {
     759                    CHECK_ERROR(machine, NonRotationalDevice(Bstr(pszCtl).raw(),
     760                                                             port, device, TRUE));
     761                }
     762                else if (!RTStrICmp(pszNonRotational, "off"))
     763                {
     764                    CHECK_ERROR(machine, NonRotationalDevice(Bstr(pszCtl).raw(),
     765                                                             port, device, FALSE));
     766                }
     767                else
     768                    throw Utf8StrFmt("Invalid --nonrotational argument '%s'", pszNonRotational);
    716769            }
    717770            else
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp

    r37710 r37824  
    552552    , mAttIsPassthrough (false)
    553553    , mAttIsTempEject (false)
     554    , mAttIsNonRotational (false)
    554555{
    555556    /* Check for proper parent type */
     
    610611}
    611612
     613bool AttachmentItem::attIsNonRotational() const
     614{
     615    return mAttIsNonRotational;
     616}
     617
    612618void AttachmentItem::setAttSlot (const StorageSlot &aAttSlot)
    613619{
     
    635641{
    636642    mAttIsTempEject = aIsAttTempEject;
     643}
     644
     645void AttachmentItem::setAttIsNonRotational (bool aIsAttNonRotational)
     646{
     647    mAttIsNonRotational = aIsAttNonRotational;
    637648}
    638649
     
    10961107            return false;
    10971108        }
     1109        case R_AttIsNonRotational:
     1110        {
     1111            if (AbstractItem *item = static_cast <AbstractItem*> (aIndex.internalPointer()))
     1112                if (item->rtti() == AbstractItem::Type_AttachmentItem)
     1113                    return static_cast <AttachmentItem*> (item)->attIsNonRotational();
     1114            return false;
     1115        }
    10981116        case R_AttSize:
    10991117        {
     
    13111329                {
    13121330                    static_cast <AttachmentItem*> (item)->setAttIsTempEject (aValue.toBool());
     1331                    emit dataChanged (aIndex, aIndex);
     1332                    return true;
     1333                }
     1334            return false;
     1335        }
     1336        case R_AttIsNonRotational:
     1337        {
     1338            if (AbstractItem *item = static_cast <AbstractItem*> (aIndex.internalPointer()))
     1339                if (item->rtti() == AbstractItem::Type_AttachmentItem)
     1340                {
     1341                    static_cast <AttachmentItem*> (item)->setAttIsNonRotational (aValue.toBool());
    13131342                    emit dataChanged (aIndex, aIndex);
    13141343                    return true;
     
    18011830    connect (mCbPassthrough, SIGNAL (stateChanged (int)), this, SLOT (setInformation()));
    18021831    connect (mCbTempEject, SIGNAL (stateChanged (int)), this, SLOT (setInformation()));
     1832    connect (mCbNonRotational, SIGNAL (stateChanged (int)), this, SLOT (setInformation()));
    18031833
    18041834    /* Applying language settings */
     
    18651895                    storageAttachmentData.m_fAttachmentPassthrough = attachment.GetPassthrough();
    18661896                    storageAttachmentData.m_fAttachmentTempEject = attachment.GetTemporaryEject();
     1897                    storageAttachmentData.m_fAttachmentNonRotational = attachment.GetNonRotational();
    18671898                    CMedium comMedium(attachment.GetMedium());
    18681899                    VBoxMedium vboxMedium;
     
    19251956            mStorageModel->setData(attachmentIndex, attachmentData.m_fAttachmentPassthrough, StorageModel::R_AttIsPassthrough);
    19261957            mStorageModel->setData(attachmentIndex, attachmentData.m_fAttachmentTempEject, StorageModel::R_AttIsTempEject);
     1958            mStorageModel->setData(attachmentIndex, attachmentData.m_fAttachmentNonRotational, StorageModel::R_AttIsNonRotational);
    19271959        }
    19281960    }
     
    19772009            attachmentData.m_fAttachmentPassthrough = mStorageModel->data(attachmentIndex, StorageModel::R_AttIsPassthrough).toBool();
    19782010            attachmentData.m_fAttachmentTempEject = mStorageModel->data(attachmentIndex, StorageModel::R_AttIsTempEject).toBool();
     2011            attachmentData.m_fAttachmentNonRotational = mStorageModel->data(attachmentIndex, StorageModel::R_AttIsNonRotational).toBool();
    19792012            attachmentData.m_strAttachmentMediumId = mStorageModel->data(attachmentIndex, StorageModel::R_AttMediumId).toString();
    19802013
     
    24172450                mCbTempEject->setChecked (!isHostDrive && mStorageModel->data (index, StorageModel::R_AttIsTempEject).toBool());
    24182451
     2452                /* Getting NonRotational state */
     2453                mCbNonRotational->setVisible (device == KDeviceType_HardDisk);
     2454                mCbNonRotational->setChecked (mStorageModel->data (index, StorageModel::R_AttIsNonRotational).toBool());
     2455
    24192456                /* Update optional widgets visibility */
    24202457                updateAdditionalObjects (device);
     
    24892526                if (!mStorageModel->data (index, StorageModel::R_AttIsHostDrive).toBool())
    24902527                    mStorageModel->setData (index, mCbTempEject->isChecked(), StorageModel::R_AttIsTempEject);
     2528            }
     2529            else if (sdr == mCbNonRotational)
     2530            {
     2531                mStorageModel->setData (index, mCbNonRotational->isChecked(), StorageModel::R_AttIsNonRotational);
    24912532            }
    24922533            break;
     
    33973438        bool fAttachmentPassthrough = attachmentData.m_fAttachmentPassthrough;
    33983439        bool fAttachmentTempEject = attachmentData.m_fAttachmentTempEject;
     3440        bool fAttachmentNonRotational = attachmentData.m_fAttachmentNonRotational;
    33993441        /* Get GUI medium object: */
    34003442        VBoxMedium vboxMedium = vboxGlobal().findMedium(strAttachmentMediumId);
     
    34263468                    }
    34273469                }
     3470                else if (attachmentDeviceType == KDeviceType_HardDisk)
     3471                {
     3472                    m_machine.NonRotationalDevice(strControllerName, iAttachmentPort, iAttachmentDevice, fAttachmentNonRotational);
     3473                    /* Check that machine is OK: */
     3474                    fSuccess = m_machine.isOk();
     3475                }
    34283476            }
    34293477            else
     
    34613509        bool fAttachmentPassthrough = attachmentData.m_fAttachmentPassthrough;
    34623510        bool fAttachmentTempEject = attachmentData.m_fAttachmentTempEject;
     3511        bool fAttachmentNonRotational = attachmentData.m_fAttachmentNonRotational;
    34633512        KDeviceType attachmentDeviceType = attachmentData.m_attachmentType;
    34643513
     
    34973546                    }
    34983547                }
     3548                if (fSuccess)
     3549                {
     3550                    if (attachmentDeviceType == KDeviceType_DVD)
     3551                    {
     3552                        m_machine.NonRotationalDevice(strControllerName, iAttachmentPort, iAttachmentDevice, fAttachmentNonRotational);
     3553                        /* Check that machine is OK: */
     3554                        fSuccess = m_machine.isOk();
     3555                    }
     3556                }
    34993557            }
    35003558            else
     
    35713629    mCbPassthrough->setEnabled(isMachineOffline());
    35723630    mCbTempEject->setEnabled(isMachineInValidMode());
     3631    mCbNonRotational->setEnabled(isMachineOffline());
    35733632    mLsInformation->setEnabled(isMachineInValidMode());
    35743633    mLbHDFormat->setEnabled(isMachineInValidMode());
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h

    r37710 r37824  
    357357    bool attIsPassthrough() const;
    358358    bool attIsTempEject() const;
     359    bool attIsNonRotational() const;
    359360
    360361    void setAttSlot (const StorageSlot &aAttSlot);
     
    363364    void setAttIsPassthrough (bool aPassthrough);
    364365    void setAttIsTempEject (bool aTempEject);
     366    void setAttIsNonRotational (bool aNonRotational);
    365367
    366368    QString attSize() const;
     
    394396    bool mAttIsPassthrough;
    395397    bool mAttIsTempEject;
     398    bool mAttIsNonRotational;
    396399
    397400    QString mAttName;
     
    448451        R_AttIsPassthrough,
    449452        R_AttIsTempEject,
     453        R_AttIsNonRotational,
    450454        R_AttSize,
    451455        R_AttLogicalSize,
     
    562566        , m_strAttachmentMediumId(QString())
    563567        , m_fAttachmentPassthrough(false)
    564         , m_fAttachmentTempEject(false) {}
     568        , m_fAttachmentTempEject(false)
     569        , m_fAttachmentNonRotational(false) {}
    565570    /* Functions: */
    566571    bool equal(const UIDataSettingsMachineStorageAttachment &other) const
     
    571576               (m_strAttachmentMediumId == other.m_strAttachmentMediumId) &&
    572577               (m_fAttachmentPassthrough == other.m_fAttachmentPassthrough) &&
    573                (m_fAttachmentTempEject == other.m_fAttachmentTempEject);
     578               (m_fAttachmentTempEject == other.m_fAttachmentTempEject) &&
     579               (m_fAttachmentNonRotational == other.m_fAttachmentNonRotational);
    574580    }
    575581    /* Operators: */
     
    583589    bool m_fAttachmentPassthrough;
    584590    bool m_fAttachmentTempEject;
     591    bool m_fAttachmentNonRotational;
    585592};
    586593typedef UISettingsCache<UIDataSettingsMachineStorageAttachment> UICacheSettingsMachineStorageAttachment;
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui

    r37710 r37824  
    339339         </widget>
    340340        </item>
     341        <item row="2" column="2" >
     342         <widget class="QCheckBox" name="mCbNonRotational" >
     343          <property name="sizePolicy" >
     344           <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
     345            <horstretch>0</horstretch>
     346            <verstretch>0</verstretch>
     347           </sizepolicy>
     348          </property>
     349          <property name="whatsThis" >
     350           <string>When checked, this marks the medium as non-rotational storage (SSD).</string>
     351          </property>
     352          <property name="text" >
     353           <string>&amp;Solid-state drive</string>
     354          </property>
     355         </widget>
     356        </item>
    341357        <item row="3" column="0" colspan="3" >
    342358         <widget class="QILabelSeparator" native="1" name="mLsInformation" >
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r37779 r37824  
    46914691    </method>
    46924692
     4693    <method name="nonRotationalDevice">
     4694      <desc>
     4695        Sets a flag in the device information which indicates that the medium
     4696        is not based on rotational technology, i.e. that the access times are
     4697        more or less independent of the position on the medium. This may or may
     4698        not be supported by a particular drive, and is silently ignored in the
     4699        latter case. At the moment only hard disks (which is a misnomer in this
     4700        context) accept this setting. Changing the setting while the VM is
     4701        running is forbidden. The device must already exist; see
     4702        <link to="IMachine::attachDevice"/> for how to attach a new device.
     4703
     4704        The @a controllerPort and @a device parameters specify the device slot and
     4705        have have the same meaning as with <link to="IMachine::attachDevice" />.
     4706
     4707        <result name="E_INVALIDARG">
     4708          SATA device, SATA port, IDE port or IDE slot out of range.
     4709        </result>
     4710        <result name="VBOX_E_INVALID_OBJECT_STATE">
     4711          Attempt to modify an unregistered virtual machine.
     4712        </result>
     4713        <result name="VBOX_E_INVALID_VM_STATE">
     4714          Invalid machine state.
     4715        </result>
     4716
     4717      </desc>
     4718      <param name="name" type="wstring" dir="in">
     4719        <desc>Name of the storage controller.</desc>
     4720      </param>
     4721      <param name="controllerPort" type="long" dir="in">
     4722        <desc>Storage controller port.</desc>
     4723      </param>
     4724      <param name="device" type="long" dir="in">
     4725        <desc>Device slot in the given port.</desc>
     4726      </param>
     4727      <param name="nonRotational" type="boolean" dir="in">
     4728        <desc>New value for the non-rotational device flag.</desc>
     4729      </param>
     4730    </method>
     4731
    46934732    <method name="setBandwidthGroupForDevice">
    46944733      <desc>
     
    98409879      <desc>Signals that the removable medium has been ejected. This is not
    98419880        necessarily equivalent to having a @c null medium association.</desc>
     9881    </attribute>
     9882
     9883    <attribute name="nonRotational" type="boolean" readonly="yes">
     9884      <desc>Whether the associated medium is non-rotational.</desc>
    98429885    </attribute>
    98439886
  • trunk/src/VBox/Main/include/MachineImpl.h

    r37779 r37824  
    478478    STDMETHOD(PassthroughDevice)(IN_BSTR aControllerName, LONG aControllerPort, LONG aDevice, BOOL aPassthrough);
    479479    STDMETHOD(TemporaryEjectDevice)(IN_BSTR aControllerName, LONG aControllerPort, LONG aDevice, BOOL aTempEject);
     480    STDMETHOD(NonRotationalDevice)(IN_BSTR aControllerName, LONG aControllerPort, LONG aDevice, BOOL aNonRotational);
    480481    STDMETHOD(SetBandwidthGroupForDevice)(IN_BSTR aControllerName, LONG aControllerPort,
    481482                                          LONG aDevice, IBandwidthGroup *aBandwidthGroup);
  • trunk/src/VBox/Main/include/MediumAttachmentImpl.h

    r37709 r37824  
    5050                 bool fPassthrough,
    5151                 bool fTempEject,
     52                 bool fNonRotational,
    5253                 const Utf8Str &strBandwidthGroup);
    5354    void uninit();
     
    6566    STDMETHOD(COMGETTER(TemporaryEject))(BOOL *aTemporaryEject);
    6667    STDMETHOD(COMGETTER(IsEjected))(BOOL *aIsEjected);
     68    STDMETHOD(COMGETTER(NonRotational))(BOOL *aNonRotational);
    6769    STDMETHOD(COMGETTER(BandwidthGroup))(IBandwidthGroup **aBwGroup);
    6870
     
    8385    bool getPassthrough() const;
    8486    bool getTempEject() const;
     87    bool getNonRotational() const;
    8588    const Utf8Str& getBandwidthGroup() const;
    8689
     
    9598    /** Must be called from under this object's write lock. */
    9699    void updateTempEject(bool aTempEject);
     100
     101    /** Must be called from under this object's write lock. */
     102    void updateNonRotational(bool aNonRotational);
    97103
    98104    /** Must be called from under this object's write lock. */
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r37813 r37824  
    316316#endif
    317317
     318static const char *const g_apszIDEDrives[4] =
     319    { "PrimaryMaster", "PrimarySlave", "SecondaryMaster", "SecondarySlave" };
    318320
    319321class ConfigError : public RTCError
     
    15711573                        for (uint32_t j = 0; j < 4; ++j)
    15721574                        {
    1573                             static const char * const s_apszConfig[4] =
    1574                             { "PrimaryMaster", "PrimarySlave", "SecondaryMaster", "SecondarySlave" };
    15751575                            static const char * const s_apszBiosConfig[4] =
    15761576                            { "SataPrimaryMasterLUN", "SataPrimarySlaveLUN", "SataSecondaryMasterLUN", "SataSecondarySlaveLUN" };
     
    15781578                            LONG lPortNumber = -1;
    15791579                            hrc = ctrls[i]->GetIDEEmulationPort(j, &lPortNumber);           H();
    1580                             InsertConfigInteger(pCfg, s_apszConfig[j], lPortNumber);
     1580                            InsertConfigInteger(pCfg, g_apszIDEDrives[j], lPortNumber);
    15811581                            if (pBiosCfg)
    15821582                                InsertConfigInteger(pBiosCfg, s_apszBiosConfig[j], lPortNumber);
     
    28612861        DeviceType_T lType;
    28622862        hrc = pMediumAtt->COMGETTER(Type)(&lType);                                          H();
     2863        BOOL fNonRotational;
     2864        hrc = pMediumAtt->COMGETTER(NonRotational)(&fNonRotational);                        H();
    28632865
    28642866        unsigned uLUN;
    28652867        PCFGMNODE pLunL0 = NULL;
    2866         PCFGMNODE pCfg = NULL;
    28672868        hrc = Console::convertBusPortDeviceToLun(enmBus, lPort, lDev, uLUN);                H();
    28682869
     
    29122913        InsertConfigNode(pCtlInst, Utf8StrFmt("LUN#%u", uLUN).c_str(), &pLunL0);
    29132914
     2915        PCFGMNODE pCfg = CFGMR3GetChild(pCtlInst, "Config");
     2916        if (pCfg)
     2917        {
     2918            if (!strcmp(pcszDevice, "piix3ide"))
     2919            {
     2920                PCFGMNODE pDrive = CFGMR3GetChild(pCfg, g_apszIDEDrives[uLUN]);
     2921                if (!pDrive)
     2922                    InsertConfigNode(pCfg, g_apszIDEDrives[uLUN], &pDrive);
     2923                PCFGMNODE pNonRot = CFGMR3GetChild(pCtlInst, "NonRotationalMedium");
     2924                if (pNonRot)
     2925                    CFGMR3RemoveNode(pNonRot);
     2926                InsertConfigInteger(pDrive, "NonRotationalMedium", !!fNonRotational);
     2927            }
     2928            else if (!strcmp(pcszDevice, "ahci"))
     2929            {
     2930                Utf8Str strPort = Utf8StrFmt("Port%u", uLUN);
     2931                PCFGMNODE pDrive = CFGMR3GetChild(pCfg, strPort.c_str());
     2932                if (!pDrive)
     2933                    InsertConfigNode(pCfg, strPort.c_str(), &pDrive);
     2934                PCFGMNODE pNonRot = CFGMR3GetChild(pCtlInst, "NonRotationalMedium");
     2935                if (pNonRot)
     2936                    CFGMR3RemoveNode(pNonRot);
     2937                InsertConfigInteger(pDrive, "NonRotationalMedium", !!fNonRotational);
     2938            }
     2939        }
     2940        /** @todo add SCSI/SAS support once the SSD support is there */
     2941
    29142942        Utf8Str devicePath = Utf8StrFmt("%s/%u/LUN#%u", pcszDevice, uInstance, uLUN);
    29152943        mapMediumAttachments[devicePath] = pMediumAtt;
     
    29192947        {
    29202948            InsertConfigString(pLunL0, "Driver", "SCSI");
    2921             InsertConfigNode(pLunL0, "Config", &pCfg);
     2949            PCFGMNODE pL1Cfg = NULL;
     2950            InsertConfigNode(pLunL0, "Config", &pL1Cfg);
    29222951
    29232952            InsertConfigNode(pLunL0, "AttachedDriver", &pLunL0);
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r37777 r37824  
    38043804                          false /* fPassthrough */,
    38053805                          false /* fTempEject */,
     3806                          false /* fNonRotational */,
    38063807                          Utf8Str::Empty);
    38073808    if (FAILED(rc)) return rc;
     
    39943995    if (pAttach->getType() != DeviceType_DVD)
    39953996        return setError(E_INVALIDARG,
    3996                         tr("Setting passthrough rejected as the device attached to device slot %d on port %d of controller '%ls' is not a DVD"),
     3997                        tr("Setting temporary eject flag rejected as the device attached to device slot %d on port %d of controller '%ls' is not a DVD"),
    39973998                        aDevice, aControllerPort, aControllerName);
    39983999    pAttach->updateTempEject(!!aTemporaryEject);
     4000
     4001    return S_OK;
     4002}
     4003
     4004STDMETHODIMP Machine::NonRotationalDevice(IN_BSTR aControllerName, LONG aControllerPort,
     4005                                          LONG aDevice, BOOL aNonRotational)
     4006{
     4007    CheckComArgStrNotEmptyOrNull(aControllerName);
     4008
     4009    LogFlowThisFunc(("aControllerName=\"%ls\" aControllerPort=%ld aDevice=%ld aNonRotational=%d\n",
     4010                     aControllerName, aControllerPort, aDevice, aNonRotational));
     4011
     4012    AutoCaller autoCaller(this);
     4013    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     4014
     4015    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     4016
     4017    HRESULT rc = checkStateDependency(MutableStateDep);
     4018    if (FAILED(rc)) return rc;
     4019
     4020    AssertReturn(mData->mMachineState != MachineState_Saved, E_FAIL);
     4021
     4022    if (Global::IsOnlineOrTransient(mData->mMachineState))
     4023        return setError(VBOX_E_INVALID_VM_STATE,
     4024                        tr("Invalid machine state: %s"),
     4025                        Global::stringifyMachineState(mData->mMachineState));
     4026
     4027    MediumAttachment *pAttach = findAttachment(mMediaData->mAttachments,
     4028                                               aControllerName,
     4029                                               aControllerPort,
     4030                                               aDevice);
     4031    if (!pAttach)
     4032        return setError(VBOX_E_OBJECT_NOT_FOUND,
     4033                        tr("No storage device attached to device slot %d on port %d of controller '%ls'"),
     4034                        aDevice, aControllerPort, aControllerName);
     4035
     4036
     4037    setModified(IsModified_Storage);
     4038    mMediaData.backup();
     4039
     4040    AutoWriteLock attLock(pAttach COMMA_LOCKVAL_SRC_POS);
     4041
     4042    if (pAttach->getType() != DeviceType_HardDisk)
     4043        return setError(E_INVALIDARG,
     4044                        tr("Setting the non-rotational medium flag rejected as the device attached to device slot %d on port %d of controller '%ls' is not a hard disk"),
     4045                        aDevice, aControllerPort, aControllerName);
     4046    pAttach->updateNonRotational(!!aNonRotational);
    39994047
    40004048    return S_OK;
     
    80988146                               dev.fPassThrough,
    80998147                               dev.fTempEject,
     8148                               dev.fNonRotational,
    81008149                               pBwGroup.isNull() ? Utf8Str::Empty : pBwGroup->getName());
    81018150        if (FAILED(rc)) break;
     
    90459094            dev.fPassThrough = pAttach->getPassthrough();
    90469095            dev.fTempEject = pAttach->getTempEject();
     9096            dev.fNonRotational = pAttach->getNonRotational();
    90479097        }
    90489098
     
    93689418                                  false /* aPassthrough */,
    93699419                                  false /* aTempEject */,
     9420                                  false /* aNonRotational */,
    93709421                                  pAtt->getBandwidthGroup());
    93719422            if (FAILED(rc)) throw rc;
  • trunk/src/VBox/Main/src-server/MediumAttachmentImpl.cpp

    r37709 r37824  
    4141          fPassthrough(false),
    4242          fTempEject(false),
     43          fNonRotational(false),
    4344          fImplicit(false)
    4445    { }
     
    5859    bool                fPassthrough;
    5960    bool                fTempEject;
     61    bool                fNonRotational;
    6062    bool                fImplicit;
    6163};
     
    117119                               bool aPassthrough,
    118120                               bool aTempEject,
     121                               bool aNonRotational,
    119122                               const Utf8Str &strBandwidthGroup)
    120123{
    121124    LogFlowThisFuncEnter();
    122     LogFlowThisFunc(("aParent=%p aMedium=%p aControllerName=%ls aPort=%d aDevice=%d aType=%d aImplicit=%d aPassthrough=%d aTempEject=%d\n", aParent, aMedium, aControllerName.raw(), aPort, aDevice, aType, aImplicit, aPassthrough, aTempEject));
     125    LogFlowThisFunc(("aParent=%p aMedium=%p aControllerName=%ls aPort=%d aDevice=%d aType=%d aImplicit=%d aPassthrough=%d aTempEject=%d aNonRotational=%d strBandwithGroup=%s\n", aParent, aMedium, aControllerName.raw(), aPort, aDevice, aType, aImplicit, aPassthrough, aTempEject, aNonRotational, strBandwidthGroup.c_str()));
    123126
    124127    if (aType == DeviceType_HardDisk)
     
    143146    m->bd->fPassthrough = aPassthrough;
    144147    m->bd->fTempEject = aTempEject;
     148    m->bd->fNonRotational = aNonRotational;
    145149    m->bd->fImplicit = aImplicit;
    146150
     
    319323}
    320324
     325STDMETHODIMP MediumAttachment::COMGETTER(NonRotational)(BOOL *aNonRotational)
     326{
     327    LogFlowThisFuncEnter();
     328
     329    CheckComArgOutPointerValid(aNonRotational);
     330
     331    AutoCaller autoCaller(this);
     332    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     333
     334    AutoReadLock lock(this COMMA_LOCKVAL_SRC_POS);
     335
     336    *aNonRotational = m->bd->fNonRotational;
     337
     338    LogFlowThisFuncLeave();
     339    return S_OK;
     340}
     341
    321342STDMETHODIMP MediumAttachment::COMGETTER(BandwidthGroup) (IBandwidthGroup **aBwGroup)
    322343{
     
    429450}
    430451
     452bool MediumAttachment::getNonRotational() const
     453{
     454    AutoReadLock lock(this COMMA_LOCKVAL_SRC_POS);
     455    return m->bd->fNonRotational;
     456}
     457
    431458const Utf8Str& MediumAttachment::getBandwidthGroup() const
    432459{
     
    481508}
    482509
     510/** Must be called from under this object's write lock. */
     511void MediumAttachment::updateNonRotational(bool aNonRotational)
     512{
     513    Assert(isWriteLockOnCurrentThread());
     514
     515    m->bd.backup();
     516    m->bd->fNonRotational = aNonRotational;
     517}
     518
    483519void MediumAttachment::updateBandwidthGroup(const Utf8Str &aBandwidthGroup)
    484520{
  • trunk/src/VBox/Main/xml/Settings.cpp

    r37709 r37824  
    16921692                  && (fPassThrough              == a.fPassThrough)
    16931693                  && (fTempEject                == a.fTempEject)
     1694                  && (fNonRotational            == a.fNonRotational)
    16941695                  && (lPort                     == a.lPort)
    16951696                  && (lDevice                   == a.lDevice)
     
    29842985
    29852986            if (strTemp == "HardDisk")
     2987            {
    29862988                att.deviceType = DeviceType_HardDisk;
     2989                pelmAttached->getAttributeValue("nonrotational", att.fNonRotational);
     2990            }
    29872991            else if (m->sv >= SettingsVersion_v1_9)
    29882992            {
     
    42294233                case DeviceType_HardDisk:
    42304234                    pcszType = "HardDisk";
     4235                    if (att.fNonRotational)
     4236                        pelmDevice->setAttribute("nonrotational", att.fNonRotational);
    42314237                break;
    42324238
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