[libvirt] [PATCH v2 14/15] vbox: Process empty removable disks in dumpxml
John Ferlan
jferlan at redhat.com
Fri Nov 3 13:56:26 UTC 2017
On 10/24/2017 03:35 PM, Dawid Zamirski wrote:
> Previously any removable storage device without media attached was
> omitted from domain XML dump. They're still (rightfully) omitted in
> snapshot XMl dump but need to be accounted properly to for the device
XML
> names to stay in 'sync' between domain and snapshot XML dumps.
> ---
> src/vbox/vbox_common.c | 128 ++++++++++++++++++++++++++++---------------------
> 1 file changed, 74 insertions(+), 54 deletions(-)
>
> diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> index ee6421aae..d1d8804c7 100644
> --- a/src/vbox/vbox_common.c
> +++ b/src/vbox/vbox_common.c
> @@ -3213,7 +3213,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> virDomainDiskDefPtr disk = NULL;
> char *mediumLocUtf8 = NULL;
> size_t sdCount = 0, i;
> - int diskCount = 0;
> int ret = -1;
>
> def->ndisks = 0;
> @@ -3226,11 +3225,15 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> if (!mediumAttachment)
> continue;
>
> - gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
> - if (medium) {
> - def->ndisks++;
> - VBOX_RELEASE(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;
> }
> +
> + def->ndisks++;
> + VBOX_RELEASE(medium);
> }
>
> /* Allocate mem, if fails return error */
> @@ -3246,7 +3249,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> }
>
> /* get the attachment details here */
> - for (i = 0; i < mediumAttachments.count && diskCount < def->ndisks; i++) {
> + for (i = 0; i < mediumAttachments.count; i++) {
> mediumAttachment = mediumAttachments.items[i];
> controller = NULL;
> controllerName = NULL;
> @@ -3258,7 +3261,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> mediumLocUtf8 = NULL;
> devicePort = 0;
> deviceSlot = 0;
> - disk = def->disks[diskCount];
> + disk = def->disks[i];
>
> if (!mediumAttachment)
> continue;
> @@ -3270,9 +3273,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> goto cleanup;
> }
>
> - if (!medium)
> - continue;
> -
> rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment,
> &controllerName);
> if (NS_FAILED(rc)) {
> @@ -3292,22 +3292,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> 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;
> - }
> -
> - VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
> -
> - 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,
> @@ -3333,11 +3317,30 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> 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;
> +
> + if (medium) {
> + 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;
> + }
> +
> + VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
> +
> + if (virDomainDiskSetSource(disk, mediumLocUtf8) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Could not set disk source"));
> + 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;
> + }
> }
>
> disk->dst = vboxGenerateMediumName(storageBus, devicePort, deviceSlot,
> @@ -3375,8 +3378,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
>
> virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
>
> - diskCount++;
> -
> VBOX_UTF16_FREE(controllerName);
> VBOX_UTF8_FREE(mediumLocUtf8);
> VBOX_UTF16_FREE(mediumLocUtf16);
> @@ -5814,6 +5815,14 @@ vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def,
>
> /* skip empty removable disk */
> if (!disk) {
> + /* removable disks with empty (ejected) media won't be displayed
> + * in XML, but we need to update "sdCount" so that device names match
> + * in domain dumpxml and snapshot dumpxml
> + */
> + if (storageBus == StorageBus_SATA || storageBus == StorageBus_SCSI ||
> + storageBus == StorageBus_SAS)
> + sdCount++;
> +
> VBOX_RELEASE(storageController);
> continue;
> }
> @@ -5982,14 +5991,6 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr snapshot,
> IMediumAttachment *imediumattach = mediumAttachments.items[i];
> if (!imediumattach)
> continue;
> - rc = gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &disk);
> - if (NS_FAILED(rc)) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Cannot get medium"));
> - goto cleanup;
> - }
> - if (!disk)
> - continue;
Can the changes that are moving the medium code to be all together go
into a patch just before this one? Then the hunk here just becomes
adding the sdCount++ adjustment when !disk - just like all that changed
for vboxSnapshotGetReadWriteDisks.
Tks -
John
> rc = gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &storageControllerName);
> if (NS_FAILED(rc)) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -6009,19 +6010,6 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr snapshot,
> }
> if (!storageController)
> continue;
> - rc = gVBoxAPI.UIMedium.GetLocation(disk, &mediumLocUtf16);
> - if (NS_FAILED(rc)) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Cannot get disk location"));
> - goto cleanup;
> - }
> - VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
> - VBOX_UTF16_FREE(mediumLocUtf16);
> - if (VIR_STRDUP(def->dom->disks[diskCount]->src->path, mediumLocUtf8) < 0)
> - goto cleanup;
> -
> - VBOX_UTF8_FREE(mediumLocUtf8);
> -
> rc = gVBoxAPI.UIStorageController.GetBus(storageController, &storageBus);
> if (NS_FAILED(rc)) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -6040,6 +6028,38 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr snapshot,
> _("Cannot get device slot"));
> goto cleanup;
> }
> +
> + rc = gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &disk);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Cannot get medium"));
> + goto cleanup;
> + }
> +
> + /* skip empty removable disk */
> + if (!disk) {
> + /* removable disks with empty (ejected) media won't be displayed
> + * in XML, but we need to update "sdCount" so that device names match
> + * in domain dumpxml and snapshot dumpxml
> + */
> + if (storageBus == StorageBus_SATA || storageBus == StorageBus_SCSI ||
> + storageBus == StorageBus_SAS)
> + sdCount++;
> + continue;
> + }
> +
> + rc = gVBoxAPI.UIMedium.GetLocation(disk, &mediumLocUtf16);
> + if (NS_FAILED(rc)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Cannot get disk location"));
> + goto cleanup;
> + }
> + VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
> + VBOX_UTF16_FREE(mediumLocUtf16);
> + if (VIR_STRDUP(def->dom->disks[diskCount]->src->path, mediumLocUtf8) < 0)
> + goto cleanup;
> +
> + VBOX_UTF8_FREE(mediumLocUtf8);
> rc = gVBoxAPI.UIMedium.GetReadOnly(disk, &readOnly);
> if (NS_FAILED(rc)) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>
More information about the libvir-list
mailing list