From nobody Sun Feb 8 19:59:40 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1702650472020105.92804540634847; Fri, 15 Dec 2023 06:27:52 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id EAEDC1A54; Fri, 15 Dec 2023 09:27:50 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 382471ABA; Fri, 15 Dec 2023 09:20:03 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 2C5CC1A12; Fri, 15 Dec 2023 09:19:29 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 6991219CF for ; Fri, 15 Dec 2023 09:19:28 -0500 (EST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-593-ebrlWojuPM2SOyO_Nf1ldA-1; Fri, 15 Dec 2023 09:19:26 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D587A85A58B for ; Fri, 15 Dec 2023 14:19:25 +0000 (UTC) Received: from maggie.brq.redhat.com (unknown [10.43.3.102]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7EFA3C15A0C for ; Fri, 15 Dec 2023 14:19:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: ebrlWojuPM2SOyO_Nf1ldA-1 From: Michal Privoznik To: devel@lists.libvirt.org Subject: [PATCH 4/4] vmx: Ensure unique disk targets when parsing Date: Fri, 15 Dec 2023 15:19:21 +0100 Message-ID: <0318ea72daa140a1b7d3c356982f964245f0d7e2.1702649888.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: DM6PQRYAXWKXAKUGQ4JW5WIXSYBKPFHM X-Message-ID-Hash: DM6PQRYAXWKXAKUGQ4JW5WIXSYBKPFHM X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8"; x-default="true" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1702650472814100001 When parsing disks from a vmx file, the target name is generated based on disk bus, controller the disk is attached to, and its unit. But in case of SCSI and SATA attached disks this does not guarantee the target name uniqueness. If there are two disks, one attached to scsi.0 and the other to sata.0 both end up with the same "sda" target name. And because of the way their drive address is derived, they end up with the same address too. Try harder to generate an unique disk target. Signed-off-by: Michal Privoznik --- src/vmx/vmx.c | 189 +++++++++++++---------- tests/vmx2xmldata/esx-in-the-wild-12.xml | 4 +- tests/vmx2xmldata/esx-in-the-wild-8.xml | 4 +- 3 files changed, 109 insertions(+), 88 deletions(-) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 399f03b419..7c752c72f9 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2142,105 +2142,126 @@ virXMXGenerateDiskTarget(virDomainDiskDef *def, int controllerOrBus, int unit) { - const char *prefix =3D NULL; - unsigned int idx =3D 0; - - switch (def->bus) { - case VIR_DOMAIN_DISK_BUS_SCSI: - if (controllerOrBus < 0 || controllerOrBus > 3) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SCSI controller index %1$d out of [0..3] ran= ge"), - controllerOrBus); - return -1; - } + unsigned int tries =3D 0; =20 - if (unit < 0 || unit > vmdef->scsiBusMaxUnit || unit =3D=3D 7) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SCSI unit index %1$d out of [0..6,8..%2$u] r= ange"), - unit, vmdef->scsiBusMaxUnit); - return -1; - } + for (tries =3D 0; tries < 10; tries++) { + g_autofree char *dst =3D NULL; + const char *prefix =3D NULL; + unsigned int idx =3D 0; + size_t i; =20 - idx =3D controllerOrBus * 15 + (unit < 7 ? unit : unit - 1); - prefix =3D "sd"; - break; + switch (def->bus) { + case VIR_DOMAIN_DISK_BUS_SCSI: + if (controllerOrBus < 0 || controllerOrBus > 3) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SCSI controller index %1$d out of [0..3]= range"), + controllerOrBus); + return -1; + } =20 - case VIR_DOMAIN_DISK_BUS_SATA: - if (controllerOrBus < 0 || controllerOrBus > 3) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SATA controller index %1$d out of [0..3] ran= ge"), - controllerOrBus); - return -1; - } + if (unit < 0 || unit > vmdef->scsiBusMaxUnit || unit =3D=3D 7)= { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SCSI unit index %1$d out of [0..6,8..%2$= u] range"), + unit, vmdef->scsiBusMaxUnit); + return -1; + } =20 - if (unit < 0 || unit >=3D 30) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SATA unit index %1$d out of [0..29] range"), - unit); - return -1; - } + idx =3D controllerOrBus * 15 + (unit < 7 ? unit : unit - 1); + prefix =3D "sd"; + break; =20 - idx =3D controllerOrBus * 30 + unit; - prefix =3D "sd"; - break; + case VIR_DOMAIN_DISK_BUS_SATA: + if (controllerOrBus < 0 || controllerOrBus > 3) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SATA controller index %1$d out of [0..3]= range"), + controllerOrBus); + return -1; + } =20 - case VIR_DOMAIN_DISK_BUS_IDE: - if (controllerOrBus < 0 || controllerOrBus > 1) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("IDE bus index %1$d out of [0..1] range"), - controllerOrBus); - return -1; - } + if (unit < 0 || unit >=3D 30) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SATA unit index %1$d out of [0..29] rang= e"), + unit); + return -1; + } + + idx =3D controllerOrBus * 30 + unit; + prefix =3D "sd"; + break; =20 - if (unit < 0 || unit > 1) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("IDE unit index %1$d out of [0..1] range"), u= nit); + case VIR_DOMAIN_DISK_BUS_IDE: + if (controllerOrBus < 0 || controllerOrBus > 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("IDE bus index %1$d out of [0..1] range"), + controllerOrBus); + return -1; + } + + if (unit < 0 || unit > 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("IDE unit index %1$d out of [0..1] range"= ), unit); + return -1; + } + idx =3D controllerOrBus * 2 + unit; + prefix =3D "hd"; + break; + + case VIR_DOMAIN_DISK_BUS_FDC: + if (controllerOrBus !=3D 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("FDC controller index %1$d out of [0] ran= ge"), + controllerOrBus); + return -1; + } + + if (unit < 0 || unit > 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("FDC unit index %1$d out of [0..1] range"= ), + unit); + return -1; + } + + idx =3D unit; + prefix =3D "fd"; + break; + + case VIR_DOMAIN_DISK_BUS_VIRTIO: + case VIR_DOMAIN_DISK_BUS_XEN: + case VIR_DOMAIN_DISK_BUS_USB: + case VIR_DOMAIN_DISK_BUS_UML: + case VIR_DOMAIN_DISK_BUS_SD: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported bus type '%1$s' for device type = '%2$s'"), + virDomainDiskBusTypeToString(def->bus), + virDomainDiskDeviceTypeToString(def->device)); return -1; - } - idx =3D controllerOrBus * 2 + unit; - prefix =3D "hd"; - break; - - case VIR_DOMAIN_DISK_BUS_FDC: - if (controllerOrBus !=3D 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("FDC controller index %1$d out of [0] range"), - controllerOrBus); + break; + + case VIR_DOMAIN_DISK_BUS_NONE: + case VIR_DOMAIN_DISK_BUS_LAST: + virReportEnumRangeError(virDomainDiskBus, def->bus); return -1; + break; } =20 - if (unit < 0 || unit > 1) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("FDC unit index %1$d out of [0..1] range"), - unit); - return -1; + /* Now generate target candidate and check for its uniqueness. */ + + dst =3D virIndexToDiskName(idx + tries, prefix); + + for (i =3D 0; i < vmdef->ndisks; i++) { + if (STREQ(vmdef->disks[i]->dst, dst)) + break; } =20 - idx =3D unit; - prefix =3D "fd"; - break; - - case VIR_DOMAIN_DISK_BUS_VIRTIO: - case VIR_DOMAIN_DISK_BUS_XEN: - case VIR_DOMAIN_DISK_BUS_USB: - case VIR_DOMAIN_DISK_BUS_UML: - case VIR_DOMAIN_DISK_BUS_SD: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported bus type '%1$s' for device type '%2$= s'"), - virDomainDiskBusTypeToString(def->bus), - virDomainDiskDeviceTypeToString(def->device)); - return -1; - break; - - case VIR_DOMAIN_DISK_BUS_NONE: - case VIR_DOMAIN_DISK_BUS_LAST: - virReportEnumRangeError(virDomainDiskBus, def->bus); - return -1; - break; + if (i =3D=3D vmdef->ndisks) { + def->dst =3D g_steal_pointer(&dst); + return 0; + } } =20 - def->dst =3D virIndexToDiskName(idx, prefix); - return 0; + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to generate disk target name")); + return -1; } =20 =20 diff --git a/tests/vmx2xmldata/esx-in-the-wild-12.xml b/tests/vmx2xmldata/e= sx-in-the-wild-12.xml index 42184501d0..a7730845ee 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-12.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-12.xml @@ -21,9 +21,9 @@
- + -
+
diff --git a/tests/vmx2xmldata/esx-in-the-wild-8.xml b/tests/vmx2xmldata/es= x-in-the-wild-8.xml index 0eea610709..4e3f986e38 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-8.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-8.xml @@ -36,9 +36,9 @@ - + -
+
--=20 2.41.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org