From nobody Sun Feb 8 17:36:42 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1607710565; cv=none; d=zohomail.com; s=zohoarc; b=hg2pFL1XUWY1FJdq0RvlRVwnz8cHltl7KnPXHoj4xx02ndJIO61463Kzmg8uyc0bk3abcL8q15bhiAzSmCigSg7spJtNZbvlUkASXneoGp1cXEUuQdOG2p3qQFLWRQh0xg+y90lnj4T3EV+oxhWxfxBzqAK+6+mOna36ar/m6fM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607710565; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oEfZJ/oUXd6V90VzKaY746QT3OS4TULWg98CshRyOq4=; b=FNcNSoUz9EDcnSqj7QVKpQmVGLNo+1PKEcoaQTrOPPPR59nXcXVOotr/u052KLvghQtfMHgxv6MBht7uRFvXgaakjScQ6AwpTnozVtrlVvxWvGdV3wARnTMebZEhat6+5lsBrOx7LxUVFk0HABpQiCESl9H1kgF9QKwB4y+68s8= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1607710565880603.9196187889813; Fri, 11 Dec 2020 10:16:05 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-254-ODxPACKfOoidWqhNcnD7uw-1; Fri, 11 Dec 2020 13:05:57 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CD06CC73A0; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 402C310023B9; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 09B331809CA3; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 0BBI5Ym5027526 for ; Fri, 11 Dec 2020 13:05:34 -0500 Received: by smtp.corp.redhat.com (Postfix) id A417A115D7BD; Fri, 11 Dec 2020 18:05:34 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9FA2F115D7BA for ; Fri, 11 Dec 2020 18:05:32 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 40DDD858284 for ; Fri, 11 Dec 2020 18:05:32 +0000 (UTC) Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.50]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-353-EasDMpUgMgi1SS48n82AHw-1; Fri, 11 Dec 2020 13:05:30 -0500 Received: by mail-qv1-f50.google.com with SMTP id 4so4601946qvh.1 for ; Fri, 11 Dec 2020 10:05:29 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c6:9e32:a7fb:6602:e8c2:3c0f]) by smtp.gmail.com with ESMTPSA id y6sm7585703qkj.60.2020.12.11.10.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Dec 2020 10:05:28 -0800 (PST) X-MC-Unique: ODxPACKfOoidWqhNcnD7uw-1 X-MC-Unique: EasDMpUgMgi1SS48n82AHw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oEfZJ/oUXd6V90VzKaY746QT3OS4TULWg98CshRyOq4=; b=Jy39SIkSAJF4IztnDQlknpwCaDbz0CBKjcOLCE3JBqgYoEkL19S7ZDtFW/wTpWnRCh lxdzLEWq+3Ik4bh1cZit2hWmFaXkbqbom01VDQcwAhywQRYGmtTYu/Sm75/ipDKUbiVF fpgzHGxca9mDAhkZoe7ZR619m9CtMon+OYqevUxpSOy77N9YqT919nY/DQvSbNoeGBkm Kd7o4b1llOcKMollmDkDBc4uebR81GWET4JGPMBx06Ftf88S+/eX++K4LwCmDGJVESxf 9FHQgXEv7JoOGpXGkp5LcnCNCQxDnPKfRuvmg57wXPC00vBXFbKEKy1LaAWLRVbl0ta6 JaNg== X-Gm-Message-State: AOAM533eW/JBaow3rOb7l0+3SLiDySvxLLXi7xayZx+8baV4oYXLVio9 3HBHnfsiP+Tz3RL5mfGHE0mChjdshUk= X-Google-Smtp-Source: ABdhPJwlYPqzrPm216A6KfGSlsSbOC4q0uGk5RUWa9odCdEdcssUW3W7YL+RaelDWgzpGkjnzxbTsg== X-Received: by 2002:a0c:ba8c:: with SMTP id x12mr17273428qvf.15.1607709928983; Fri, 11 Dec 2020 10:05:28 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 01/12] domain_conf: move duplicate check functions to domain_validate.c Date: Fri, 11 Dec 2020 15:05:05 -0300 Message-Id: <20201211180516.1952683-2-danielhb413@gmail.com> In-Reply-To: <20201211180516.1952683-1-danielhb413@gmail.com> References: <20201211180516.1952683-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" virDomainDefCheckDuplicateDiskInfo() and virDomainDefCheckDuplicateDriveAdd= resses() are static functions used by virDomainDefValidateInternal(). Let's move them to domain_validate.c to start clearing up the path to move virDomainDefValidateInternal(). Change the functions name slightly to be more on par with their new home. Signed-off-by: Daniel Henrique Barboza --- src/conf/domain_conf.c | 129 +------------------------------------ src/conf/domain_conf.h | 5 ++ src/conf/domain_validate.c | 125 +++++++++++++++++++++++++++++++++++ src/conf/domain_validate.h | 2 + 4 files changed, 135 insertions(+), 126 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 23415b323c..0f5d314e2c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4867,7 +4867,7 @@ virDomainDefPostParseGraphics(virDomainDef *def) * Return true if any disk is already using the given address on the * given bus, false otherwise. */ -static bool +bool virDomainDriveAddressIsUsedByDisk(const virDomainDef *def, virDomainDiskBus bus_type, const virDomainDeviceDriveAddress *addr) @@ -6599,129 +6599,6 @@ virDomainDefValidateDeviceIterator(virDomainDefPtr = def, } =20 =20 -static int -virDomainDefCheckDuplicateDiskInfo(const virDomainDef *def) -{ - size_t i; - size_t j; - - for (i =3D 0; i < def->ndisks; i++) { - for (j =3D i + 1; j < def->ndisks; j++) { - if (virDomainDiskDefCheckDuplicateInfo(def->disks[i], - def->disks[j]) < 0) - return -1; - } - } - - return 0; -} - -/** - * virDomainDefCheckDuplicateDriveAddresses: - * @def: domain definition to check against - * - * This function checks @def for duplicate drive addresses. Drive - * addresses are only in use for disks and hostdevs at the moment. - * - * Returns 0 in case of there are no duplicate drive addresses, -1 - * otherwise. - */ -static int -virDomainDefCheckDuplicateDriveAddresses(const virDomainDef *def) -{ - size_t i; - size_t j; - - for (i =3D 0; i < def->ndisks; i++) { - virDomainDiskDefPtr disk_i =3D def->disks[i]; - virDomainDeviceInfoPtr disk_info_i =3D &disk_i->info; - - if (disk_info_i->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) - continue; - - for (j =3D i + 1; j < def->ndisks; j++) { - virDomainDiskDefPtr disk_j =3D def->disks[j]; - virDomainDeviceInfoPtr disk_info_j =3D &disk_j->info; - - if (disk_i->bus !=3D disk_j->bus) - continue; - - if (disk_info_j->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIV= E) - continue; - - if (virDomainDeviceInfoAddressIsEqual(disk_info_i, disk_info_j= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Found duplicate drive address for disk w= ith " - "target name '%s' controller=3D'%u' bus= =3D'%u' " - "target=3D'%u' unit=3D'%u'"), - disk_i->dst, - disk_info_i->addr.drive.controller, - disk_info_i->addr.drive.bus, - disk_info_i->addr.drive.target, - disk_info_i->addr.drive.unit); - return -1; - } - } - - /* Note: There is no need to check for conflicts with SCSI - * hostdevs above, because conflicts with hostdevs are checked - * in the next loop. - */ - } - - for (i =3D 0; i < def->nhostdevs; i++) { - virDomainHostdevDefPtr hdev_i =3D def->hostdevs[i]; - virDomainDeviceInfoPtr hdev_info_i =3D hdev_i->info; - virDomainDeviceDriveAddressPtr hdev_addr_i; - - if (!virHostdevIsSCSIDevice(hdev_i)) - continue; - - if (hdev_i->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) - continue; - - hdev_addr_i =3D &hdev_info_i->addr.drive; - for (j =3D i + 1; j < def->nhostdevs; j++) { - virDomainHostdevDefPtr hdev_j =3D def->hostdevs[j]; - virDomainDeviceInfoPtr hdev_info_j =3D hdev_j->info; - - if (!virHostdevIsSCSIDevice(hdev_j)) - continue; - - /* Address type check for hdev_j will be done implicitly - * in virDomainDeviceInfoAddressIsEqual() */ - - if (virDomainDeviceInfoAddressIsEqual(hdev_info_i, hdev_info_j= )) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("SCSI host address controller=3D'%u' " - "bus=3D'%u' target=3D'%u' unit=3D'%u' in " - "use by another SCSI host device"), - hdev_addr_i->bus, - hdev_addr_i->controller, - hdev_addr_i->target, - hdev_addr_i->unit); - return -1; - } - } - - if (virDomainDriveAddressIsUsedByDisk(def, VIR_DOMAIN_DISK_BUS_SCS= I, - hdev_addr_i)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("SCSI host address controller=3D'%u' " - "bus=3D'%u' target=3D'%u' unit=3D'%u' in " - "use by another SCSI disk"), - hdev_addr_i->bus, - hdev_addr_i->controller, - hdev_addr_i->target, - hdev_addr_i->unit); - return -1; - } - } - - return 0; -} - - bool virDomainDefLifecycleActionAllowed(virDomainLifecycle type, virDomainLifecycleAction action) @@ -6899,10 +6776,10 @@ static int virDomainDefValidateInternal(const virDomainDef *def, virDomainXMLOptionPtr xmlopt) { - if (virDomainDefCheckDuplicateDiskInfo(def) < 0) + if (virDomainDefDuplicateDiskInfoValidate(def) < 0) return -1; =20 - if (virDomainDefCheckDuplicateDriveAddresses(def) < 0) + if (virDomainDefDuplicateDriveAddressesValidate(def) < 0) return -1; =20 if (virDomainDefGetVcpusTopology(def, NULL) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 72771c46b9..71e42d6617 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3915,6 +3915,11 @@ bool virDomainBlockIoTuneInfoEqual(const virDomainBlockIoTuneInfo *a, const virDomainBlockIoTuneInfo *b); =20 +bool +virDomainDriveAddressIsUsedByDisk(const virDomainDef *def, + virDomainDiskBus bus_type, + const virDomainDeviceDriveAddress *addr); + bool virHostdevIsSCSIDevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 0eed1ba982..8bbd60c836 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -635,3 +635,128 @@ virDomainDefIdMapValidate(const virDomainDef *def) =20 return 0; } + + +int +virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def) +{ + size_t i; + size_t j; + + for (i =3D 0; i < def->ndisks; i++) { + for (j =3D i + 1; j < def->ndisks; j++) { + if (virDomainDiskDefCheckDuplicateInfo(def->disks[i], + def->disks[j]) < 0) + return -1; + } + } + + return 0; +} + + + +/** + * virDomainDefDuplicateDriveAddressesValidate: + * @def: domain definition to check against + * + * This function checks @def for duplicate drive addresses. Drive + * addresses are only in use for disks and hostdevs at the moment. + * + * Returns 0 in case of there are no duplicate drive addresses, -1 + * otherwise. + */ +int +virDomainDefDuplicateDriveAddressesValidate(const virDomainDef *def) +{ + size_t i; + size_t j; + + for (i =3D 0; i < def->ndisks; i++) { + virDomainDiskDefPtr disk_i =3D def->disks[i]; + virDomainDeviceInfoPtr disk_info_i =3D &disk_i->info; + + if (disk_info_i->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) + continue; + + for (j =3D i + 1; j < def->ndisks; j++) { + virDomainDiskDefPtr disk_j =3D def->disks[j]; + virDomainDeviceInfoPtr disk_info_j =3D &disk_j->info; + + if (disk_i->bus !=3D disk_j->bus) + continue; + + if (disk_info_j->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIV= E) + continue; + + if (virDomainDeviceInfoAddressIsEqual(disk_info_i, disk_info_j= )) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Found duplicate drive address for disk w= ith " + "target name '%s' controller=3D'%u' bus= =3D'%u' " + "target=3D'%u' unit=3D'%u'"), + disk_i->dst, + disk_info_i->addr.drive.controller, + disk_info_i->addr.drive.bus, + disk_info_i->addr.drive.target, + disk_info_i->addr.drive.unit); + return -1; + } + } + + /* Note: There is no need to check for conflicts with SCSI + * hostdevs above, because conflicts with hostdevs are checked + * in the next loop. + */ + } + + for (i =3D 0; i < def->nhostdevs; i++) { + virDomainHostdevDefPtr hdev_i =3D def->hostdevs[i]; + virDomainDeviceInfoPtr hdev_info_i =3D hdev_i->info; + virDomainDeviceDriveAddressPtr hdev_addr_i; + + if (!virHostdevIsSCSIDevice(hdev_i)) + continue; + + if (hdev_i->info->type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) + continue; + + hdev_addr_i =3D &hdev_info_i->addr.drive; + for (j =3D i + 1; j < def->nhostdevs; j++) { + virDomainHostdevDefPtr hdev_j =3D def->hostdevs[j]; + virDomainDeviceInfoPtr hdev_info_j =3D hdev_j->info; + + if (!virHostdevIsSCSIDevice(hdev_j)) + continue; + + /* Address type check for hdev_j will be done implicitly + * in virDomainDeviceInfoAddressIsEqual() */ + + if (virDomainDeviceInfoAddressIsEqual(hdev_info_i, hdev_info_j= )) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("SCSI host address controller=3D'%u' " + "bus=3D'%u' target=3D'%u' unit=3D'%u' in " + "use by another SCSI host device"), + hdev_addr_i->bus, + hdev_addr_i->controller, + hdev_addr_i->target, + hdev_addr_i->unit); + return -1; + } + } + + if (virDomainDriveAddressIsUsedByDisk(def, VIR_DOMAIN_DISK_BUS_SCS= I, + hdev_addr_i)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("SCSI host address controller=3D'%u' " + "bus=3D'%u' target=3D'%u' unit=3D'%u' in " + "use by another SCSI disk"), + hdev_addr_i->bus, + hdev_addr_i->controller, + hdev_addr_i->target, + hdev_addr_i->unit); + return -1; + } + } + + return 0; +} diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h index 497a02b9b3..1f1a5b1bd1 100644 --- a/src/conf/domain_validate.h +++ b/src/conf/domain_validate.h @@ -45,3 +45,5 @@ int virDomainSmartcardDefValidate(const virDomainSmartcar= dDef *smartcard, int virDomainDefTunablesValidate(const virDomainDef *def); int virDomainControllerDefValidate(const virDomainControllerDef *controlle= r); int virDomainDefIdMapValidate(const virDomainDef *def); +int virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def); +int virDomainDefDuplicateDriveAddressesValidate(const virDomainDef *def); --=20 2.26.2