VirtualBox

Ignore:
Timestamp:
Mar 11, 2009 9:56:29 AM (16 years ago)
Author:
vboxsync
Message:

Main: Rework storage controller handling to allow an arbitrary number of different storage controllers and remove code duplication:

  • XML format changed
  • New StorageController class
  • Removed SATAController (obsolete)
  • Removed the IDE controller code from BIOSSettings, handled in StorageController now
File:
1 edited

Legend:

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

    r17651 r17669  
    33103310
    33113311/**
     3312 *  Called by IInternalSessionControl::OnStorageControllerChange().
     3313 *
     3314 *  @note Locks this object for writing.
     3315 */
     3316HRESULT Console::onStorageControllerChange ()
     3317{
     3318    LogFlowThisFunc (("\n"));
     3319
     3320    AutoCaller autoCaller (this);
     3321    AssertComRCReturnRC (autoCaller.rc());
     3322
     3323    AutoWriteLock alock (this);
     3324
     3325    /* Don't do anything if the VM isn't running */
     3326    if (!mpVM)
     3327        return S_OK;
     3328
     3329    HRESULT rc = S_OK;
     3330
     3331    /* protect mpVM */
     3332    AutoVMCaller autoVMCaller (this);
     3333    CheckComRCReturnRC (autoVMCaller.rc());
     3334
     3335    /* nothing to do so far */
     3336
     3337    /* notify console callbacks on success */
     3338    if (SUCCEEDED (rc))
     3339    {
     3340        CallbackList::iterator it = mCallbacks.begin();
     3341        while (it != mCallbacks.end())
     3342            (*it++)->OnStorageControllerChange ();
     3343    }
     3344
     3345    LogFlowThisFunc (("Leaving rc=%#x\n", rc));
     3346    return rc;
     3347}
     3348
     3349/**
    33123350 *  Called by IInternalSessionControl::OnVRDPServerChange().
    33133351 *
     
    65446582 *  Reconfigures a VDI.
    65456583 *
    6546  *  @param   pVM     The VM handle.
    6547  *  @param   hda     The harddisk attachment.
    6548  *  @param   phrc    Where to store com error - only valid if we return VERR_GENERAL_FAILURE.
     6584 *  @param   pVM           The VM handle.
     6585 *  @param   lInstance     The instance of the controller.
     6586 *  @param   enmController The type of the controller.
     6587 *  @param   hda           The harddisk attachment.
     6588 *  @param   phrc          Where to store com error - only valid if we return VERR_GENERAL_FAILURE.
    65496589 *  @return  VBox status code.
    65506590 */
    6551 static DECLCALLBACK(int) reconfigureHardDisks(PVM pVM, IHardDiskAttachment *hda,
     6591static DECLCALLBACK(int) reconfigureHardDisks(PVM pVM, ULONG lInstance,
     6592                                              StorageControllerType_T enmController,
     6593                                              IHardDiskAttachment *hda,
    65526594                                              HRESULT *phrc)
    65536595{
     
    65666608    ComPtr<IHardDisk> hardDisk;
    65676609    hrc = hda->COMGETTER(HardDisk)(hardDisk.asOutParam());                      H();
    6568     StorageBus_T enmBus;
    6569     hrc = hda->COMGETTER(Bus)(&enmBus);                                         H();
    65706610    LONG lDev;
    65716611    hrc = hda->COMGETTER(Device)(&lDev);                                        H();
    6572     LONG lChannel;
    6573     hrc = hda->COMGETTER(Channel)(&lChannel);                                   H();
     6612    LONG lPort;
     6613    hrc = hda->COMGETTER(Port)(&lPort);                                         H();
    65746614
    65756615    int         iLUN;
    65766616    const char *pcszDevice = NULL;
    6577 
    6578     switch (enmBus)
    6579     {
    6580         case StorageBus_IDE:
    6581         {
    6582             if (lChannel >= 2 || lChannel < 0)
     6617    bool        fSCSI = false;
     6618
     6619    switch (enmController)
     6620    {
     6621        case StorageControllerType_PIIX3:
     6622        case StorageControllerType_PIIX4:
     6623        case StorageControllerType_ICH6:
     6624        {
     6625            if (lPort >= 2 || lPort < 0)
    65836626            {
    6584                 AssertMsgFailed(("invalid controller channel number: %d\n", lChannel));
     6627                AssertMsgFailed(("invalid controller channel number: %d\n", lPort));
    65856628                return VERR_GENERAL_FAILURE;
    65866629            }
     
    65926635            }
    65936636
    6594             iLUN = 2*lChannel + lDev;
     6637            iLUN = 2*lPort + lDev;
    65956638            pcszDevice = "piix3ide";
    65966639            break;
    65976640        }
    6598         case StorageBus_SATA:
    6599         {
    6600             iLUN = lChannel;
     6641        case StorageControllerType_IntelAhci:
     6642        {
     6643            iLUN = lPort;
    66016644            pcszDevice = "ahci";
    66026645            break;
    66036646        }
     6647        case StorageControllerType_BusLogic:
     6648        {
     6649            iLUN = lPort;
     6650            pcszDevice = "buslogic";
     6651            fSCSI = true;
     6652            break;
     6653        }
     6654        case StorageControllerType_LsiLogic:
     6655        {
     6656            iLUN = lPort;
     6657            pcszDevice = "lsilogicscsi";
     6658            fSCSI = true;
     6659            break;
     6660        }
    66046661        default:
    66056662        {
    6606             AssertMsgFailed(("invalid disk controller type: %d\n", enmBus));
     6663            AssertMsgFailed(("invalid disk controller type: %d\n", enmController));
    66076664            return VERR_GENERAL_FAILURE;
    66086665        }
     
    66206677    PCFGMNODE pLunL2;
    66216678
    6622     pLunL1 = CFGMR3GetChildF(CFGMR3GetRoot(pVM), "Devices/%s/0/LUN#%d/AttachedDriver/", pcszDevice, iLUN);
     6679    /* SCSI has an extra driver between the device and the block driver. */
     6680    if (fSCSI)
     6681        pLunL1 = CFGMR3GetChildF(CFGMR3GetRoot(pVM), "Devices/%s/%u/LUN#%d/AttachedDriver/AttachedDriver/", pcszDevice, lInstance, iLUN);
     6682    else
     6683        pLunL1 = CFGMR3GetChildF(CFGMR3GetRoot(pVM), "Devices/%s/%u/LUN#%d/AttachedDriver/", pcszDevice, lInstance, iLUN);
    66236684
    66246685    if (!pLunL1)
    66256686    {
    6626         PCFGMNODE pInst = CFGMR3GetChildF(CFGMR3GetRoot(pVM), "Devices/%s/0/", pcszDevice);
     6687        PCFGMNODE pInst = CFGMR3GetChildF(CFGMR3GetRoot(pVM), "Devices/%s/%u/", pcszDevice, lInstance);
    66276688        AssertReturn(pInst, VERR_INTERNAL_ERROR);
    66286689
    66296690        PCFGMNODE pLunL0;
    66306691        rc = CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%d", iLUN);                     RC_CHECK();
     6692
     6693        if (fSCSI)
     6694        {
     6695            rc = CFGMR3InsertString(pLunL0, "Driver",              "SCSI");             RC_CHECK();
     6696            rc = CFGMR3InsertNode(pLunL0,   "Config", &pCfg);                           RC_CHECK();
     6697
     6698            rc = CFGMR3InsertNode(pLunL0,   "AttachedDriver", &pLunL0);                 RC_CHECK();
     6699        }
     6700
    66316701        rc = CFGMR3InsertString(pLunL0, "Driver",              "Block");            RC_CHECK();
    66326702        rc = CFGMR3InsertNode(pLunL0,   "Config", &pCfg);                           RC_CHECK();
     
    68596929            {
    68606930                PVMREQ pReq;
     6931                ComPtr<IStorageController> controller;
     6932                BSTR controllerName;
     6933                ULONG lInstance;
     6934                StorageControllerType_T enmController;
     6935
     6936                /*
     6937                 * We can't pass a storage controller object directly
     6938                 * (g++ complains about not being able to pass non POD types through '...')
     6939                 * so we have to query needed values here and pass them.
     6940                 */
     6941                rc = atts[i]->COMGETTER(Controller)(&controllerName);
     6942                if (FAILED (rc))
     6943                    break;
     6944
     6945                rc = that->mMachine->GetStorageControllerByName(controllerName, controller.asOutParam());
     6946                if (FAILED (rc))
     6947                    break;
     6948
     6949                rc = controller->COMGETTER(ControllerType)(&enmController);
     6950                rc = controller->COMGETTER(Instance)(&lInstance);
    68616951                /*
    68626952                 *  don't leave the lock since reconfigureHardDisks isn't going
     
    68646954                 */
    68656955                int vrc = VMR3ReqCall (that->mpVM, VMREQDEST_ANY, &pReq, RT_INDEFINITE_WAIT,
    6866                                        (PFNRT)reconfigureHardDisks, 3, that->mpVM,
    6867                                        atts [i], &rc);
     6956                                       (PFNRT)reconfigureHardDisks, 5, that->mpVM, lInstance,
     6957                                       enmController, atts [i], &rc);
    68686958                if (VBOX_SUCCESS (rc))
    68696959                    rc = pReq->iStatus;
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