[libvirt] [PATCH v2 13/15] vbox: Cleanup vboxDumpDisks implementation
John Ferlan
jferlan at redhat.com
Fri Nov 3 13:54:46 UTC 2017
On 10/24/2017 03:35 PM, Dawid Zamirski wrote:
> Primer the code for further changes:
>
> * move variable declarations to the top of the function
> * group together free/release statements
> * error check and report VBOX API calls used
> ---
> src/vbox/vbox_common.c | 188 +++++++++++++++++++++++++++++++------------------
> 1 file changed, 120 insertions(+), 68 deletions(-)
>
> diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> index 9dc36a1b2..ee6421aae 100644
> --- a/src/vbox/vbox_common.c
> +++ b/src/vbox/vbox_common.c
> @@ -3202,6 +3202,16 @@ static int
> vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> {
> vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER;
> + IMediumAttachment *mediumAttachment = NULL;
> + IMedium *medium = NULL;
> + IStorageController *controller = NULL;
> + PRUnichar *controllerName = NULL, *mediumLocUtf16 = NULL;
> + PRUint32 deviceType, storageBus;
> + PRInt32 devicePort, deviceSlot;
> + PRBool readOnly;
> + nsresult rc;
> + virDomainDiskDefPtr disk = NULL;
> + char *mediumLocUtf8 = NULL;
> size_t sdCount = 0, i;
> int diskCount = 0;
> int ret = -1;
> @@ -3212,15 +3222,14 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
>
> /* get the number of attachments */
> for (i = 0; i < mediumAttachments.count; i++) {
> - IMediumAttachment *imediumattach = mediumAttachments.items[i];
> - if (imediumattach) {
> - IMedium *medium = NULL;
> + mediumAttachment = mediumAttachments.items[i];
> + if (!mediumAttachment)
> + continue;
>
> - gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium);
> - if (medium) {
> - def->ndisks++;
> - VBOX_RELEASE(medium);
> - }
> + gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
> + if (medium) {
> + def->ndisks++;
> + VBOX_RELEASE(medium);
> }
> }
>
> @@ -3229,7 +3238,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> goto cleanup;
>
> for (i = 0; i < def->ndisks; i++) {
> - virDomainDiskDefPtr disk = virDomainDiskDefNew(NULL);
> + disk = virDomainDiskDefNew(NULL);
> if (!disk)
> goto cleanup;
>
> @@ -3238,104 +3247,141 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
>
> /* get the attachment details here */
> for (i = 0; i < mediumAttachments.count && diskCount < def->ndisks; i++) {
> - IMediumAttachment *imediumattach = mediumAttachments.items[i];
> - IStorageController *storageController = NULL;
> - PRUnichar *storageControllerName = NULL;
> - PRUint32 deviceType = DeviceType_Null;
> - PRUint32 storageBus = StorageBus_Null;
> - PRBool readOnly = PR_FALSE;
> - IMedium *medium = NULL;
> - PRUnichar *mediumLocUtf16 = NULL;
> - char *mediumLocUtf8 = NULL;
> - PRInt32 devicePort = 0;
> - PRInt32 deviceSlot = 0;
> -
> - if (!imediumattach)
> + mediumAttachment = mediumAttachments.items[i];
> + controller = NULL;
> + controllerName = NULL;
> + deviceType = DeviceType_Null;
> + storageBus = StorageBus_Null;
> + readOnly = PR_FALSE;
> + medium = NULL;
> + mediumLocUtf16 = NULL;
> + mediumLocUtf8 = NULL;
> + devicePort = 0;
> + deviceSlot = 0;
> + disk = def->disks[diskCount];
> +
> + if (!mediumAttachment)
> continue;
>
> - gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium);
> + rc = gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get IMedium, rc=%08x"), rc);
> + goto cleanup;
> + }
> +
> if (!medium)
> continue;
>
> - gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &storageControllerName);
> - if (!storageControllerName) {
> - VBOX_RELEASE(medium);
> - continue;
> + rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment,
> + &controllerName);
^^^^^
Alignment for second line... Needs 5 more spaces right...
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to get storage controller name, rc=%08x"),
> + rc);
> + goto cleanup;
> }
>
> - gVBoxAPI.UIMachine.GetStorageControllerByName(machine,
> - storageControllerName,
> - &storageController);
> - VBOX_UTF16_FREE(storageControllerName);
> - if (!storageController) {
> - VBOX_RELEASE(medium);
> - continue;
> + rc = gVBoxAPI.UIMachine.GetStorageControllerByName(machine,
> + controllerName,
> + &controller);
One more space each for arg2 and arg3
The rest looks OK... with the above adjustments...
Reviewed-by: John Ferlan <jferlan at redhat.com>
John
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get storage controller by name, rc=%08x"),
> + rc);
> + goto cleanup;
> + }
> +
> + rc = gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get medium storage location, rc=%08x"),
> + rc);
> + goto cleanup;
> }
>
> - gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16);
> VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
> - VBOX_UTF16_FREE(mediumLocUtf16);
> - ignore_value(virDomainDiskSetSource(def->disks[diskCount],
> - mediumLocUtf8));
> - VBOX_UTF8_FREE(mediumLocUtf8);
>
> - if (!virDomainDiskGetSource(def->disks[diskCount])) {
> - VBOX_RELEASE(medium);
> - VBOX_RELEASE(storageController);
> + if (virDomainDiskSetSource(disk, mediumLocUtf8) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Could not set disk source"));
> + goto cleanup;
> + }
>
> + rc = gVBoxAPI.UIMediumAttachment.GetType(mediumAttachment, &deviceType);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get device type, rc=%08x"), rc);
> + goto cleanup;
> + }
> + rc = gVBoxAPI.UIMediumAttachment.GetPort(mediumAttachment, &devicePort);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get device port, rc=%08x"), rc);
> + goto cleanup;
> + }
> + rc = gVBoxAPI.UIMediumAttachment.GetDevice(mediumAttachment, &deviceSlot);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get device slot, rc=%08x"), rc);
> + goto cleanup;
> + }
> + rc = gVBoxAPI.UIStorageController.GetBus(controller, &storageBus);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get storage controller bus, rc=%08x"),
> + rc);
> + goto cleanup;
> + }
> + rc = gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Could not get read only state, rc=%08x"), rc);
> goto cleanup;
> }
>
> - gVBoxAPI.UIStorageController.GetBus(storageController, &storageBus);
> - gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &devicePort);
> - gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &deviceSlot);
> + disk->dst = vboxGenerateMediumName(storageBus, devicePort, deviceSlot,
> + sdCount);
>
> - def->disks[diskCount]->dst = vboxGenerateMediumName(storageBus,
> - devicePort,
> - deviceSlot,
> - sdCount);
> - if (!def->disks[diskCount]->dst) {
> + if (!disk->dst) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Could not generate medium name for the disk "
> "at: port:%d, slot:%d"), devicePort, deviceSlot);
> - VBOX_RELEASE(medium);
> - VBOX_RELEASE(storageController);
> -
> goto cleanup;
> }
>
> if (storageBus == StorageBus_IDE) {
> - def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_IDE;
> + disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
> } else if (storageBus == StorageBus_SATA) {
> sdCount++;
> - def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_SATA;
> + disk->bus = VIR_DOMAIN_DISK_BUS_SATA;
> } else if (storageBus == StorageBus_SCSI ||
> storageBus == StorageBus_SAS) {
> sdCount++;
> - def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> + disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> } else if (storageBus == StorageBus_Floppy) {
> - def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_FDC;
> + disk->bus = VIR_DOMAIN_DISK_BUS_FDC;
> }
>
> - gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceType);
> if (deviceType == DeviceType_HardDisk)
> - def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_DISK;
> + disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
> else if (deviceType == DeviceType_Floppy)
> - def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
> + disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
> else if (deviceType == DeviceType_DVD)
> - def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
> + disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
>
> -
> - gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly);
> if (readOnly == PR_TRUE)
> - def->disks[diskCount]->src->readonly = true;
> + disk->src->readonly = true;
>
> - virDomainDiskSetType(def->disks[diskCount],
> - VIR_STORAGE_TYPE_FILE);
> + virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
>
> - VBOX_RELEASE(medium);
> - VBOX_RELEASE(storageController);
> diskCount++;
> +
> + VBOX_UTF16_FREE(controllerName);
> + VBOX_UTF8_FREE(mediumLocUtf8);
> + VBOX_UTF16_FREE(mediumLocUtf16);
> + VBOX_RELEASE(medium);
> + VBOX_RELEASE(controller);
> }
>
> ret = 0;
> @@ -3345,6 +3391,12 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
>
> /* cleanup on error */
> if (ret < 0) {
> + VBOX_UTF16_FREE(controllerName);
> + VBOX_UTF8_FREE(mediumLocUtf8);
> + VBOX_UTF16_FREE(mediumLocUtf16);
> + VBOX_RELEASE(medium);
> + VBOX_RELEASE(controller);
> +
> for (i = 0; i < def->ndisks; i++)
> VIR_FREE(def->disks[i]);
> VIR_FREE(def->disks);
>
More information about the libvir-list
mailing list