[PATCH 02/11] virDomainHostdevDefFormatSubsys: Split out formatting of USB subsystem

Peter Krempa pkrempa at redhat.com
Tue Jul 14 18:00:07 UTC 2020


Separate out bits related to USB so that the logic isn't entangled in
multiple conditional statements.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/conf/domain_conf.c | 73 +++++++++++++++++++++++++++++-------------
 1 file changed, 51 insertions(+), 22 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4b1f27fcea..7718a59c66 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -26023,6 +26023,40 @@ virDomainNetIPInfoFormat(virBufferPtr buf,
 }


+static void
+virDomainHostdevDefFormatSubsysUSB(virBufferPtr buf,
+                                   virDomainHostdevDefPtr def,
+                                   unsigned int flags,
+                                   bool includeTypeInAddr)
+{
+    g_auto(virBuffer) sourceAttrBuf = VIR_BUFFER_INITIALIZER;
+    g_auto(virBuffer) sourceChildBuf = VIR_BUFFER_INIT_CHILD(buf);
+    virDomainHostdevSubsysUSBPtr usbsrc = &def->source.subsys.u.usb;
+
+    if (def->startupPolicy)
+        virBufferAsprintf(&sourceAttrBuf, " startupPolicy='%s'",
+                          virDomainStartupPolicyTypeToString(def->startupPolicy));
+
+    if (usbsrc->autoAddress && (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))
+        virBufferAddLit(&sourceAttrBuf, " autoAddress='yes'");
+
+    if (def->missing && !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))
+        virBufferAddLit(&sourceAttrBuf, " missing='yes'");
+
+    if (usbsrc->vendor) {
+        virBufferAsprintf(&sourceChildBuf, "<vendor id='0x%.4x'/>\n", usbsrc->vendor);
+        virBufferAsprintf(&sourceChildBuf, "<product id='0x%.4x'/>\n", usbsrc->product);
+    }
+
+    if (usbsrc->bus || usbsrc->device)
+        virBufferAsprintf(&sourceChildBuf, "<address %sbus='%d' device='%d'/>\n",
+                          includeTypeInAddr ? "type='usb' " : "",
+                          usbsrc->bus, usbsrc->device);
+
+    virXMLFormatElement(buf, "source", &sourceAttrBuf, &sourceChildBuf);
+}
+
+
 static int
 virDomainHostdevDefFormatSubsys(virBufferPtr buf,
                                 virDomainHostdevDefPtr def,
@@ -26033,7 +26067,6 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
     g_auto(virBuffer) sourceAttrBuf = VIR_BUFFER_INITIALIZER;
     g_auto(virBuffer) sourceChildBuf = VIR_BUFFER_INIT_CHILD(buf);
     g_auto(virBuffer) origstatesChildBuf = VIR_BUFFER_INIT_CHILD(&sourceChildBuf);
-    virDomainHostdevSubsysUSBPtr usbsrc = &def->source.subsys.u.usb;
     virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
     virDomainHostdevSubsysSCSIPtr scsisrc = &def->source.subsys.u.scsi;
     virDomainHostdevSubsysSCSIVHostPtr hostsrc = &def->source.subsys.u.scsi_host;
@@ -26041,6 +26074,23 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
     virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
     virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;

+    switch ((virDomainHostdevSubsysType) def->source.subsys.type) {
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
+        virDomainHostdevDefFormatSubsysUSB(buf, def, flags, includeTypeInAddr);
+        return 0;
+
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+        break;
+
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
+    default:
+        virReportEnumRangeError(virDomainHostdevSubsysType, def->source.subsys.type);
+        return -1;
+    }
+
     if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
         pcisrc->backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) {
         const char *backend =
@@ -26055,18 +26105,6 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
         virBufferAsprintf(buf, "<driver name='%s'/>\n", backend);
     }

-    if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
-        if (def->startupPolicy) {
-            const char *policy;
-            policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
-            virBufferAsprintf(&sourceAttrBuf, " startupPolicy='%s'", policy);
-        }
-        if (usbsrc->autoAddress && (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))
-            virBufferAddLit(&sourceAttrBuf, " autoAddress='yes'");
-
-        if (def->missing && !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))
-            virBufferAddLit(&sourceAttrBuf, " missing='yes'");
-    }

     if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
         scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
@@ -26087,15 +26125,6 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,

     switch (def->source.subsys.type) {
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
-        if (usbsrc->vendor) {
-            virBufferAsprintf(&sourceChildBuf, "<vendor id='0x%.4x'/>\n", usbsrc->vendor);
-            virBufferAsprintf(&sourceChildBuf, "<product id='0x%.4x'/>\n", usbsrc->product);
-        }
-        if (usbsrc->bus || usbsrc->device) {
-            virBufferAsprintf(&sourceChildBuf, "<address %sbus='%d' device='%d'/>\n",
-                              includeTypeInAddr ? "type='usb' " : "",
-                              usbsrc->bus, usbsrc->device);
-        }
         break;
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
         virPCIDeviceAddressFormat(&sourceChildBuf, pcisrc->addr,
-- 
2.26.2




More information about the libvir-list mailing list