On a Friday in 2023, Michal Privoznik wrote:
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 <mprivozn@xxxxxxxxxx> --- 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 = NULL; - unsigned int idx = 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] range"), - controllerOrBus); - return -1; - } + unsigned int tries = 0; - if (unit < 0 || unit > vmdef->scsiBusMaxUnit || unit == 7) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SCSI unit index %1$d out of [0..6,8..%2$u] range"), - unit, vmdef->scsiBusMaxUnit); - return -1; - } + for (tries = 0; tries < 10; tries++) {
It seems strange to me to use 'tries' to try to compute something that is already known. Wouldn't generating the indexes in two passes work here? First pass takes cares of only SATA disks, for example, and the second pass will take care of all the other disks, using the highest index used for a SATA disk as an offset. Jano
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Devel mailing list -- devel@xxxxxxxxxxxxxxxxx To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx