On 10/24/2017 03:35 PM, Dawid Zamirski wrote:
> This patch adds <address> element to each <disk> device since device
> names alone won't adequately reflect the storage device layout in the
> VM. With this patch, the ouput produced by dumpxml will faithfully
> reproduce the storage layout of the VM if used with define.
> ---
> src/vbox/vbox_common.c | 79 +++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 68 insertions(+), 11 deletions(-)
>
This one seems OK, but I didn't think long about it. I'll look again
when the v3 is posted.
What I'll also ask is that when v3 hits, please be sure to create a
docs/news.xml article that briefly describes some of the fixes you've
made in this series that would go into the next release.
Tks -
John
> diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> index d1d8804c7..95d35631f 100644
> --- a/src/vbox/vbox_common.c
> +++ b/src/vbox/vbox_common.c
> @@ -3211,8 +3211,9 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> PRBool readOnly;
> nsresult rc;
> virDomainDiskDefPtr disk = NULL;
> + virDomainControllerDefPtr ctrl = NULL;
> char *mediumLocUtf8 = NULL;
> - size_t sdCount = 0, i;
> + size_t sdCount = 0, i, j;
> int ret = -1;
>
> def->ndisks = 0;
> @@ -3353,26 +3354,83 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
> goto cleanup;
> }
>
> - if (storageBus == StorageBus_IDE) {
> + disk->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
> + disk->info.addr.drive.bus = 0;
> + disk->info.addr.drive.unit = devicePort;
> +
> + switch ((enum StorageBus) storageBus) {
> + case StorageBus_IDE:
> disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
> - } else if (storageBus == StorageBus_SATA) {
> - sdCount++;
> + disk->info.addr.drive.bus = devicePort; /* primary, secondary */
> + disk->info.addr.drive.unit = deviceSlot; /* master, slave */
> +
> + break;
> + case StorageBus_SATA:
> disk->bus = VIR_DOMAIN_DISK_BUS_SATA;
> - } else if (storageBus == StorageBus_SCSI ||
> - storageBus == StorageBus_SAS) {
> sdCount++;
> +
> + break;
> + case StorageBus_SCSI:
> + case StorageBus_SAS:
> disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
> - } else if (storageBus == StorageBus_Floppy) {
> + sdCount++;
> +
> + /* In vbox, if there's a disk attached to SAS controller, there will
> + * be libvirt SCSI controller present with model "lsi1068", and we
> + * need to find its index
> + */
> + for (j = 0; j < def->ncontrollers; j++) {
> + ctrl = def->controllers[j];
> +
> + if (ctrl->type != VIR_DOMAIN_CONTROLLER_TYPE_SCSI)
> + continue;
> +
> + if (storageBus == StorageBus_SAS &&
> + ctrl->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068) {
> + disk->info.addr.drive.controller = ctrl->idx;
> + break;
> + }
> +
> + if (storageBus == StorageBus_SCSI &&
> + ctrl->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068) {
> + disk->info.addr.drive.controller = ctrl->idx;
> + break;
> + }
> + }
> +
> + break;
> + case StorageBus_Floppy:
> disk->bus = VIR_DOMAIN_DISK_BUS_FDC;
> +
> + break;
> + case StorageBus_Null:
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Unsupported null storage bus"));
> + goto cleanup;
> }
>
> - if (deviceType == DeviceType_HardDisk)
> + switch ((enum DeviceType) deviceType) {
> + case DeviceType_HardDisk:
> disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
> - else if (deviceType == DeviceType_Floppy)
> +
> + break;
> + case DeviceType_Floppy:
> disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
> - else if (deviceType == DeviceType_DVD)
> +
> + break;
> + case DeviceType_DVD:
> disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
>
> + break;
> + case DeviceType_Network:
> + case DeviceType_USB:
> + case DeviceType_SharedFolder:
> + case DeviceType_Null:
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unsupported vbox device type: %d"), deviceType);
> + goto cleanup;
> + }
> +
> if (readOnly == PR_TRUE)
> disk->src->readonly = true;
>
> @@ -4098,7 +4156,6 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> goto cleanup;
> if (vboxDumpStorageControllers(def, machine) < 0)
> goto cleanup;
> -
> if (vboxDumpDisks(def, data, machine) < 0)
> goto cleanup;
>
>
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list