On 10/24/2017 03:35 PM, Dawid Zamirski wrote: > --- > src/vbox/vbox_common.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c > index 9d45e4a76..715eb670e 100644 > --- a/src/vbox/vbox_common.c > +++ b/src/vbox/vbox_common.c > @@ -3153,6 +3153,123 @@ vboxHostDeviceGetXMLDesc(vboxDriverPtr data, virDomainDefPtr def, IMachine *mach > goto release_filters; > } > > + > +static int > +vboxDumpStorageControllers(virDomainDefPtr def, IMachine *machine) > +{ > + vboxArray storageControllers = VBOX_ARRAY_INITIALIZER; > + IStorageController *controller = NULL; > + PRUint32 storageBus = StorageBus_Null; > + PRUint32 controllerType = StorageControllerType_Null; > + virDomainControllerDefPtr cont = NULL; > + size_t i = 0; > + int model = -1, ret = -1; > + virDomainControllerType type = VIR_DOMAIN_CONTROLLER_TYPE_LAST; > + > + gVBoxAPI.UArray.vboxArrayGet(&storageControllers, machine, > + gVBoxAPI.UArray.handleMachineGetStorageControllers(machine)); > + > + for (i = 0; i < storageControllers.count; i++) { > + controller = storageControllers.items[i]; > + storageBus = StorageBus_Null; > + controllerType = StorageControllerType_Null; > + type = VIR_DOMAIN_CONTROLLER_TYPE_LAST; > + model = -1; > + > + if (!controller) > + continue; > + > + gVBoxAPI.UIStorageController.GetBus(controller, &storageBus); > + gVBoxAPI.UIStorageController.GetControllerType(controller, > + &controllerType); > + > + /* vbox controller model => libvirt controller model */ > + switch ((enum StorageControllerType) controllerType) { > + case StorageControllerType_PIIX3: > + model = VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX3; > + > + break; > + case StorageControllerType_PIIX4: > + model = VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX4; > + > + break; > + case StorageControllerType_ICH6: > + model = VIR_DOMAIN_CONTROLLER_MODEL_IDE_ICH6; > + > + break; > + case StorageControllerType_BusLogic: > + model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC; > + > + break; > + case StorageControllerType_LsiLogic: > + model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC; > + > + break; > + case StorageControllerType_LsiLogicSas: > + model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068; > + > + break; > + case StorageControllerType_IntelAhci: > + case StorageControllerType_I82078: > + case StorageControllerType_Null: > + model = -1; > + > + break; > + } > + > + /* vbox controller bus => libvirt controller type */ > + switch ((enum StorageBus) storageBus) { > + case StorageBus_IDE: > + type = VIR_DOMAIN_CONTROLLER_TYPE_IDE; > + > + break; > + case StorageBus_SCSI: > + case StorageBus_SAS: > + type = VIR_DOMAIN_CONTROLLER_TYPE_SCSI; > + > + break; > + case StorageBus_SATA: > + type = VIR_DOMAIN_CONTROLLER_TYPE_SATA; > + > + break; > + case StorageBus_Floppy: > + type = VIR_DOMAIN_CONTROLLER_TYPE_FDC; > + > + break; > + case StorageBus_Null: > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("Unsupported null storage bus")); > + > + goto cleanup; > + } > + > + if (type != VIR_DOMAIN_CONTROLLER_TYPE_LAST) { > + cont = virDomainDefAddController(def, type, -1, model); > + if (!cont) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("Failed to add %s controller type definition"), > + virDomainControllerTypeToString(type)); > + goto cleanup; > + } > + } > + } > + > + ret = 0; > + > + cleanup: > + gVBoxAPI.UArray.vboxArrayRelease(&storageControllers); > + > + if (ret < 0) { > + for (i = 0; i < def->ncontrollers; i++) > + virDomainControllerDefFree(def->controllers[i]); > + VIR_FREE(def->controllers); > + def->ncontrollers = 0; Although not necessarily a problem, since we're erroring out anyway, eventually when virDomainDefFree is called, this will be cleaned out anyway, so it can be removed... Remember that vboxDomainGetXMLDesc won't call virDomainDefFormat and it'll return NULL With that adjustment, Reviewed-by: John Ferlan <jferlan@xxxxxxxxxx> John > + } > + > + return ret; > +} > + > + > static void > vboxDumpIDEHDDs(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) > { > @@ -4000,6 +4117,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) > goto cleanup; > if (vboxDumpDisplay(def, data, machine) < 0) > goto cleanup; > + if (vboxDumpStorageControllers(def, machine) < 0) > + goto cleanup; > > vboxDumpIDEHDDs(def, data, machine); > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list