vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
{
vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER;
- int ret = -1, diskCount = 0;
+ int ret = -1;
IMediumAttachment *mediumAttachment = NULL;
IMedium *medium = NULL;
IStorageController *controller = NULL;
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 */
}
/* 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;
mediumLocUtf8 = NULL;
devicePort = 0;
deviceSlot = 0;
- disk = def->disks[diskCount];
+ disk = def->disks[i];
if (!mediumAttachment)
continue;
goto cleanup;
}
- if (!medium)
- continue;
-
rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment,
&controllerName);
if (NS_FAILED(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;
- }
-
- 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,
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,
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
- diskCount++;
-
VBOX_UTF16_FREE(controllerName);
VBOX_UTF8_FREE(mediumLocUtf8);
VBOX_UTF16_FREE(mediumLocUtf16);
/* 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)
+ sdCount++;
+
VBOX_RELEASE(storageController);
continue;
}
/* 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)
+ sdCount++;
+
VBOX_RELEASE(storageController);
continue;
}