mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-30 09:53:10 +00:00
domain_conf: Validate redirdev after parsing
There's currently just one limitation: redirdevs that want to go on USB bus require a USB controller, surprisingly. At the same time, since I'm using virDomainDefHasUSB() in this new validator function, it has to be moved a few lines up and also its header needed to be changed a bit: it is now taking a const pointer to domain def since it's not changing anything in there. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
b7c70a0ba0
commit
9f20b3b45e
@ -4576,14 +4576,47 @@ virDomainDiskDefValidate(const virDomainDiskDef *disk)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
virDomainDefHasUSB(const virDomainDef *def)
|
||||||
|
{
|
||||||
|
size_t 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 int
|
||||||
|
virDomainRedirdevDefValidate(const virDomainDef *def,
|
||||||
|
const virDomainRedirdevDef *redirdev)
|
||||||
|
{
|
||||||
|
if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB &&
|
||||||
|
!virDomainDefHasUSB(def)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("cannot add redirected USB device: "
|
||||||
|
"USB is disabled for this domain"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
||||||
const virDomainDef *def ATTRIBUTE_UNUSED)
|
const virDomainDef *def)
|
||||||
{
|
{
|
||||||
switch ((virDomainDeviceType) dev->type) {
|
switch ((virDomainDeviceType) dev->type) {
|
||||||
case VIR_DOMAIN_DEVICE_DISK:
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
return virDomainDiskDefValidate(dev->data.disk);
|
return virDomainDiskDefValidate(dev->data.disk);
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DEVICE_REDIRDEV:
|
||||||
|
return virDomainRedirdevDefValidate(def, dev->data.redirdev);
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_LEASE:
|
case VIR_DOMAIN_DEVICE_LEASE:
|
||||||
case VIR_DOMAIN_DEVICE_FS:
|
case VIR_DOMAIN_DEVICE_FS:
|
||||||
case VIR_DOMAIN_DEVICE_NET:
|
case VIR_DOMAIN_DEVICE_NET:
|
||||||
@ -4595,7 +4628,6 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
|||||||
case VIR_DOMAIN_DEVICE_CONTROLLER:
|
case VIR_DOMAIN_DEVICE_CONTROLLER:
|
||||||
case VIR_DOMAIN_DEVICE_GRAPHICS:
|
case VIR_DOMAIN_DEVICE_GRAPHICS:
|
||||||
case VIR_DOMAIN_DEVICE_HUB:
|
case VIR_DOMAIN_DEVICE_HUB:
|
||||||
case VIR_DOMAIN_DEVICE_REDIRDEV:
|
|
||||||
case VIR_DOMAIN_DEVICE_SMARTCARD:
|
case VIR_DOMAIN_DEVICE_SMARTCARD:
|
||||||
case VIR_DOMAIN_DEVICE_CHR:
|
case VIR_DOMAIN_DEVICE_CHR:
|
||||||
case VIR_DOMAIN_DEVICE_MEMBALLOON:
|
case VIR_DOMAIN_DEVICE_MEMBALLOON:
|
||||||
@ -17070,14 +17102,6 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
if (!redirdev)
|
if (!redirdev)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB && usb_none) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("Can't add redirected USB device: "
|
|
||||||
"USB is disabled for this domain"));
|
|
||||||
virDomainRedirdevDefFree(redirdev);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
def->redirdevs[def->nredirdevs++] = redirdev;
|
def->redirdevs[def->nredirdevs++] = redirdev;
|
||||||
}
|
}
|
||||||
VIR_FREE(nodes);
|
VIR_FREE(nodes);
|
||||||
@ -23590,20 +23614,6 @@ virDomainObjFormat(virDomainXMLOptionPtr xmlopt,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
virDomainDefHasUSB(virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
size_t 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
|
static bool
|
||||||
virDomainDeviceIsUSB(virDomainDeviceDefPtr dev)
|
virDomainDeviceIsUSB(virDomainDeviceDefPtr dev)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user