[libvirt] [PATCH v2 15/15] vbox: Generate disk address element in dumpxml

Dawid Zamirski posted 15 patches 7 years, 6 months ago
There is a newer version of this series
[libvirt] [PATCH v2 15/15] vbox: Generate disk address element in dumpxml
Posted by Dawid Zamirski 7 years, 6 months ago
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(-)

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;
 
-- 
2.14.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 15/15] vbox: Generate disk address element in dumpxml
Posted by John Ferlan 7 years, 6 months ago

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