On 10/23/2014 09:46 PM, Taowei Luo wrote: > The API on IHardDiskAttachment is merged into IMediumAttachment. > So, we don't need it anymore. > --- > src/vbox/vbox_storage.c | 160 ++++++++++++++++++++++++++++++++ > src/vbox/vbox_tmpl.c | 202 ++++++----------------------------------- > src/vbox/vbox_uniformed_api.h | 6 ++ > 3 files changed, 192 insertions(+), 176 deletions(-) > The Coverity checker had some issues with this patch. Coverity has a single UNUSED_VALUE for 5 different checks. It wasn't initially clear what the problem was, but I was able to at least determine that although I'm not quite sure of the "correct" fix/patch. > diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c > index 1e6ca67..45090eb 100644 > --- a/src/vbox/vbox_storage.c > +++ b/src/vbox/vbox_storage.c > @@ -530,3 +530,163 @@ virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool, > virStorageVolDefFree(def); > return ret; > } > + > +int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags) > +{ > + vboxGlobalData *data = vol->conn->privateData; > + unsigned char uuid[VIR_UUID_BUFLEN]; > + IHardDisk *hardDisk = NULL; > + int deregister = 0; > + PRUint32 hddstate = 0; > + size_t i = 0; > + size_t j = 0; > + PRUint32 machineIdsSize = 0; > + vboxArray machineIds = VBOX_ARRAY_INITIALIZER; > + vboxIIDUnion hddIID; > + nsresult rc; > + int ret = -1; > + > + if (!data->vboxObj) { > + return ret; > + } > + > + VBOX_IID_INITIALIZE(&hddIID); > + virCheckFlags(0, -1); > + > + if (virUUIDParse(vol->key, uuid) < 0) { > + virReportError(VIR_ERR_INVALID_ARG, > + _("Could not parse UUID from '%s'"), vol->key); > + return -1; > + } > + > + vboxIIDFromUUID(&hddIID, uuid); > + rc = gVBoxAPI.UIVirtualBox.GetHardDiskByIID(data->vboxObj, &hddIID, &hardDisk); > + if (NS_FAILED(rc)) > + goto cleanup; > + > + gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate); > + if (hddstate == MediaState_Inaccessible) > + goto cleanup; > + > + gVBoxAPI.UArray.vboxArrayGet(&machineIds, hardDisk, > + gVBoxAPI.UArray.handleMediumGetMachineIds(hardDisk)); > + > +#if defined WIN32 > + /* VirtualBox 2.2 on Windows represents IIDs as GUIDs and the > + * machineIds array contains direct instances of the GUID struct > + * instead of pointers to the actual struct instances. But there > + * is no 128bit width simple item type for a SafeArray to fit a > + * GUID in. The largest simple type it 64bit width and VirtualBox > + * uses two of this 64bit items to represents one GUID. Therefore, > + * we divide the size of the SafeArray by two, to compensate for > + * this workaround in VirtualBox */ > + if (gVBoxAPI.uVersion >= 2001052 && gVBoxAPI.uVersion < 2002051) > + machineIds.count /= 2; > +#endif /* !defined WIN32 */ > + > + machineIdsSize = machineIds.count; > + > + for (i = 0; i < machineIds.count; i++) { > + IMachine *machine = NULL; > + vboxIIDUnion machineId; > + vboxArray hddAttachments = VBOX_ARRAY_INITIALIZER; > + > + VBOX_IID_INITIALIZE(&machineId); > + vboxIIDFromArrayItem(&machineId, &machineIds, i); > + > + if (gVBoxAPI.getMachineForSession) { > + rc = gVBoxAPI.UIVirtualBox.GetMachine(data->vboxObj, &machineId, &machine); Event value_overwrite: Value from "(*gVBoxAPI.UIMachine.SaveSettings)(machine)" is overwritten with value from "(*gVBoxAPI.UIVirtualBox.GetMachine)(data->vboxObj, &machineId, &machine)". > + if (NS_FAILED(rc)) { > + virReportError(VIR_ERR_NO_DOMAIN, "%s", > + _("no domain with matching uuid")); > + break; > + } > + } > + > + rc = gVBoxAPI.UISession.Open(data, &machineId, machine); Event value_overwrite: Value from "(*gVBoxAPI.UIMachine.SaveSettings)(machine)" is overwritten with value from "(*gVBoxAPI.UISession.Open)(data, &machineId, machine)". > + > + if (NS_FAILED(rc)) { > + vboxIIDUnalloc(&machineId); > + continue; > + } > + > + rc = gVBoxAPI.UISession.GetMachine(data->vboxSession, &machine); > + if (NS_FAILED(rc)) > + goto cleanupLoop; > + > + gVBoxAPI.UArray.vboxArrayGet(&hddAttachments, machine, > + gVBoxAPI.UArray.handleMachineGetMediumAttachments(machine)); > + > + for (j = 0; j < hddAttachments.count; j++) { > + IMediumAttachment *hddAttachment = hddAttachments.items[j]; > + IHardDisk *hdd = NULL; > + vboxIIDUnion iid; > + > + if (!hddAttachment) > + continue; > + > + rc = gVBoxAPI.UIMediumAttachment.GetMedium(hddAttachment, &hdd); Event value_overwrite: Value from "(*gVBoxAPI.UIMachine.SaveSettings)(machine)" is overwritten with value from "(*gVBoxAPI.UIMediumAttachment.GetMedium)(hddAttachment, &hdd)". > + if (NS_FAILED(rc) || !hdd) > + continue; > + > + VBOX_IID_INITIALIZE(&iid); > + rc = gVBoxAPI.UIMedium.GetId(hdd, &iid); > + if (NS_FAILED(rc)) { > + VBOX_MEDIUM_RELEASE(hdd); > + continue; > + } > + > + DEBUGIID("HardDisk (to delete) UUID", &hddIID); > + DEBUGIID("HardDisk (currently processing) UUID", &iid); > + > + if (vboxIIDIsEqual(&hddIID, &iid)) { > + PRUnichar *controller = NULL; > + PRInt32 port = 0; > + PRInt32 device = 0; > + > + DEBUGIID("Found HardDisk to delete, UUID", &hddIID); > + > + gVBoxAPI.UIMediumAttachment.GetController(hddAttachment, &controller); > + gVBoxAPI.UIMediumAttachment.GetPort(hddAttachment, &port); > + gVBoxAPI.UIMediumAttachment.GetDevice(hddAttachment, &device); > + > + rc = gVBoxAPI.UIMachine.DetachDevice(machine, controller, port, device); > + if (NS_SUCCEEDED(rc)) { > + rc = gVBoxAPI.UIMachine.SaveSettings(machine); Event returned_value: Value from "(*gVBoxAPI.UIMachine.SaveSettings)(machine)" is assigned to "rc" here, but that stored value is not used before it is overwritten. OK - so this seems to be "root cause" - the 'rc' isn't being checked here; however, it is checked and handled in other cases. This causes Coverity to complain that we need to "handle" it here too. If I add a simple check "if (NS_FAILED(rc) {...}", then Coverity is happy. I'm not sure what to expect to be done here, so I leave that decision up to you for a follow up patch - thanks! > + VIR_DEBUG("saving machine settings"); > + deregister++; > + VIR_DEBUG("deregistering hdd:%d", deregister); > + } > + > + VBOX_UTF16_FREE(controller); > + } > + vboxIIDUnalloc(&iid); > + VBOX_MEDIUM_RELEASE(hdd); > + } > + > + cleanupLoop: > + gVBoxAPI.UArray.vboxArrayRelease(&hddAttachments); > + VBOX_RELEASE(machine); > + gVBoxAPI.UISession.Close(data->vboxSession); > + vboxIIDUnalloc(&machineId); > + } > + > + gVBoxAPI.UArray.vboxArrayUnalloc(&machineIds); > + > + if (machineIdsSize == 0 || machineIdsSize == deregister) { > + IProgress *progress = NULL; > + rc = gVBoxAPI.UIHardDisk.DeleteStorage(hardDisk, &progress); Event value_overwrite: Value from "(*gVBoxAPI.UIMachine.SaveSettings)(machine)" is overwritten with value from "(*gVBoxAPI.UIHardDisk.DeleteStorage)(hardDisk, &progress)". > + > + if (NS_SUCCEEDED(rc) && progress) { > + gVBoxAPI.UIProgress.WaitForCompletion(progress, -1); > + VBOX_RELEASE(progress); > + DEBUGIID("HardDisk deleted, UUID", &hddIID); > + ret = 0; > + } > + } > + > + cleanup: > + VBOX_MEDIUM_RELEASE(hardDisk); > + vboxIIDUnalloc(&hddIID); > + return ret; > +} > diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c > index 8aed0d6..71dbedd 100644 > --- a/src/vbox/vbox_tmpl.c > +++ b/src/vbox/vbox_tmpl.c > @@ -106,7 +106,6 @@ typedef IUSBDeviceFilters IUSBCommon; > typedef IHardDiskAttachment IMediumAttachment; > #else /* VBOX_API_VERSION >= 3001000 */ > typedef IMedium IHardDisk; > -typedef IMediumAttachment IHardDiskAttachment; > #endif /* VBOX_API_VERSION >= 3001000 */ > > #include "vbox_uniformed_api.h" > @@ -2034,181 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr driver) > * The Storage Functions here on > */ > > -static int vboxStorageVolDelete(virStorageVolPtr vol, > - unsigned int flags) > -{ > - VBOX_OBJECT_CHECK(vol->conn, int, -1); > - vboxIID hddIID = VBOX_IID_INITIALIZER; > - unsigned char uuid[VIR_UUID_BUFLEN]; > - IHardDisk *hardDisk = NULL; > - int deregister = 0; > - nsresult rc; > - size_t i = 0; > - size_t j = 0; > - > - virCheckFlags(0, -1); > - > - if (virUUIDParse(vol->key, uuid) < 0) { > - virReportError(VIR_ERR_INVALID_ARG, > - _("Could not parse UUID from '%s'"), vol->key); > - return -1; > - } > - > - vboxIIDFromUUID(&hddIID, uuid); > -#if VBOX_API_VERSION < 4000000 > - rc = data->vboxObj->vtbl->GetHardDisk(data->vboxObj, hddIID.value, &hardDisk); > -#elif VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000 > - rc = data->vboxObj->vtbl->FindMedium(data->vboxObj, hddIID.value, > - DeviceType_HardDisk, &hardDisk); > -#else > - rc = data->vboxObj->vtbl->OpenMedium(data->vboxObj, hddIID.value, > - DeviceType_HardDisk, AccessMode_ReadWrite, > - PR_FALSE, &hardDisk); > -#endif /* VBOX_API_VERSION >= 4000000 */ > - if (NS_SUCCEEDED(rc)) { > - PRUint32 hddstate; > - > - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate); > - if (hddstate != MediaState_Inaccessible) { > - PRUint32 machineIdsSize = 0; > - vboxArray machineIds = VBOX_ARRAY_INITIALIZER; > - > -#if VBOX_API_VERSION < 3001000 > - vboxArrayGet(&machineIds, hardDisk, hardDisk->vtbl->imedium.GetMachineIds); > -#else /* VBOX_API_VERSION >= 3001000 */ > - vboxArrayGet(&machineIds, hardDisk, hardDisk->vtbl->GetMachineIds); > -#endif /* VBOX_API_VERSION >= 3001000 */ > - > -#if VBOX_API_VERSION == 2002000 && defined WIN32 > - /* VirtualBox 2.2 on Windows represents IIDs as GUIDs and the > - * machineIds array contains direct instances of the GUID struct > - * instead of pointers to the actual struct instances. But there > - * is no 128bit width simple item type for a SafeArray to fit a > - * GUID in. The largest simple type it 64bit width and VirtualBox > - * uses two of this 64bit items to represents one GUID. Therefore, > - * we divide the size of the SafeArray by two, to compensate for > - * this workaround in VirtualBox */ > - machineIds.count /= 2; > -#endif /* VBOX_API_VERSION >= 2002000 */ > - > - machineIdsSize = machineIds.count; > - > - for (i = 0; i < machineIds.count; i++) { > - IMachine *machine = NULL; > - vboxIID machineId = VBOX_IID_INITIALIZER; > - > - vboxIIDFromArrayItem(&machineId, &machineIds, i); > - > -#if VBOX_API_VERSION >= 4000000 > - rc = VBOX_OBJECT_GET_MACHINE(machineId.value, &machine); > - if (NS_FAILED(rc)) { > - virReportError(VIR_ERR_NO_DOMAIN, "%s", > - _("no domain with matching uuid")); > - break; > - } > -#endif > - > - rc = VBOX_SESSION_OPEN(machineId.value, machine); > - > - if (NS_SUCCEEDED(rc)) { > - > - rc = data->vboxSession->vtbl->GetMachine(data->vboxSession, &machine); > - if (NS_SUCCEEDED(rc)) { > - vboxArray hddAttachments = VBOX_ARRAY_INITIALIZER; > - > -#if VBOX_API_VERSION < 3001000 > - vboxArrayGet(&hddAttachments, machine, > - machine->vtbl->GetHardDiskAttachments); > -#else /* VBOX_API_VERSION >= 3001000 */ > - vboxArrayGet(&hddAttachments, machine, > - machine->vtbl->GetMediumAttachments); > -#endif /* VBOX_API_VERSION >= 3001000 */ > - for (j = 0; j < hddAttachments.count; j++) { > - IHardDiskAttachment *hddAttachment = hddAttachments.items[j]; > - > - if (hddAttachment) { > - IHardDisk *hdd = NULL; > - > -#if VBOX_API_VERSION < 3001000 > - rc = hddAttachment->vtbl->GetHardDisk(hddAttachment, &hdd); > -#else /* VBOX_API_VERSION >= 3001000 */ > - rc = hddAttachment->vtbl->GetMedium(hddAttachment, &hdd); > -#endif /* VBOX_API_VERSION >= 3001000 */ > - if (NS_SUCCEEDED(rc) && hdd) { > - vboxIID iid = VBOX_IID_INITIALIZER; > - > - rc = VBOX_MEDIUM_FUNC_ARG1(hdd, GetId, &iid.value); > - if (NS_SUCCEEDED(rc)) { > - > - DEBUGIID("HardDisk (to delete) UUID", hddIID.value); > - DEBUGIID("HardDisk (currently processing) UUID", iid.value); > - > - if (vboxIIDIsEqual(&hddIID, &iid)) { > - PRUnichar *controller = NULL; > - PRInt32 port = 0; > - PRInt32 device = 0; > - > - DEBUGIID("Found HardDisk to delete, UUID", hddIID.value); > - > - hddAttachment->vtbl->GetController(hddAttachment, &controller); > - hddAttachment->vtbl->GetPort(hddAttachment, &port); > - hddAttachment->vtbl->GetDevice(hddAttachment, &device); > - > -#if VBOX_API_VERSION < 3001000 > - rc = machine->vtbl->DetachHardDisk(machine, controller, port, device); > -#else /* VBOX_API_VERSION >= 3001000 */ > - rc = machine->vtbl->DetachDevice(machine, controller, port, device); > -#endif /* VBOX_API_VERSION >= 3001000 */ > - if (NS_SUCCEEDED(rc)) { > - rc = machine->vtbl->SaveSettings(machine); > - VIR_DEBUG("saving machine settings"); > - } > - > - if (NS_SUCCEEDED(rc)) { > - deregister++; > - VIR_DEBUG("deregistering hdd:%d", deregister); > - } > - > - VBOX_UTF16_FREE(controller); > - } > - vboxIIDUnalloc(&iid); > - } > - VBOX_MEDIUM_RELEASE(hdd); > - } > - } > - } > - vboxArrayRelease(&hddAttachments); > - VBOX_RELEASE(machine); > - } > - VBOX_SESSION_CLOSE(); > - } > - > - vboxIIDUnalloc(&machineId); > - } > - > - vboxArrayUnalloc(&machineIds); > - > - if (machineIdsSize == 0 || machineIdsSize == deregister) { > - IProgress *progress = NULL; > - rc = hardDisk->vtbl->DeleteStorage(hardDisk, &progress); > - > - if (NS_SUCCEEDED(rc) && progress) { > - progress->vtbl->WaitForCompletion(progress, -1); > - VBOX_RELEASE(progress); > - DEBUGIID("HardDisk deleted, UUID", hddIID.value); > - ret = 0; > - } > - } > - } > - > - VBOX_MEDIUM_RELEASE(hardDisk); > - } > - > - vboxIIDUnalloc(&hddIID); > - > - return ret; > -} > - > static int > vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info) > { > @@ -3236,6 +3060,11 @@ static void* _handleMediumGetSnapshotIds(IMedium *medium) > return medium->vtbl->GetSnapshotIds; > } > > +static void* _handleMediumGetMachineIds(IMedium *medium) > +{ > + return medium->vtbl->GetMachineIds; > +} > + > static void* _handleHostGetNetworkInterfaces(IHost *host) > { > return host->vtbl->GetNetworkInterfaces; > @@ -3548,6 +3377,17 @@ _machineFindSnapshot(IMachine *machine, vboxIIDUnion *iidu, ISnapshot **snapshot > } > > static nsresult > +_machineDetachDevice(IMachine *machine, PRUnichar *name, > + PRInt32 controllerPort, PRInt32 device) > +{ > +#if VBOX_API_VERSION < 3001000 > + return machine->vtbl->DetachHardDisk(machine, name, controllerPort, device); > +#else /* VBOX_API_VERSION >= 3001000 */ > + return machine->vtbl->DetachDevice(machine, name, controllerPort, device); > +#endif /* VBOX_API_VERSION >= 3001000 */ > +} > + > +static nsresult > _machineGetAccessible(IMachine *machine, PRBool *isAccessible) > { > return machine->vtbl->GetAccessible(machine, isAccessible); > @@ -5035,6 +4875,12 @@ _hardDiskCreateBaseStorage(IHardDisk *hardDisk, PRUint64 logicalSize, > #endif > } > > +static nsresult > +_hardDiskDeleteStorage(IHardDisk *hardDisk, IProgress **progress) > +{ > + return hardDisk->vtbl->DeleteStorage(hardDisk, progress); > +} > + > static bool _machineStateOnline(PRUint32 state) > { > return ((state >= MachineState_FirstOnline) && > @@ -5094,6 +4940,7 @@ static vboxUniformedArray _UArray = { > .vboxArrayGet = vboxArrayGet, > .vboxArrayGetWithIIDArg = _vboxArrayGetWithIIDArg, > .vboxArrayRelease = vboxArrayRelease, > + .vboxArrayUnalloc = vboxArrayUnalloc, > .handleGetMachines = _handleGetMachines, > .handleGetHardDisks = _handleGetHardDisks, > .handleUSBGetDeviceFilters = _handleUSBGetDeviceFilters, > @@ -5102,6 +4949,7 @@ static vboxUniformedArray _UArray = { > .handleSnapshotGetChildren = _handleSnapshotGetChildren, > .handleMediumGetChildren = _handleMediumGetChildren, > .handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds, > + .handleMediumGetMachineIds = _handleMediumGetMachineIds, > .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces, > }; > > @@ -5136,6 +4984,7 @@ static vboxUniformedIMachine _UIMachine = { > .LaunchVMProcess = _machineLaunchVMProcess, > .Unregister = _machineUnregister, > .FindSnapshot = _machineFindSnapshot, > + .DetachDevice = _machineDetachDevice, > .GetAccessible = _machineGetAccessible, > .GetState = _machineGetState, > .GetName = _machineGetName, > @@ -5378,6 +5227,7 @@ static vboxUniformedIDHCPServer _UIDHCPServer = { > > static vboxUniformedIHardDisk _UIHardDisk = { > .CreateBaseStorage = _hardDiskCreateBaseStorage, > + .DeleteStorage = _hardDiskDeleteStorage, > }; > > static uniformedMachineStateChecker _machineStateChecker = { > diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h > index 337ae9c..75299e3 100644 > --- a/src/vbox/vbox_uniformed_api.h > +++ b/src/vbox/vbox_uniformed_api.h > @@ -168,6 +168,7 @@ typedef struct { > nsresult (*vboxArrayGet)(vboxArray *array, void *self, void *getter); > nsresult (*vboxArrayGetWithIIDArg)(vboxArray *array, void *self, void *getter, vboxIIDUnion *iidu); > void (*vboxArrayRelease)(vboxArray *array); > + void (*vboxArrayUnalloc)(vboxArray *array); > /* Generate function pointers for vboxArrayGet */ > void* (*handleGetMachines)(IVirtualBox *vboxObj); > void* (*handleGetHardDisks)(IVirtualBox *vboxObj); > @@ -177,6 +178,7 @@ typedef struct { > void* (*handleSnapshotGetChildren)(ISnapshot *snapshot); > void* (*handleMediumGetChildren)(IMedium *medium); > void* (*handleMediumGetSnapshotIds)(IMedium *medium); > + void* (*handleMediumGetMachineIds)(IMedium *medium); > void* (*handleHostGetNetworkInterfaces)(IHost *host); > } vboxUniformedArray; > > @@ -225,6 +227,8 @@ typedef struct { > nsresult (*Unregister)(IMachine *machine, PRUint32 cleanupMode, > PRUint32 *aMediaSize, IMedium ***aMedia); > nsresult (*FindSnapshot)(IMachine *machine, vboxIIDUnion *iidu, ISnapshot **snapshot); > + nsresult (*DetachDevice)(IMachine *machine, PRUnichar *name, > + PRInt32 controllerPort, PRInt32 device); > nsresult (*GetAccessible)(IMachine *machine, PRBool *isAccessible); > nsresult (*GetState)(IMachine *machine, PRUint32 *state); > nsresult (*GetName)(IMachine *machine, PRUnichar **name); > @@ -523,6 +527,7 @@ typedef struct { > typedef struct { > nsresult (*CreateBaseStorage)(IHardDisk *hardDisk, PRUint64 logicalSize, > PRUint32 variant, IProgress **progress); > + nsresult (*DeleteStorage)(IHardDisk *hardDisk, IProgress **progress); > } vboxUniformedIHardDisk; > > typedef struct { > @@ -613,6 +618,7 @@ virStorageVolPtr vboxStorageVolLookupByKey(virConnectPtr conn, const char *key); > virStorageVolPtr vboxStorageVolLookupByPath(virConnectPtr conn, const char *path); > virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool, > const char *xml, unsigned int flags); > +int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags); > > /* Version specified functions for installing uniformed API */ > void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list