From nobody Fri May 3 10:05:39 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) client-ip=209.132.183.24; envelope-from=libvir-list-bounces@redhat.com; helo=mx3-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by mx.zohomail.com with SMTPS id 1489068800204796.8780886374167; Thu, 9 Mar 2017 06:13:20 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v29E9vjx000316; Thu, 9 Mar 2017 09:09:57 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v29E9uuK016526 for ; Thu, 9 Mar 2017 09:09:56 -0500 Received: from antique-work.brq.redhat.com (dhcp129-175.brq.redhat.com [10.34.129.175]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v29E9t7Y024799 for ; Thu, 9 Mar 2017 09:09:55 -0500 From: Pavel Hrdina To: libvir-list@redhat.com Date: Thu, 9 Mar 2017 15:09:54 +0100 Message-Id: X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2] Revert "conf: move iothread XML validation from qemu_command" X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This reverts commit c96bd78e4e71c799dc391566fa9f0652dec55dca. So our code is one big mess and we modify domain definition while building qemu_command line and our hotplug code share only part of the parsing and command line building code. Let's revert that change because to fix it properly would require refactor and move a lot of things. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D1430275 --- src/conf/domain_conf.c | 62 ++------------------------------ src/qemu/qemu_command.c | 96 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 99 insertions(+), 59 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a58f997621..569becb99d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4737,8 +4737,7 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDis= kBus bus, =20 =20 static int -virDomainDiskDefValidate(const virDomainDef *def, - const virDomainDiskDef *disk) +virDomainDiskDefValidate(const virDomainDiskDef *disk) { /* Validate LUN configuration */ if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_LUN) { @@ -4768,24 +4767,6 @@ virDomainDiskDefValidate(const virDomainDef *def, return -1; } =20 - if (disk->iothread > 0) { - if (disk->bus !=3D VIR_DOMAIN_DISK_BUS_VIRTIO || - (disk->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && - disk->info.type !=3D 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; } =20 @@ -4837,47 +4818,12 @@ virDomainNetDefValidate(const virDomainNetDef *net) =20 =20 static int -virDomainControllerDefValidate(const virDomainDef *def, - const virDomainControllerDef *cont) -{ - if (cont->iothread > 0) { - if (cont->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI || - cont->model !=3D 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 !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && - cont->info.type !=3D 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 virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, const virDomainDef *def) { switch ((virDomainDeviceType) dev->type) { case VIR_DOMAIN_DEVICE_DISK: - return virDomainDiskDefValidate(def, dev->data.disk); + return virDomainDiskDefValidate(dev->data.disk); =20 case VIR_DOMAIN_DEVICE_REDIRDEV: return virDomainRedirdevDefValidate(def, dev->data.redirdev); @@ -4885,9 +4831,6 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_NET: return virDomainNetDefValidate(dev->data.net); =20 - case VIR_DOMAIN_DEVICE_CONTROLLER: - return virDomainControllerDefValidate(def, dev->data.controller); - case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: @@ -4895,6 +4838,7 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_VIDEO: case VIR_DOMAIN_DEVICE_HOSTDEV: case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_CONTROLLER: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_HUB: case VIR_DOMAIN_DEVICE_SMARTCARD: diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6545a93259..145a0127f2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1871,6 +1871,49 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, } =20 =20 +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 !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + disk->info.type !=3D 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 * qemuBuildDriveDevStr(const virDomainDef *def, virDomainDiskDefPtr disk, @@ -1889,6 +1932,9 @@ qemuBuildDriveDevStr(const virDomainDef *def, if (!qemuCheckCCWS390AddressSupport(def, disk->info, qemuCaps, disk->d= st)) goto error; =20 + if (disk->iothread && !qemuCheckIOThreads(def, disk)) + goto error; + switch (disk->bus) { case VIR_DOMAIN_DISK_BUS_IDE: if (disk->info.addr.drive.target !=3D 0) { @@ -2521,6 +2567,52 @@ qemuBuildUSBControllerDevStr(virDomainControllerDefP= tr def, } =20 =20 +/* 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 controll= er; + * 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 !=3D 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 !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + def->info.type !=3D 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 iothread= id"), + def->iothread); + return false; + } + + return true; +} + + char * qemuBuildControllerDevStr(const virDomainDef *domainDef, virDomainControllerDefPtr def, @@ -2571,6 +2663,8 @@ qemuBuildControllerDevStr(const virDomainDef *domainD= ef, if (def->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { virBufferAddLit(&buf, "virtio-scsi-ccw"); if (def->iothread) { + if (!qemuCheckSCSIControllerIOThreads(domainDef, def)) + goto error; virBufferAsprintf(&buf, ",iothread=3Diothread%u", def->iothread); } @@ -2583,6 +2677,8 @@ qemuBuildControllerDevStr(const virDomainDef *domainD= ef, } else { virBufferAddLit(&buf, "virtio-scsi-pci"); if (def->iothread) { + if (!qemuCheckSCSIControllerIOThreads(domainDef, def)) + goto error; virBufferAsprintf(&buf, ",iothread=3Diothread%u", def->iothread); } --=20 2.12.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list