[libvirt] [PATCHv2 3/6] domain_conf: Add helpers to verify if device configuration is valid
Daniel P. Berrange
berrange at redhat.com
Wed Jul 18 21:43:02 UTC 2012
On Thu, Jul 12, 2012 at 11:30:57AM +0200, Peter Krempa wrote:
> 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 | 43 +++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 5 +++++
> src/libvirt_private.syms | 2 ++
> 3 files changed, 50 insertions(+), 0 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index e38cdfe..cb56f50 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -13263,6 +13263,49 @@ error:
> return NULL;
> }
>
> +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;
> +}
> +
> +int
> +virDomainDefCompatibleDevice(virDomainDefPtr def,
> + virDomainDeviceDefPtr dev)
> +{
> + int t = dev->type;
> + if (!virDomainDefHasUSB(def) &&
> + ((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))) {
This big check is a little hairy. I suggest you create a
bool virDomainDeviceDefIsUSB(virDomainDeviceDefPtr dev)
{
....
}
then you can just do
if (virDomainDeviceDefIsUSB(dev) &&
!virDomainDefHasUSB(dev))
> + virDomainReportError(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 d02695d..557bffa 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1971,6 +1971,11 @@ int virDomainDefFormatInternal(virDomainDefPtr def,
> unsigned int flags,
> virBufferPtr buf);
>
> +bool virDomainDefHasUSB(virDomainDefPtr def);
> +
> +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 b173590..6d748b4 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -278,9 +278,11 @@ virDomainDefAddImplicitControllers;
> virDomainDefCheckABIStability;
> virDomainDefClearDeviceAliases;
> virDomainDefClearPCIAddresses;
> +virDomainDefCompatibleDevice;
> virDomainDefFormat;
> virDomainDefFormatInternal;
> virDomainDefFree;
> +virDomainDefHasUSB;
> virDomainDefParseFile;
> virDomainDefParseNode;
> virDomainDefParseString;
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list