提交 c96bd78e 编写于 作者: P Pavel Hrdina

conf: move iothread XML validation from qemu_command

This will ensure that IOThreads are properly validated while
a domain is defined.
Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
上级 5b37115c
...@@ -4737,7 +4737,8 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus, ...@@ -4737,7 +4737,8 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus,
static int static int
virDomainDiskDefValidate(const virDomainDiskDef *disk) virDomainDiskDefValidate(const virDomainDef *def,
const virDomainDiskDef *disk)
{ {
/* Validate LUN configuration */ /* Validate LUN configuration */
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
...@@ -4767,6 +4768,24 @@ virDomainDiskDefValidate(const virDomainDiskDef *disk) ...@@ -4767,6 +4768,24 @@ virDomainDiskDefValidate(const virDomainDiskDef *disk)
return -1; return -1;
} }
if (disk->iothread > 0) {
if (disk->bus != VIR_DOMAIN_DISK_BUS_VIRTIO ||
(disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("IOThreads are only available for virtio pci and "
"virtio ccw disk"));
return -1;
}
if (!virDomainIOThreadIDFind(def, disk->iothread)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Invalid IOThread id '%u' for disk '%s'"),
disk->iothread, disk->dst);
return -1;
}
}
return 0; return 0;
} }
...@@ -4817,13 +4836,48 @@ virDomainNetDefValidate(const virDomainNetDef *net) ...@@ -4817,13 +4836,48 @@ virDomainNetDefValidate(const virDomainNetDef *net)
} }
static int
virDomainControllerDefValidate(const virDomainDef *def,
const virDomainControllerDef *cont)
{
if (cont->iothread > 0) {
if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_SCSI ||
cont->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("IOThreads are only supported for virtio-scsi "
"controllers, model is '%s'"),
virDomainControllerModelSCSITypeToString(cont->model));
return -1;
}
if (cont->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
cont->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("IOThreads are only available for virtio pci and "
"virtio ccw controllers"));
return -1;
}
if (!virDomainIOThreadIDFind(def, cont->iothread)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Invalid IOThread id '%u' for controller '%s'"),
cont->iothread,
virDomainControllerTypeToString(cont->type));
return -1;
}
}
return 0;
}
static int static int
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
const virDomainDef *def) 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(def, dev->data.disk);
case VIR_DOMAIN_DEVICE_REDIRDEV: case VIR_DOMAIN_DEVICE_REDIRDEV:
return virDomainRedirdevDefValidate(def, dev->data.redirdev); return virDomainRedirdevDefValidate(def, dev->data.redirdev);
...@@ -4831,6 +4885,9 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, ...@@ -4831,6 +4885,9 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
case VIR_DOMAIN_DEVICE_NET: case VIR_DOMAIN_DEVICE_NET:
return virDomainNetDefValidate(dev->data.net); return virDomainNetDefValidate(dev->data.net);
case VIR_DOMAIN_DEVICE_CONTROLLER:
return virDomainControllerDefValidate(def, dev->data.controller);
case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_LEASE:
case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_FS:
case VIR_DOMAIN_DEVICE_INPUT: case VIR_DOMAIN_DEVICE_INPUT:
...@@ -4838,7 +4895,6 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, ...@@ -4838,7 +4895,6 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
case VIR_DOMAIN_DEVICE_VIDEO: case VIR_DOMAIN_DEVICE_VIDEO:
case VIR_DOMAIN_DEVICE_HOSTDEV: case VIR_DOMAIN_DEVICE_HOSTDEV:
case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_WATCHDOG:
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_SMARTCARD: case VIR_DOMAIN_DEVICE_SMARTCARD:
......
...@@ -1877,49 +1877,6 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, ...@@ -1877,49 +1877,6 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
} }
static bool
qemuCheckIOThreads(const virDomainDef *def,
virDomainDiskDefPtr disk)
{
/* Right "type" of disk" */
switch ((virDomainDiskBus)disk->bus) {
case VIR_DOMAIN_DISK_BUS_VIRTIO:
if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("IOThreads only available for virtio pci and "
"virtio ccw disk"));
return false;
}
break;
case VIR_DOMAIN_DISK_BUS_IDE:
case VIR_DOMAIN_DISK_BUS_FDC:
case VIR_DOMAIN_DISK_BUS_SCSI:
case VIR_DOMAIN_DISK_BUS_XEN:
case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_UML:
case VIR_DOMAIN_DISK_BUS_SATA:
case VIR_DOMAIN_DISK_BUS_SD:
case VIR_DOMAIN_DISK_BUS_LAST:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("IOThreads not available for bus %s target %s"),
virDomainDiskBusTypeToString(disk->bus), disk->dst);
return false;
}
/* Can we find the disk iothread in the iothreadid list? */
if (!virDomainIOThreadIDFind(def, disk->iothread)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Disk iothread '%u' not defined in iothreadid"),
disk->iothread);
return false;
}
return true;
}
char * char *
qemuBuildDriveDevStr(const virDomainDef *def, qemuBuildDriveDevStr(const virDomainDef *def,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
...@@ -1938,9 +1895,6 @@ qemuBuildDriveDevStr(const virDomainDef *def, ...@@ -1938,9 +1895,6 @@ qemuBuildDriveDevStr(const virDomainDef *def,
if (!qemuCheckCCWS390AddressSupport(def, disk->info, qemuCaps, disk->dst)) if (!qemuCheckCCWS390AddressSupport(def, disk->info, qemuCaps, disk->dst))
goto error; goto error;
if (disk->iothread && !qemuCheckIOThreads(def, disk))
goto error;
switch (disk->bus) { switch (disk->bus) {
case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_IDE:
if (disk->info.addr.drive.target != 0) { if (disk->info.addr.drive.target != 0) {
...@@ -2573,52 +2527,6 @@ qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def, ...@@ -2573,52 +2527,6 @@ qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def,
} }
/* qemuCheckSCSIControllerIOThreads:
* @domainDef: Pointer to domain def
* @def: Pointer to controller def
* @qemuCaps: Capabilities
*
* If this controller definition has iothreads set, let's make sure the
* configuration is right before adding to the command line
*
* Returns true if either supported or there are no iothreads for controller;
* otherwise, returns false if configuration is not quite right.
*/
static bool
qemuCheckSCSIControllerIOThreads(const virDomainDef *domainDef,
virDomainControllerDefPtr def)
{
if (!def->iothread)
return true;
if (def->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("IOThreads only supported for virtio-scsi "
"controllers model is '%s'"),
virDomainControllerModelSCSITypeToString(def->model));
return false;
}
if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("IOThreads only available for virtio pci and "
"virtio ccw controllers"));
return false;
}
/* Can we find the controller iothread in the iothreadid list? */
if (!virDomainIOThreadIDFind(domainDef, def->iothread)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("controller iothread '%u' not defined in iothreadid"),
def->iothread);
return false;
}
return true;
}
char * char *
qemuBuildControllerDevStr(const virDomainDef *domainDef, qemuBuildControllerDevStr(const virDomainDef *domainDef,
virDomainControllerDefPtr def, virDomainControllerDefPtr def,
...@@ -2669,8 +2577,6 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, ...@@ -2669,8 +2577,6 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
virBufferAddLit(&buf, "virtio-scsi-ccw"); virBufferAddLit(&buf, "virtio-scsi-ccw");
if (def->iothread) { if (def->iothread) {
if (!qemuCheckSCSIControllerIOThreads(domainDef, def))
goto error;
virBufferAsprintf(&buf, ",iothread=iothread%u", virBufferAsprintf(&buf, ",iothread=iothread%u",
def->iothread); def->iothread);
} }
...@@ -2683,8 +2589,6 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, ...@@ -2683,8 +2589,6 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
} else { } else {
virBufferAddLit(&buf, "virtio-scsi-pci"); virBufferAddLit(&buf, "virtio-scsi-pci");
if (def->iothread) { if (def->iothread) {
if (!qemuCheckSCSIControllerIOThreads(domainDef, def))
goto error;
virBufferAsprintf(&buf, ",iothread=iothread%u", virBufferAsprintf(&buf, ",iothread=iothread%u",
def->iothread); def->iothread);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册