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. --- Diff to v2: - split out USB device checking to a separate function - made virDomainDefHasUSB static as it's not used outside of domain_conf.c --- src/conf/domain_conf.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 3 ++ src/libvirt_private.syms | 1 + 3 files changed, 56 insertions(+), 0 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cf3b1c4..b980e60 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13265,6 +13265,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) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 203eebf..1c2b76b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1971,6 +1971,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, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 734c881..24a36b9 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -281,6 +281,7 @@ virDomainDefAddImplicitControllers; virDomainDefCheckABIStability; virDomainDefClearDeviceAliases; virDomainDefClearPCIAddresses; +virDomainDefCompatibleDevice; virDomainDefFormat; virDomainDefFormatInternal; virDomainDefFree; -- 1.7.8.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list