From nobody Mon Feb 9 00:20:32 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602515670; cv=none; d=zohomail.com; s=zohoarc; b=P44FJUU6k/aINUHHd1ExpQJRsS4Btbzakd3pEL3XqTKu7/j/HHZvwJrUUIb/jRb24cOT9WunjkTwANFkmBwqhyhdPpZ0pvObX+dCXLbIDKQG80HZGUo57vzkzJ488fqCDrouJQ7POt1jYES5E/e3/pf+B26MtGhg42DKEcysT6Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602515670; h=Content-Type:Content-Transfer-Encoding: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=lsPUlShDm+oM13f7Nif7do04hxE+r762OTsTnNNHLl4=; b=KZpxRyUrXCPU8FAnVPv5D2l9V4vIu75bTDHOOoGeLtUWLiNB6OdD3Xss4hENe/eqBV30oIPAe5csH69Bim5fGljU9fg/1yzac8lDu6JuTrbU3V1JuhGua60L3GSnJJ+GjAjLrRJfolhzak9CGjOwukJtLPFY6onIcEiEcSE+LN8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 160251567015390.56729216666724; Mon, 12 Oct 2020 08:14:30 -0700 (PDT) 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-189-Fw45scvDMw2gpAk5AYUFbA-1; Mon, 12 Oct 2020 11:14:25 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 94E2A8018A9; Mon, 12 Oct 2020 15:14:17 +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 70497277CD; Mon, 12 Oct 2020 15:14:17 +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 3D0BE183D026; Mon, 12 Oct 2020 15:14:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 09CFDwhI014639 for ; Mon, 12 Oct 2020 11:13:59 -0400 Received: by smtp.corp.redhat.com (Postfix) id F1DF95C225; Mon, 12 Oct 2020 15:13:58 +0000 (UTC) Received: from lindworm.usersys.redhat.com (unknown [10.34.247.222]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 244F25C22B for ; Mon, 12 Oct 2020 15:13:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602515668; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=lsPUlShDm+oM13f7Nif7do04hxE+r762OTsTnNNHLl4=; b=LNMFTSxJLfPTsTYxrJrsZ1btPAywScd2t4f1aU4NL7C/PbO5VRQsHAwczxj96lmwAVIOTg V+4apKSv1inAVWIxASQ1vPPW89r7wrrPtbeq5AKEbeiKIjjQQhFYM9XvzwsyvsZnwrGKcH 5NLa2S4+3MGRLmTIOmEJH55bi2pEFno= X-MC-Unique: Fw45scvDMw2gpAk5AYUFbA-1 From: Pino Toscano To: libvir-list@redhat.com Subject: [libvirt PATCH 4/4] vmx: start parsing SATA disks Date: Mon, 12 Oct 2020 17:13:48 +0200 Message-Id: <20201012151348.4067266-5-ptoscano@redhat.com> In-Reply-To: <20201012151348.4067266-1-ptoscano@redhat.com> References: <20201012151348.4067266-1-ptoscano@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com 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.23 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 X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Always reverse-engineering VMX files, attempt to support SATA disks in guests, and their controllers. The esx-in-the-wild-10 test case is taken from RHBZ#1883588, while the result of esx-in-the-wild-8 is updated with SATA disks. Fixes (hopefully): https://bugzilla.redhat.com/show_bug.cgi?id=3D1677608 https://bugzilla.redhat.com/show_bug.cgi?id=3D1883588 Signed-off-by: Pino Toscano --- src/vmx/vmx.c | 138 ++++++++++++++++++ .../vmx2xml-esx-in-the-wild-10.vmx | 101 +++++++++++++ .../vmx2xml-esx-in-the-wild-10.xml | 36 +++++ .../vmx2xmldata/vmx2xml-esx-in-the-wild-8.xml | 6 + tests/vmx2xmltest.c | 1 + 5 files changed, 282 insertions(+) create mode 100644 tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.vmx create mode 100644 tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 6e4b455794..51d88de750 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -90,6 +90,7 @@ def->os ## disks #################################################################= ###### =20 scsi[0..3]:[0..6,8..15] -> : with 1 bus per controller + sata[0..3]:[0..29] -> = : with 1 bus per controller ide[0..1]:[0..1] -> :<= unit> with 1 controller floppy[0..1] -> = with 1 controller and 1 bus per controller =20 @@ -120,6 +121,26 @@ def->disks[0]... ->slotnum =20 =20 +## disks: sata hard drive from .vmdk image ###############################= ###### + + sata0.present =3D "true" = # defaults to "false" + sata0:0.present =3D "true" = # defaults to "false" + sata0:0.startConnected =3D "true" = # defaults to "true" + +... +->type =3D _DISK_TYPE_FILE <=3D> sata0:0.deviceType =3D "???" = # defaults to ? +->device =3D _DISK_DEVICE_DISK <=3D> sata0:0.deviceType =3D "???" = # defaults to ? +->bus =3D _DISK_BUS_SATA +->src =3D .vmdk <=3D> sata0:0.fileName =3D ".= vmdk" +->dst =3D sd[ * 30 + mapped to [a-z]+] +->driverName =3D <=3D> sata0.virtualDev =3D "= " # default depends on guestOS value +->driverType +->cachemode <=3D> sata0:0.writeThrough =3D "" # defaults to false, true -> _DISK_CACHE_WRITETHRU, false _DISK_C= ACHE_DEFAULT +->readonly +->shared +->slotnum + + ## disks: ide hard drive from .vmdk image ################################= ###### =20 ide0:0.present =3D "true" = # defaults to "false" @@ -164,6 +185,26 @@ def->disks[0]... ->slotnum =20 =20 +## disks: sata cdrom from .iso image #####################################= ###### + + sata0.present =3D "true" = # defaults to "false" + sata0:0.present =3D "true" = # defaults to "false" + sata0:0.startConnected =3D "true" = # defaults to "true" + +... +->type =3D _DISK_TYPE_FILE <=3D> sata0:0.deviceType =3D "cdrom-= image" # defaults to ? +->device =3D _DISK_DEVICE_CDROM <=3D> sata0:0.deviceType =3D "cdrom-= image" # defaults to ? +->bus =3D _DISK_BUS_SATA +->src =3D .iso <=3D> sata0:0.fileName =3D ".= iso" +->dst =3D sd[ * 30 + mapped to [a-z]+] +->driverName =3D <=3D> sata0.virtualDev =3D "= " # default depends on guestOS value +->driverType +->cachemode +->readonly +->shared +->slotnum + + ## disks: ide cdrom from .iso image ######################################= ###### =20 ide0:0.present =3D "true" = # defaults to "false" @@ -524,6 +565,7 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, static int virVMXParseVNC(virConfPtr conf, virDomainGraphicsDefPtr *def); static int virVMXParseSCSIController(virConfPtr conf, int controller, bool= *present, int *virtualDev); +static int virVMXParseSATAController(virConfPtr conf, int controller, bool= *present); static int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlop= t, virConfPtr conf, int device, int busType, int controllerOrBus, int unit, virDomainDiskDef= Ptr *def, @@ -1335,6 +1377,7 @@ virVMXParseConfig(virVMXContext *ctx, long long coresPerSocket =3D 0; virCPUDefPtr cpu =3D NULL; char *firmware =3D NULL; + size_t saved_ndisks =3D 0; =20 if (ctx->parseFileName =3D=3D NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -1700,6 +1743,51 @@ virVMXParseConfig(virVMXContext *ctx, controller, scsi_virtualDev[con= troller])) goto cleanup; } + saved_ndisks =3D def->ndisks; + } + + /* def:disks (sata) */ + for (controller =3D 0; controller < 4; ++controller) { + if (virVMXParseSATAController(conf, controller, &present) < 0) { + goto cleanup; + } + + if (! present) + continue; + + for (unit =3D 0; unit < 30; ++unit) { + if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_= DISK, + VIR_DOMAIN_DISK_BUS_SATA, controller, unit, + &def->disks[def->ndisks], def) < 0) { + goto cleanup; + } + + if (def->disks[def->ndisks] !=3D NULL) { + ++def->ndisks; + continue; + } + + if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_= CDROM, + VIR_DOMAIN_DISK_BUS_SATA, controller, uni= t, + &def->disks[def->ndisks], def) < 0) { + goto cleanup; + } + + if (def->disks[def->ndisks] !=3D NULL) + ++def->ndisks; + } + + } + + /* add all the SATA controllers we've seen, up until the last one that= is + * currently used by a disk */ + if (def->ndisks - saved_ndisks !=3D 0) { + virDomainDeviceInfoPtr info =3D &def->disks[def->ndisks - 1]->info; + for (controller =3D 0; controller <=3D info->addr.drive.controller= ; controller++) { + if (!virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TYPE= _SATA, + controller, -1)) + goto cleanup; + } } =20 /* def:disks (ide) */ @@ -2015,6 +2103,28 @@ virVMXParseSCSIController(virConfPtr conf, int contr= oller, bool *present, =20 =20 =20 +static int +virVMXParseSATAController(virConfPtr conf, int controller, bool *present) +{ + char present_name[32]; + + if (controller < 0 || controller > 3) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SATA controller index %d out of [0..3] range"), + controller); + return -1; + } + + g_snprintf(present_name, sizeof(present_name), "sata%d.present", contr= oller); + + if (virVMXGetConfigBoolean(conf, present_name, present, false, true) <= 0) + return -1; + + return 0; +} + + + static int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfP= tr conf, int device, int busType, int controllerOrBus, int unit, @@ -2031,6 +2141,13 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOpti= onPtr xmlopt, virConfPtr con * device =3D {VIR_DOMAIN_DISK_DEVICE_DISK, * VIR_DOMAIN_DISK_DEVICE_CDROM, * VIR_DOMAIN_DISK_DEVICE_LUN} + * busType =3D VIR_DOMAIN_DISK_BUS_SATA + * controllerOrBus =3D [0..3] -> controller + * unit =3D [0..29] + * + * device =3D {VIR_DOMAIN_DISK_DEVICE_DISK, + * VIR_DOMAIN_DISK_DEVICE_CDROM, + * VIR_DOMAIN_DISK_DEVICE_LUN} * busType =3D VIR_DOMAIN_DISK_BUS_IDE * controllerOrBus =3D [0..1] -> bus * unit =3D [0..1] @@ -2103,6 +2220,27 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOpti= onPtr xmlopt, virConfPtr con virIndexToDiskName (controllerOrBus * 15 + (unit < 7 ? unit : unit - 1), "sd= "); =20 + if ((*def)->dst =3D=3D NULL) + goto cleanup; + } else if (busType =3D=3D VIR_DOMAIN_DISK_BUS_SATA) { + if (controllerOrBus < 0 || controllerOrBus > 3) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SATA controller index %d out of [0..3] r= ange"), + controllerOrBus); + goto cleanup; + } + + if (unit < 0 || unit >=3D 30) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("SATA unit index %d out of [0..29] range"= ), + unit); + goto cleanup; + } + + prefix =3D g_strdup_printf("sata%d:%d", controllerOrBus, unit); + + (*def)->dst =3D virIndexToDiskName(controllerOrBus * 30 + unit= , "sd"); + if ((*def)->dst =3D=3D NULL) goto cleanup; } else if (busType =3D=3D VIR_DOMAIN_DISK_BUS_IDE) { diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.vmx b/tests/vmx2x= mldata/vmx2xml-esx-in-the-wild-10.vmx new file mode 100644 index 0000000000..c8a0ef022a --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.vmx @@ -0,0 +1,101 @@ +.encoding =3D "UTF-8" +config.version =3D "8" +virtualHW.version =3D "17" +nvram =3D "windows2019biosvmware.nvram" +pciBridge0.present =3D "TRUE" +svga.present =3D "TRUE" +pciBridge4.present =3D "TRUE" +pciBridge4.virtualDev =3D "pcieRootPort" +pciBridge4.functions =3D "8" +pciBridge5.present =3D "TRUE" +pciBridge5.virtualDev =3D "pcieRootPort" +pciBridge5.functions =3D "8" +pciBridge6.present =3D "TRUE" +pciBridge6.virtualDev =3D "pcieRootPort" +pciBridge6.functions =3D "8" +pciBridge7.present =3D "TRUE" +pciBridge7.virtualDev =3D "pcieRootPort" +pciBridge7.functions =3D "8" +vmci0.present =3D "TRUE" +hpet0.present =3D "TRUE" +floppy0.present =3D "FALSE" +svga.vramSize =3D "8388608" +numvcpus =3D "2" +cpuid.coresPerSocket =3D "2" +memSize =3D "4096" +powerType.powerOff =3D "default" +powerType.suspend =3D "default" +powerType.reset =3D "default" +tools.upgrade.policy =3D "manual" +sched.cpu.units =3D "mhz" +sched.cpu.affinity =3D "all" +sched.cpu.latencySensitivity =3D "normal" +vm.createDate =3D "1600358272642584" +sata0.present =3D "TRUE" +ethernet0.virtualDev =3D "e1000e" +ethernet0.networkName =3D "VM Network" +ethernet0.addressType =3D "vpx" +ethernet0.generatedAddress =3D "00:50:56:9a:9c:7a" +ethernet0.present =3D "TRUE" +displayName =3D "w2019biosvmware" +guestOS =3D "windows2019srv-64" +disk.EnableUUID =3D "TRUE" +toolScripts.afterPowerOn =3D "TRUE" +toolScripts.afterResume =3D "TRUE" +toolScripts.beforeSuspend =3D "TRUE" +toolScripts.beforePowerOff =3D "TRUE" +uuid.bios =3D "42 1a 61 77 5a a9 ab b7-59 24 fc 37 6c 18 a1 b4" +vc.uuid =3D "50 1a f9 f2 6d 29 1c 76-19 a9 b2 08 ed e5 f3 74" +migrate.hostLog =3D "windows2019biosvmware-25cb1ed1.hlog" +sched.cpu.min =3D "0" +sched.cpu.shares =3D "normal" +sched.mem.min =3D "0" +sched.mem.minSize =3D "0" +sched.mem.shares =3D "normal" +migrate.encryptionMode =3D "opportunistic" +viv.moid =3D "c95f9b69-0aea-44dd-9941-696b625c8fbb:vm-22:EF/prDXvzAhPJtd46= UQDN3DGPNWZzzePsgdPTSxifyo=3D" +numa.autosize.cookie =3D "20022" +numa.autosize.vcpu.maxPerVirtualNode =3D "2" +sched.swap.derivedName =3D "windows2019biosvmware-79c21733.vswp" +uuid.location =3D "56 4d ff 27 a3 20 99 44-4a 7f b5 40 3a 8a a2 5f" +vm.genid =3D "1424963296993694319" +vm.genidX =3D "-5704120239402535687" +pciBridge0.pciSlotNumber =3D "17" +pciBridge4.pciSlotNumber =3D "21" +pciBridge5.pciSlotNumber =3D "22" +pciBridge6.pciSlotNumber =3D "23" +pciBridge7.pciSlotNumber =3D "24" +ethernet0.pciSlotNumber =3D "192" +usb_xhci.pciSlotNumber =3D "-1" +vmci0.pciSlotNumber =3D "32" +sata0.pciSlotNumber =3D "33" +vmotion.checkpointFBSize =3D "8388608" +vmotion.checkpointSVGAPrimarySize =3D "8388608" +vmotion.svga.mobMaxSize =3D "8388608" +vmotion.svga.graphicsMemoryKB =3D "8192" +vmci0.id =3D "1813553588" +monitor.phys_bits_used =3D "45" +cleanShutdown =3D "TRUE" +softPowerOff =3D "TRUE" +usb_xhci:4.present =3D "TRUE" +usb_xhci:4.deviceType =3D "hid" +usb_xhci:4.port =3D "4" +usb_xhci:4.parent =3D "-1" +toolsInstallManager.lastInstallError =3D "0" +tools.remindInstall =3D "FALSE" +toolsInstallManager.updateCounter =3D "3" +extendedConfigFile =3D "windows2019biosvmware.vmxf" +disable_acceleration =3D "TRUE" +sata0:0.fileName =3D "windows2019biosvmware.vmdk" +sata0:0.present =3D "TRUE" +sata0:0.redo =3D "" +sched.sata0:0.shares =3D "normal" +sched.sata0:0.throughputCap =3D "off" +sata0:1.startConnected =3D "FALSE" +sata0:1.deviceType =3D "cdrom-raw" +sata0:1.clientDevice =3D "TRUE" +sata0:1.fileName =3D "emptyBackingString" +sata0:1.present =3D "TRUE" +svga.guestBackedPrimaryAware =3D "TRUE" +tools.syncTime =3D "FALSE" +guestOS.detailed.data =3D "" diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml b/tests/vmx2x= mldata/vmx2xml-esx-in-the-wild-10.xml new file mode 100644 index 0000000000..b8c522af1f --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml @@ -0,0 +1,36 @@ + + w2019biosvmware + 421a6177-5aa9-abb7-5924-fc376c18a1b4 + 4194304 + 4194304 + 2 + + 2000 + + + hvm + + + + + + destroy + restart + destroy + + + + +
+ + + + + + + + + + diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-8.xml b/tests/vmx2xm= ldata/vmx2xml-esx-in-the-wild-8.xml index 8276457bb3..32affb5935 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-8.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-8.xml @@ -34,7 +34,13 @@
+ + + +
+ + diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 1966aed6fe..376116bb75 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -262,6 +262,7 @@ mymain(void) DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7"); DO_TEST("esx-in-the-wild-8", "esx-in-the-wild-8"); DO_TEST("esx-in-the-wild-9", "esx-in-the-wild-9"); + DO_TEST("esx-in-the-wild-10", "esx-in-the-wild-10"); =20 DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1"); DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2"); --=20 2.26.2