]> xenbits.xensource.com Git - libvirt.git/commitdiff
domain_conf: Add helpers to verify if device configuration is valid
authorPeter Krempa <pkrempa@redhat.com>
Tue, 3 Jul 2012 13:30:25 +0000 (15:30 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 2 Aug 2012 09:54:50 +0000 (11:54 +0200)
This patch adds helpers that validate domain's device configuration.
This will be needed later on to verify devices being hot-plugged to
guests. If the guest has no USB bus, then it's not valid to plug a USB
device to that guest.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 78475414de74700c73f7174a6efd0861428b3a63..43b3f804afdf88918398c8c9112bd2a76e776a4c 100644 (file)
@@ -13266,6 +13266,58 @@ error:
     return NULL;
 }
 
+static bool
+virDomainDefHasUSB(virDomainDefPtr def)
+{
+    int i;
+
+    for (i = 0; i < def->ncontrollers; i++) {
+        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
+            def->controllers[i]->model != VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE)
+            return true;
+    }
+
+    return false;
+}
+
+static bool
+virDomainDeviceIsUSB(virDomainDeviceDefPtr dev)
+{
+    int t = dev->type;
+    if ((t == VIR_DOMAIN_DEVICE_DISK &&
+         dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_USB) ||
+        (t == VIR_DOMAIN_DEVICE_CONTROLLER &&
+         dev->data.controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) ||
+        (t == VIR_DOMAIN_DEVICE_INPUT &&
+         dev->data.input->type == VIR_DOMAIN_INPUT_BUS_USB) ||
+        (t == VIR_DOMAIN_DEVICE_HOSTDEV &&
+         dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+         dev->data.hostdev->source.subsys.type ==
+         VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) ||
+        (t == VIR_DOMAIN_DEVICE_HUB &&
+         dev->data.hub->type == VIR_DOMAIN_HUB_TYPE_USB) ||
+        (t == VIR_DOMAIN_DEVICE_REDIRDEV &&
+         dev->data.redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB))
+        return true;
+
+    return false;
+}
+
+int
+virDomainDefCompatibleDevice(virDomainDefPtr def,
+                             virDomainDeviceDefPtr dev)
+{
+    if (!virDomainDefHasUSB(def) &&
+        virDomainDeviceIsUSB(dev)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("Device configuration is not compatible: "
+                         "Domain has no USB bus support"));
+        return -1;
+    }
+
+    return 0;
+}
+
 int virDomainSaveXML(const char *configDir,
                      virDomainDefPtr def,
                      const char *xml)
index 94525a34a180dc09aa3231c7b44b593ebe8175e5..9fdda785ce3be5eebc66fcdf461247fc9e45ae31 100644 (file)
@@ -1972,6 +1972,9 @@ int virDomainDefFormatInternal(virDomainDefPtr def,
                                unsigned int flags,
                                virBufferPtr buf);
 
+int virDomainDefCompatibleDevice(virDomainDefPtr def,
+                                 virDomainDeviceDefPtr dev);
+
 int virDomainCpuSetParse(const char *str,
                          char sep,
                          char *cpuset,
index ac392fec032ef9f5230a7da2e325c903fb6aaa0a..bb8849b4d5348678353210db72a20102270a25bb 100644 (file)
@@ -281,6 +281,7 @@ virDomainDefAddImplicitControllers;
 virDomainDefCheckABIStability;
 virDomainDefClearDeviceAliases;
 virDomainDefClearPCIAddresses;
+virDomainDefCompatibleDevice;
 virDomainDefFormat;
 virDomainDefFormatInternal;
 virDomainDefFree;