On Thu, Jul 12, 2012 at 11:30:56AM +0200, Peter Krempa wrote: > Libvirt adds a USB controller to the guest even if the user does not > specify any in the XML. This is due to back-compat reasons. > > To allow disabling USB for a guest this patch adds a new USB controller > type "none" that disables USB support for the guest. > --- > docs/schemas/domaincommon.rng | 1 + > src/conf/domain_conf.c | 55 ++++++++++++++++++++++++++++++++++++++++- > src/conf/domain_conf.h | 1 + > src/qemu/qemu_command.c | 3 +- > 4 files changed, 58 insertions(+), 2 deletions(-) Missing addition to docs/formatdomain.html.in > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index b7562ad..c85d763 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -1222,6 +1222,7 @@ > <value>vt82c686b-uhci</value> > <value>pci-ohci</value> > <value>nec-xhci</value> > + <value>none</value> > </choice> > </attribute> > </optional> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 89bae57..e38cdfe 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -258,7 +258,8 @@ VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, > "ich9-uhci3", > "vt82c686b-uhci", > "pci-ohci", > - "nec-xhci") > + "nec-xhci", > + "none") > > VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, > "mount", > @@ -7914,6 +7915,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > virBitmapPtr bootMap = NULL; > unsigned long bootMapSize = 0; > xmlNodePtr cur; > + bool usb_none = false; > + bool usb_other = false; > > if (VIR_ALLOC(def) < 0) { > virReportOOMError(); > @@ -8639,6 +8642,27 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > if (!controller) > goto error; > > + /* sanitize handling of "none" usb controller */ > + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { > + if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { > + if (usb_other || usb_none) { > + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", > + _("Can't add another USB controller: " > + "USB is disabled for this domain")); > + goto error; > + } > + usb_none = true; > + } else { > + if (usb_none) { > + virDomainReportError(VIR_ERR_XML_DETAIL, "%s", > + _("Can't add another USB controller: " > + "USB is disabled for this domain")); > + goto error; > + } > + usb_other = true; > + } > + } > + > virDomainControllerInsertPreAlloced(def, controller); > } > VIR_FREE(nodes); > @@ -8913,6 +8937,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > if (!input) > goto error; > > + /* Check if USB bus is required */ > + if (input->bus == VIR_DOMAIN_INPUT_BUS_USB && usb_none) { > + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("Can't add USB input device. " > + "USB bus is disabled")); > + goto error; > + } > > /* With QEMU / KVM / Xen graphics, mouse + PS/2 is implicit > * with graphics, so don't store it. > @@ -9040,6 +9071,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > if (!hostdev) > goto error; > > + if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB && > + usb_none) { > + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("Can't add USB device passthrough: " > + "USB is disabled in this host")); > + goto error; > + } > + > def->hostdevs[def->nhostdevs++] = hostdev; > } > VIR_FREE(nodes); > @@ -9110,6 +9149,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > if (!hub) > goto error; > > + if (hub->type == VIR_DOMAIN_HUB_TYPE_USB && usb_none) { > + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("Can't add USB hub: " > + "USB is disabled for this domain")); > + goto error; > + } > + > def->hubs[def->nhubs++] = hub; > } > VIR_FREE(nodes); > @@ -9126,6 +9172,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > if (!redirdev) > goto error; > > + if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB && usb_none) { > + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("Can't add USB redir device: " > + "USB is disabled for this domain")); > + goto error; > + } > + > def->redirdevs[def->nredirdevs++] = redirdev; > } > VIR_FREE(nodes); > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 5e5374a..d02695d 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -633,6 +633,7 @@ enum virDomainControllerModelUSB { > VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI, > VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI, > VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI, > + VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE, > > VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST > }; > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index 16fa294..d202425 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -107,7 +107,8 @@ VIR_ENUM_IMPL(qemuControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, > "ich9-usb-uhci3", > "vt82c686b-usb-uhci", > "pci-ohci", > - "nec-usb-xhci"); > + "nec-usb-xhci", > + "none"); > > VIR_ENUM_DECL(qemuDomainFSDriver) > VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST, ACK if you add the docs 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list