提交 7c0a85e5 编写于 作者: D Dawid Zamirski 提交者: John Ferlan

vbox: Process empty removable disks in dumpxml

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
names to stay in 'sync' between domain and snapshot XML dumps.
上级 08b995c8
...@@ -3185,7 +3185,7 @@ static int ...@@ -3185,7 +3185,7 @@ static int
vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
{ {
vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER; vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER;
int ret = -1, diskCount = 0; int ret = -1;
IMediumAttachment *mediumAttachment = NULL; IMediumAttachment *mediumAttachment = NULL;
IMedium *medium = NULL; IMedium *medium = NULL;
IStorageController *controller = NULL; IStorageController *controller = NULL;
...@@ -3208,11 +3208,15 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3208,11 +3208,15 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
if (!mediumAttachment) if (!mediumAttachment)
continue; continue;
gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium); rc = gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
if (medium) { if (NS_FAILED(rc)) {
def->ndisks++; virReportError(VIR_ERR_INTERNAL_ERROR,
VBOX_RELEASE(medium); _("Could not get IMedium, rc=%08x"), rc);
goto cleanup;
} }
def->ndisks++;
VBOX_RELEASE(medium);
} }
/* Allocate mem, if fails return error */ /* Allocate mem, if fails return error */
...@@ -3228,7 +3232,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3228,7 +3232,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
} }
/* get the attachment details here */ /* 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]; mediumAttachment = mediumAttachments.items[i];
controller = NULL; controller = NULL;
controllerName = NULL; controllerName = NULL;
...@@ -3240,7 +3244,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3240,7 +3244,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
mediumLocUtf8 = NULL; mediumLocUtf8 = NULL;
devicePort = 0; devicePort = 0;
deviceSlot = 0; deviceSlot = 0;
disk = def->disks[diskCount]; disk = def->disks[i];
if (!mediumAttachment) if (!mediumAttachment)
continue; continue;
...@@ -3252,9 +3256,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3252,9 +3256,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
goto cleanup; goto cleanup;
} }
if (!medium)
continue;
rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment, rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment,
&controllerName); &controllerName);
if (NS_FAILED(rc)) { if (NS_FAILED(rc)) {
...@@ -3274,22 +3275,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3274,22 +3275,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
goto cleanup; 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); rc = gVBoxAPI.UIMediumAttachment.GetType(mediumAttachment, &deviceType);
if (NS_FAILED(rc)) { if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
...@@ -3315,11 +3300,30 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3315,11 +3300,30 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
rc); rc);
goto cleanup; goto cleanup;
} }
rc = gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly);
if (NS_FAILED(rc)) { if (medium) {
virReportError(VIR_ERR_INTERNAL_ERROR, rc = gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16);
_("Could not get read only state, rc=%08x"), rc); if (NS_FAILED(rc)) {
goto cleanup; 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, disk->dst = vboxGenerateMediumName(storageBus, devicePort, deviceSlot,
...@@ -3356,8 +3360,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) ...@@ -3356,8 +3360,6 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE); virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
diskCount++;
VBOX_UTF16_FREE(controllerName); VBOX_UTF16_FREE(controllerName);
VBOX_UTF8_FREE(mediumLocUtf8); VBOX_UTF8_FREE(mediumLocUtf8);
VBOX_UTF16_FREE(mediumLocUtf16); VBOX_UTF16_FREE(mediumLocUtf16);
...@@ -5788,6 +5790,13 @@ vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def, ...@@ -5788,6 +5790,13 @@ vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def,
/* skip empty removable disk */ /* skip empty removable disk */
if (!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); VBOX_RELEASE(storageController);
continue; continue;
} }
...@@ -5996,6 +6005,13 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr def, ...@@ -5996,6 +6005,13 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr def,
/* skip empty removable disk */ /* skip empty removable disk */
if (!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); VBOX_RELEASE(storageController);
continue; continue;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册