From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274513; cv=none; d=zoho.com; s=zohoarc; b=ZIhh0nugfH/ULQZAPf4rzAGIeOFnjtZsqv5QTKsShtfcTL4601jcYbnrSH3EXBr6Lp88msoHB5PS0p8sB7OImtyQm4MJWhpUm+uVRw26HyyuBPU/ACXUeaTJMPVDgAROtxrKYgy8PQpGXsrWdKNEGMeZ4ayCrRByJrIcH+8LGGs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274513; 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:ARC-Authentication-Results; bh=OsuayLstrsIUwBBu8XwdfDX62XX8X9kyOw0GlDIV870=; b=SPmtC7XQsLgSWxfMktpZdqE45YtAjHaPhGxNAgkhLC6eZme022ckHaTntqdNjUO8NKFE3VmSCS5afKlzeed6l8hTAJYnI7dPjVaImUrfK2Ub75jh3PV5H+7nAfFI55gid13oTfA62Asl19joOeUJnxS+kKubyuAgKltEkjqhHvQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274513546249.9739210756411; Thu, 8 Aug 2019 07:28:33 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6191E30C0616; Thu, 8 Aug 2019 14:28:32 +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 36F2660BEC; Thu, 8 Aug 2019 14:28:32 +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 ECAFC1806B00; Thu, 8 Aug 2019 14:28:31 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQoGV017458 for ; Thu, 8 Aug 2019 10:26:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3BFC61001958; Thu, 8 Aug 2019 14:26:50 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E0ECF1001955 for ; Thu, 8 Aug 2019 14:26:48 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 2FE50100916; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:35 +0200 Message-Id: <0851af09827e70940d01fe5265873938960d1fb0.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 01/10] qemu: Pass qemuCaps to qemuDomainDefCopy 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 08 Aug 2019 14:28:32 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to qemuDomainDefCopy. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_domain.c | 16 ++++++++++------ src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_driver.c | 9 +++++---- src/qemu/qemu_migration.c | 4 ++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0555caa6ab..dba5db68ec 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8361,6 +8361,7 @@ qemuDomainObjExitRemote(virDomainObjPtr obj, =20 static virDomainDefPtr qemuDomainDefFromXML(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, const char *xml) { virCapsPtr caps; @@ -8369,7 +8370,7 @@ qemuDomainDefFromXML(virQEMUDriverPtr driver, if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) return NULL; =20 - def =3D virDomainDefParseString(xml, caps, driver->xmlopt, NULL, + def =3D virDomainDefParseString(xml, caps, driver->xmlopt, qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); =20 @@ -8380,6 +8381,7 @@ qemuDomainDefFromXML(virQEMUDriverPtr driver, =20 virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr src, unsigned int flags) { @@ -8389,7 +8391,7 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, if (!(xml =3D qemuDomainDefFormatXML(driver, src, flags))) return NULL; =20 - ret =3D qemuDomainDefFromXML(driver, xml); + ret =3D qemuDomainDefFromXML(driver, qemuCaps, xml); =20 VIR_FREE(xml); return ret; @@ -10616,6 +10618,7 @@ qemuDomainMigratableDefCheckABIStability(virQEMUDri= verPtr driver, =20 bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr src, virDomainDefPtr dst) { @@ -10623,8 +10626,8 @@ qemuDomainDefCheckABIStability(virQEMUDriverPtr dri= ver, virDomainDefPtr migratableDefDst =3D NULL; bool ret =3D false; =20 - if (!(migratableDefSrc =3D qemuDomainDefCopy(driver, src, COPY_FLAGS))= || - !(migratableDefDst =3D qemuDomainDefCopy(driver, dst, COPY_FLAGS))) + if (!(migratableDefSrc =3D qemuDomainDefCopy(driver, qemuCaps, src, CO= PY_FLAGS)) || + !(migratableDefDst =3D qemuDomainDefCopy(driver, qemuCaps, dst, CO= PY_FLAGS))) goto cleanup; =20 ret =3D qemuDomainMigratableDefCheckABIStability(driver, @@ -10643,14 +10646,15 @@ qemuDomainCheckABIStability(virQEMUDriverPtr driv= er, virDomainObjPtr vm, virDomainDefPtr dst) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; virDomainDefPtr migratableSrc =3D NULL; virDomainDefPtr migratableDst =3D NULL; char *xml =3D NULL; bool ret =3D false; =20 if (!(xml =3D qemuDomainFormatXML(driver, vm, COPY_FLAGS)) || - !(migratableSrc =3D qemuDomainDefFromXML(driver, xml)) || - !(migratableDst =3D qemuDomainDefCopy(driver, dst, COPY_FLAGS))) + !(migratableSrc =3D qemuDomainDefFromXML(driver, priv->qemuCaps, x= ml)) || + !(migratableDst =3D qemuDomainDefCopy(driver, priv->qemuCaps, dst,= COPY_FLAGS))) goto cleanup; =20 ret =3D qemuDomainMigratableDefCheckABIStability(driver, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b76d3cace9..94ff6e7bd3 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -649,6 +649,7 @@ int qemuDomainObjExitRemote(virDomainObjPtr obj, ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; =20 virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr src, unsigned int flags); =20 @@ -863,6 +864,7 @@ int qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr d= river, int asyncJob); =20 bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr src, virDomainDefPtr dst); =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ff83d1c024..4d6a933243 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6764,7 +6764,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; =20 - if (!(newdef_migr =3D qemuDomainDefCopy(driver, + if (!(newdef_migr =3D qemuDomainDefCopy(driver, NULL, newdef, QEMU_DOMAIN_FORMAT_LIVE_FLAGS | VIR_DOMAIN_XML_MIGRATABLE))) @@ -16553,7 +16553,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, switch ((virDomainSnapshotState) snapdef->state) { case VIR_DOMAIN_SNAPSHOT_RUNNING: case VIR_DOMAIN_SNAPSHOT_PAUSED: - + priv =3D vm->privateData; start_flags |=3D VIR_QEMU_PROCESS_START_PAUSED; =20 /* Transitions 2, 3, 5, 6, 8, 9 */ @@ -16580,7 +16580,9 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (!(config->cpu =3D virCPUDefCopy(cookie->cpu))) goto endjob; =20 - compatible =3D qemuDomainDefCheckABIStability(driver, = vm->def, + compatible =3D qemuDomainDefCheckABIStability(driver, + priv->qemu= Caps, + vm->def, config); } else { compatible =3D qemuDomainCheckABIStability(driver, vm,= config); @@ -16624,7 +16626,6 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, } } =20 - priv =3D vm->privateData; if (virDomainObjGetState(vm, NULL) =3D=3D VIR_DOMAIN_RUNNING) { /* Transitions 5, 6 */ if (qemuProcessStopCPUs(driver, vm, diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 7c6be201b9..ec1cae8bec 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2381,7 +2381,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, if (!newdef) goto cleanup; =20 - if (!qemuDomainDefCheckABIStability(driver, *def, newdef))= { + if (!qemuDomainDefCheckABIStability(driver, NULL, *def, ne= wdef)) { virDomainDefFree(newdef); goto cleanup; } @@ -3427,7 +3427,7 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver, goto error; } else { virDomainDefPtr def =3D vm->newDef ? vm->newDef : vm->def; - if (!(persistDef =3D qemuDomainDefCopy(driver, def, + if (!(persistDef =3D qemuDomainDefCopy(driver, priv->qemuCaps,= def, VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE= ))) goto error; --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274480; cv=none; d=zoho.com; s=zohoarc; b=gNogR3E0eJqQ0VojOj6ZHaDfkkOWOHC3Py4Hqu0RSgQAToOP0cTYjSk5sSse1tr4FGMucsizWTGF/3AEZU7JMMYQVKFY5RQlRb14n1qdZ9HzDO90OHXMifkOlWk8FDdlOckMjBLZL0syuD1/zG1qIYxa7gL/r/XCtI5TPjbnIKw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274480; 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:ARC-Authentication-Results; bh=O/787rxif9dN2XgVVcTQbaCOF/4yX7/5H927rd8NosM=; b=hpiB/wAE8zq5oTh/uz6EfnXlF9Y9ci7xz8dKhcJPrDxIW9c7YqunJiQR5pD3uisw+CBKTTOTbYdESyDIZE5x+QZIrYzWTF6WBb0Ivi/VaDNVwpKmuYMGTgHzUa3KnAj1C+CsGyIbjVS21IG8hCphrOyEukzH6zTDl4TOpXwg5YM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274480405354.5551996190768; Thu, 8 Aug 2019 07:28:00 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3BDCE30BEBF8; Thu, 8 Aug 2019 14:27:59 +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 0F61160318; Thu, 8 Aug 2019 14:27:59 +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 BD16D1806B01; Thu, 8 Aug 2019 14:27:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQoD0017466 for ; Thu, 8 Aug 2019 10:26:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5EE7C1001955; Thu, 8 Aug 2019 14:26:50 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DE468100194E for ; Thu, 8 Aug 2019 14:26:48 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 353B71024EE; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:36 +0200 Message-Id: <9118d385d43abd14fe6ac25bb2e28cf7492ffafb.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 02/10] qemu: Pass qemuCaps to qemuDomainDefFormatBufInternal 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 08 Aug 2019 14:27:59 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to qemuDomainDefFormatBufInternal. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_domain.c | 37 ++++++++++++++++++++------------ src/qemu/qemu_domain.h | 3 +++ src/qemu/qemu_driver.c | 23 +++++++++++++------- src/qemu/qemu_migration.c | 6 +++--- src/qemu/qemu_migration_cookie.c | 9 ++++++-- src/qemu/qemu_process.c | 9 ++++---- 6 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index dba5db68ec..a95c32d328 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8388,7 +8388,7 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, virDomainDefPtr ret =3D NULL; char *xml; =20 - if (!(xml =3D qemuDomainDefFormatXML(driver, src, flags))) + if (!(xml =3D qemuDomainDefFormatXML(driver, qemuCaps, src, flags))) return NULL; =20 ret =3D qemuDomainDefFromXML(driver, qemuCaps, xml); @@ -8400,6 +8400,7 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, =20 static int qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, virCPUDefPtr origCPU, unsigned int flags, @@ -8408,7 +8409,6 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr drive= r, int ret =3D -1; virDomainDefPtr copy =3D NULL; virCapsPtr caps =3D NULL; - virQEMUCapsPtr qemuCaps =3D NULL; =20 virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS | VIR_DOMAIN_XML_UPDATE_CPU,= -1); =20 @@ -8418,7 +8418,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr drive= r, if (!(flags & (VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE))) goto format; =20 - if (!(copy =3D virDomainDefCopy(def, caps, driver->xmlopt, NULL, + if (!(copy =3D virDomainDefCopy(def, caps, driver->xmlopt, qemuCaps, flags & VIR_DOMAIN_XML_MIGRATABLE))) goto cleanup; =20 @@ -8429,13 +8429,19 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr dri= ver, def->cpu && (def->cpu->mode !=3D VIR_CPU_MODE_CUSTOM || def->cpu->model)) { - if (!(qemuCaps =3D virQEMUCapsCacheLookupCopy(driver->qemuCapsCach= e, - def->emulator, - def->os.machine))) - goto cleanup; + VIR_AUTOUNREF(virQEMUCapsPtr) qCaps =3D NULL; + + if (qemuCaps) { + qCaps =3D virObjectRef(qemuCaps); + } else { + if (!(qCaps =3D virQEMUCapsCacheLookupCopy(driver->qemuCapsCac= he, + def->emulator, + def->os.machine))) + goto cleanup; + } =20 if (virCPUUpdate(def->os.arch, def->cpu, - virQEMUCapsGetHostModel(qemuCaps, def->virtType, + virQEMUCapsGetHostModel(qCaps, def->virtType, VIR_QEMU_CAPS_HOST_CPU_MI= GRATABLE)) < 0) goto cleanup; } @@ -8584,30 +8590,31 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr dri= ver, cleanup: virDomainDefFree(copy); virObjectUnref(caps); - virObjectUnref(qemuCaps); return ret; } =20 =20 int qemuDomainDefFormatBuf(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, unsigned int flags, virBufferPtr buf) { - return qemuDomainDefFormatBufInternal(driver, def, NULL, flags, buf); + return qemuDomainDefFormatBufInternal(driver, qemuCaps, def, NULL, fla= gs, buf); } =20 =20 static char * qemuDomainDefFormatXMLInternal(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, virCPUDefPtr origCPU, unsigned int flags) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; =20 - if (qemuDomainDefFormatBufInternal(driver, def, origCPU, flags, &buf) = < 0) + if (qemuDomainDefFormatBufInternal(driver, qemuCaps, def, origCPU, fla= gs, &buf) < 0) return NULL; =20 return virBufferContentAndReset(&buf); @@ -8616,10 +8623,11 @@ qemuDomainDefFormatXMLInternal(virQEMUDriverPtr dri= ver, =20 char * qemuDomainDefFormatXML(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, unsigned int flags) { - return qemuDomainDefFormatXMLInternal(driver, def, NULL, flags); + return qemuDomainDefFormatXMLInternal(driver, qemuCaps, def, NULL, fla= gs); } =20 =20 @@ -8638,11 +8646,12 @@ char *qemuDomainFormatXML(virQEMUDriverPtr driver, origCPU =3D priv->origCPU; } =20 - return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags); + return qemuDomainDefFormatXMLInternal(driver, priv->qemuCaps, def, ori= gCPU, flags); } =20 char * qemuDomainDefFormatLive(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, virCPUDefPtr origCPU, bool inactive, @@ -8655,7 +8664,7 @@ qemuDomainDefFormatLive(virQEMUDriverPtr driver, if (compatible) flags |=3D VIR_DOMAIN_XML_MIGRATABLE; =20 - return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags); + return qemuDomainDefFormatXMLInternal(driver, qemuCaps, def, origCPU, = flags); } =20 =20 diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 94ff6e7bd3..2ba51929db 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -654,11 +654,13 @@ virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr dr= iver, unsigned int flags); =20 int qemuDomainDefFormatBuf(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr vm, unsigned int flags, virBuffer *buf); =20 char *qemuDomainDefFormatXML(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr vm, unsigned int flags); =20 @@ -667,6 +669,7 @@ char *qemuDomainFormatXML(virQEMUDriverPtr driver, unsigned int flags); =20 char *qemuDomainDefFormatLive(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virDomainDefPtr def, virCPUDefPtr origCPU, bool inactive, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4d6a933243..75d6b3a952 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3446,9 +3446,10 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainDefFree(def); goto endjob; } - xml =3D qemuDomainDefFormatLive(driver, def, NULL, true, true); + xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, def, NULL,= true, true); } else { - xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, tr= ue, true); + xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, vm->def, + priv->origCPU, true, true); } if (!xml) { virReportError(VIR_ERR_OPERATION_FAILED, @@ -7231,7 +7232,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0) goto cleanup; =20 - ret =3D qemuDomainDefFormatXML(driver, def, flags); + ret =3D qemuDomainDefFormatXML(driver, NULL, def, flags); =20 cleanup: virQEMUSaveDataFree(data); @@ -7284,7 +7285,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, =20 VIR_FREE(data->xml); =20 - if (!(data->xml =3D qemuDomainDefFormatXML(driver, newdef, + if (!(data->xml =3D qemuDomainDefFormatXML(driver, NULL, newdef, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE))) @@ -7323,12 +7324,15 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, u= nsigned int flags) virDomainDefPtr def =3D NULL; int fd =3D -1; virQEMUSaveDataPtr data =3D NULL; + qemuDomainObjPrivatePtr priv; =20 virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 if (!(vm =3D qemuDomObjFromDomain(dom))) return ret; =20 + priv =3D vm->privateData; + if (virDomainManagedSaveGetXMLDescEnsureACL(dom->conn, vm->def, flags)= < 0) goto cleanup; =20 @@ -7345,7 +7349,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) false, NULL, false, false)) < 0) goto cleanup; =20 - ret =3D qemuDomainDefFormatXML(driver, def, flags); + ret =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); =20 cleanup: virQEMUSaveDataFree(data); @@ -15639,7 +15643,8 @@ qemuDomainSnapshotCreateActiveExternal(virQEMUDrive= rPtr driver, "snapshot", false)) < = 0) goto cleanup; =20 - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, + if (!(xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, + vm->def, priv->origCPU, true, true)) || !(snapdef->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew(v= m))) goto cleanup; @@ -15897,7 +15902,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, } else { /* Easiest way to clone inactive portion of vm->def is via * conversion in and back out of xml. */ - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, + if (!(xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, + vm->def, priv->origCPU, true, true)) || !(def->parent.dom =3D virDomainDefParseString(xml, caps, drive= r->xmlopt, NULL, VIR_DOMAIN_DEF_PAR= SE_INACTIVE | @@ -16997,7 +17003,8 @@ qemuDomainCheckpointPrepare(virQEMUDriverPtr driver= , virCapsPtr caps, =20 /* Easiest way to clone inactive portion of vm->def is via * conversion in and back out of xml. */ - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, + if (!(xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, + vm->def, priv->origCPU, true, true)) || !(def->parent.dom =3D virDomainDefParseString(xml, caps, driver->x= mlopt, NULL, VIR_DOMAIN_DEF_PARSE_I= NACTIVE | diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index ec1cae8bec..39e574ee30 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2083,9 +2083,9 @@ qemuMigrationSrcBeginPhase(virQEMUDriverPtr driver, if (!qemuDomainCheckABIStability(driver, vm, def)) goto cleanup; =20 - rv =3D qemuDomainDefFormatLive(driver, def, NULL, false, true); + rv =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, def, NULL, = false, true); } else { - rv =3D qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, + rv =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, vm->def, pr= iv->origCPU, false, true); } =20 @@ -2355,7 +2355,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, char *xml; int hookret; =20 - if (!(xml =3D qemuDomainDefFormatXML(driver, *def, + if (!(xml =3D qemuDomainDefFormatXML(driver, NULL, *def, VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE))) goto cleanup; diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_coo= kie.c index 74b8575a91..74a12d1b03 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -781,6 +781,7 @@ qemuMigrationCookieCapsXMLFormat(virBufferPtr buf, =20 static int qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, virBufferPtr buf, qemuMigrationCookiePtr mig) { @@ -822,6 +823,7 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, if ((mig->flags & QEMU_MIGRATION_COOKIE_PERSISTENT) && mig->persistent) { if (qemuDomainDefFormatBuf(driver, + qemuCaps, mig->persistent, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE | @@ -873,11 +875,12 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, =20 static char * qemuMigrationCookieXMLFormatStr(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, qemuMigrationCookiePtr mig) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; =20 - if (qemuMigrationCookieXMLFormat(driver, &buf, mig) < 0) { + if (qemuMigrationCookieXMLFormat(driver, qemuCaps, &buf, mig) < 0) { virBufferFreeAndReset(&buf); return NULL; } @@ -1419,6 +1422,8 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, int *cookieoutlen, unsigned int flags) { + qemuDomainObjPrivatePtr priv =3D dom->privateData; + if (!cookieout || !cookieoutlen) return 0; =20 @@ -1462,7 +1467,7 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, qemuMigrationCookieAddCaps(mig, dom, party) < 0) return -1; =20 - if (!(*cookieout =3D qemuMigrationCookieXMLFormatStr(driver, mig))) + if (!(*cookieout =3D qemuMigrationCookieXMLFormatStr(driver, priv->qem= uCaps, mig))) return -1; =20 *cookieoutlen =3D strlen(*cookieout) + 1; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 1ed56457b1..9345ecf1be 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4644,13 +4644,14 @@ qemuProcessStartHook(virQEMUDriverPtr driver, virHookQemuOpType op, virHookSubopType subop) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; char *xml; int ret; =20 if (!virHookPresent(VIR_HOOK_DRIVER_QEMU)) return 0; =20 - if (!(xml =3D qemuDomainDefFormatXML(driver, vm->def, 0))) + if (!(xml =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, vm->def, = 0))) return -1; =20 ret =3D virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, op, subop, @@ -7482,7 +7483,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, =20 /* now that we know it's stopped call the hook if present */ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { - char *xml =3D qemuDomainDefFormatXML(driver, vm->def, 0); + char *xml =3D qemuDomainDefFormatXML(driver, NULL, vm->def, 0); =20 /* we can't stop the operation even if the script raised an error = */ ignore_value(virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, @@ -7658,7 +7659,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, =20 /* The "release" hook cleans up additional resources */ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { - char *xml =3D qemuDomainDefFormatXML(driver, vm->def, 0); + char *xml =3D qemuDomainDefFormatXML(driver, NULL, vm->def, 0); =20 /* we can't stop the operation even if the script raised an error = */ virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, @@ -8220,7 +8221,7 @@ qemuProcessReconnect(void *opaque) =20 /* Run an hook to allow admins to do some magic */ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { - char *xml =3D qemuDomainDefFormatXML(driver, obj->def, 0); + char *xml =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, obj->= def, 0); int hookret; =20 hookret =3D virHookCall(VIR_HOOK_DRIVER_QEMU, obj->def->name, --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274517; cv=none; d=zoho.com; s=zohoarc; b=ZtVAaJjebLii8sH0aGyFAUBH+dQ7gSKyAa0Nd6SNcIbzZx+9/gY47eVYIMAW4UsjdzjH0Io1CnO78a7JGirmGVOduPMOmXhQ+nA8G8jbX4RvQg8yXM1tqx++JlnbIUoYzECH7rO/CT9+P7++0t5L/QbNVb0J+XtmkhaZn/lKO+I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274517; 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:ARC-Authentication-Results; bh=E0OCxoSPi0EhF97L1LljQ0vv4fYLq7g3fOQg161IFoY=; b=l4yZ1yxttATI0lqWCOz39u5/alkuNmFus053Pl05/LxITYXD0eyoXj1xUNQWt5bb5fVO16jEpPbKVhZGMxSW1rhgcZx+NaW2p0EhA96wd3MCcv0VTBVBWgcAy1gFsxYW+H3wokiBNA/1ePpU4aTUaxgwPBXlTvV7E/wcEYGNfYA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274517048107.10969584960912; Thu, 8 Aug 2019 07:28:37 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D09AD30A00D8; Thu, 8 Aug 2019 14:28:35 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A8B125C226; Thu, 8 Aug 2019 14:28:35 +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 6EBDD83542; Thu, 8 Aug 2019 14:28:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQquo017488 for ; Thu, 8 Aug 2019 10:26:52 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1FC0A600CC; Thu, 8 Aug 2019 14:26:52 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E82A46012A for ; Thu, 8 Aug 2019 14:26:48 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 3AE9C1024EF; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:37 +0200 Message-Id: <4b6c6ff342cafbc74e8318a252f0fb866b9c7bec.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 03/10] qemu: Pass qemuCaps to qemuDomainSaveImageOpen 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Thu, 08 Aug 2019 14:28:36 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to qemuDomainSaveImageOpen. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 75d6b3a952..14a20029dd 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6805,6 +6805,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver, /** * qemuDomainSaveImageOpen: * @driver: qemu driver data + * @qemuCaps: pointer to qemuCaps if the domain is running or NULL * @path: path of the save image * @ret_def: returns domain definition created from the XML stored in the = image * @ret_data: returns structure filled with data from the image header @@ -6819,6 +6820,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver, */ static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4) qemuDomainSaveImageOpen(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, const char *path, virDomainDefPtr *ret_def, virQEMUSaveDataPtr *ret_data, @@ -6943,7 +6945,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, } =20 /* Create a domain from this XML */ - if (!(def =3D virDomainDefParseString(data->xml, caps, driver->xmlopt,= NULL, + if (!(def =3D virDomainDefParseString(data->xml, caps, driver->xmlopt,= qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) goto error; @@ -7126,7 +7128,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, =20 virNWFilterReadLockFilterUpdates(); =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, + fd =3D qemuDomainSaveImageOpen(driver, NULL, path, &def, &data, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != =3D 0, &wrapperFd, false, false); if (fd < 0) @@ -7223,7 +7225,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, =20 virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, + fd =3D qemuDomainSaveImageOpen(driver, NULL, path, &def, &data, false, NULL, false, false); =20 if (fd < 0) @@ -7261,7 +7263,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, else if (flags & VIR_DOMAIN_SAVE_PAUSED) state =3D 0; =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, + fd =3D qemuDomainSaveImageOpen(driver, NULL, path, &def, &data, false, NULL, true, false); =20 if (fd < 0) @@ -7345,7 +7347,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) goto cleanup; } =20 - if ((fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, + if ((fd =3D qemuDomainSaveImageOpen(driver, priv->qemuCaps, path, &def= , &data, false, NULL, false, false)) < 0) goto cleanup; =20 @@ -7412,7 +7414,7 @@ qemuDomainObjRestore(virConnectPtr conn, virQEMUSaveDataPtr data =3D NULL; virFileWrapperFdPtr wrapperFd =3D NULL; =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, + fd =3D qemuDomainSaveImageOpen(driver, NULL, path, &def, &data, bypass_cache, &wrapperFd, false, true); if (fd < 0) { if (fd =3D=3D -3) --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274473; cv=none; d=zoho.com; s=zohoarc; b=XotpS1QKw6ARmCbioKRNF8gxjZZoYvARis214ZqyCE0kaub/fO3qsRDrbge+5ZdSYF+e/bNoL3tUEKDQH4TfOlawxbUjq8pfvCgOmvoq/F1PXWAi1/s7Z6zSrbnbNfAzInkGjElERurefUo9LgypZVVHxef1vHbyZwtIikk5J60= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274473; 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:ARC-Authentication-Results; bh=2A21KzZev9zurVVEyfiijsL6BPgZKSx6EB+4VMKMhvI=; b=Us6owN1o/ranh+h77Wq9aWRI8j/8VkySapX26h6u/z+v7Xitn2uKSq1wyhkqTX5Y9FVxorzJanPOLBUbaUJr0cljvKamrm+yc6jSClgKr3XPG4zN3wMwzuGSxda+8zscAXKW+cSHu2KZchCbhq+ReAmjlRfpXHiSBdvU2rhuO3M= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274472998438.8817247232772; Thu, 8 Aug 2019 07:27:52 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A2CA30C01A3; Thu, 8 Aug 2019 14:27: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 7755D5C219; Thu, 8 Aug 2019 14:27: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 30CD31806B01; Thu, 8 Aug 2019 14:27:51 +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 x78EQmtV017453 for ; Thu, 8 Aug 2019 10:26:48 -0400 Received: by smtp.corp.redhat.com (Postfix) id D0C245C231; Thu, 8 Aug 2019 14:26:48 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7F13C5C219 for ; Thu, 8 Aug 2019 14:26:48 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 40ADD1024F0; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:38 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 04/10] qemu: Pass qemuCaps to qemuMigrationAnyPrepareDef 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 08 Aug 2019 14:27:52 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to qemuMigrationAnyPrepareDef. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 12 ++++++------ src/qemu/qemu_migration.c | 8 ++++++-- src/qemu/qemu_migration.h | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 14a20029dd..1139fde77a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12651,7 +12651,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn, goto cleanup; } =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepareTunnelEnsureACL(dconn, def) < 0) @@ -12712,7 +12712,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn, goto cleanup; } =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepare2EnsureACL(dconn, def) < 0) @@ -12951,7 +12951,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn, QEMU_MIGRATION_DESTINAT= ION))) goto cleanup; =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepare3EnsureACL(dconn, def) < 0) @@ -13038,7 +13038,7 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn, goto cleanup; } =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0) @@ -13092,7 +13092,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn, QEMU_MIGRATION_DESTINAT= ION))) goto cleanup; =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepareTunnel3EnsureACL(dconn, def) < 0) @@ -13151,7 +13151,7 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr= dconn, QEMU_MIGRATION_DESTINAT= ION))) goto cleanup; =20 - if (!(def =3D qemuMigrationAnyPrepareDef(driver, dom_xml, dname, &orig= name))) + if (!(def =3D qemuMigrationAnyPrepareDef(driver, NULL, dom_xml, dname,= &origname))) goto cleanup; =20 if (virDomainMigratePrepareTunnel3ParamsEnsureACL(dconn, def) < 0) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 39e574ee30..d07482d9f2 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2861,6 +2861,7 @@ qemuMigrationDstPrepareDirect(virQEMUDriverPtr driver, =20 virDomainDefPtr qemuMigrationAnyPrepareDef(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, const char *dom_xml, const char *dname, char **origname) @@ -2878,7 +2879,8 @@ qemuMigrationAnyPrepareDef(virQEMUDriverPtr driver, if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) return NULL; =20 - if (!(def =3D virDomainDefParseString(dom_xml, caps, driver->xmlopt, N= ULL, + if (!(def =3D virDomainDefParseString(dom_xml, caps, driver->xmlopt, + qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) goto cleanup; @@ -3422,7 +3424,9 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver, =20 if (flags & VIR_MIGRATE_PERSIST_DEST) { if (persist_xml) { - if (!(persistDef =3D qemuMigrationAnyPrepareDef(driver, persis= t_xml, + if (!(persistDef =3D qemuMigrationAnyPrepareDef(driver, + priv->qemuCaps, + persist_xml, NULL, NULL))) goto error; } else { diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index bea7b1e688..188ccfa7fd 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -115,6 +115,7 @@ qemuMigrationSrcBegin(virConnectPtr conn, =20 virDomainDefPtr qemuMigrationAnyPrepareDef(virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, const char *dom_xml, const char *dname, char **origname); --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274477; cv=none; d=zoho.com; s=zohoarc; b=OUDoUdYVGBEcR1pF6wkLSFo8GqJZOuXqah3FbakY1D/Rnat5ZASpll5Pu26bmz+ZGXLDKb+QCTtuRcffJtHvTYkl/1ac70Vh7B3jHoxg9gk4Czbc8cZa3zRHhbI5lLWrWFCBnKBtHZVKPlHcijnFdMKTApaK3x3jC69RniS3WJs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274477; 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:ARC-Authentication-Results; bh=3AL62375Ea+PBmeK9kboL8MF2IpNy4HSak55zpG64eI=; b=lKKmjB67ciHzmcn8wVnIc+R9WEKCutkga5aHIPFCF3+4vGLvju1cQzce/rIjPNiuWQjyeE4jjrbwCHInBisHcjKXlDcM/5yfFsTPaP2f+PN5o7grRmbLocCLgbJskdnirI0VKa7xO7G8B4IDQc+WXtMVK53o1Tte9R0nJnz8zo8= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274477416970.819010832782; Thu, 8 Aug 2019 07:27:57 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 9DFFA30253EC; Thu, 8 Aug 2019 14:27:55 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 75AACF6EA; Thu, 8 Aug 2019 14:27:55 +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 323844EEB9; Thu, 8 Aug 2019 14:27:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQoRV017463 for ; Thu, 8 Aug 2019 10:26:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 545751001956; Thu, 8 Aug 2019 14:26:50 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 29EA810016E9 for ; Thu, 8 Aug 2019 14:26:50 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 43D471024F4; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:39 +0200 Message-Id: <7c16be24a7235dadcd0ee9b422923dc98786bcb7.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 05/10] qemu: Pass correct qemuCaps to virDomainDefParseString 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 08 Aug 2019 14:27:56 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to virDomainDefParseString. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1139fde77a..3004433aa5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3437,7 +3437,8 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, if (xmlin) { virDomainDefPtr def =3D NULL; =20 - if (!(def =3D virDomainDefParseString(xmlin, caps, driver->xmlopt,= NULL, + if (!(def =3D virDomainDefParseString(xmlin, caps, driver->xmlopt, + priv->qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALI= DATE))) { goto endjob; @@ -15907,7 +15908,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, if (!(xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, vm->def, priv->origCPU, true, true)) || - !(def->parent.dom =3D virDomainDefParseString(xml, caps, drive= r->xmlopt, NULL, + !(def->parent.dom =3D virDomainDefParseString(xml, caps, drive= r->xmlopt, + priv->qemuCaps, VIR_DOMAIN_DEF_PAR= SE_INACTIVE | VIR_DOMAIN_DEF_PAR= SE_SKIP_VALIDATE))) goto endjob; @@ -17008,7 +17010,8 @@ qemuDomainCheckpointPrepare(virQEMUDriverPtr driver= , virCapsPtr caps, if (!(xml =3D qemuDomainDefFormatLive(driver, priv->qemuCaps, vm->def, priv->origCPU, true, true)) || - !(def->parent.dom =3D virDomainDefParseString(xml, caps, driver->x= mlopt, NULL, + !(def->parent.dom =3D virDomainDefParseString(xml, caps, driver->x= mlopt, + priv->qemuCaps, VIR_DOMAIN_DEF_PARSE_I= NACTIVE | VIR_DOMAIN_DEF_PARSE_S= KIP_VALIDATE))) goto cleanup; --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274520; cv=none; d=zoho.com; s=zohoarc; b=OBZ86WiH61uNbLwcWFCHOH00gS+tuaMwb0ncZ1NHdA6ivF9RqlBRwRLLtDSDKEshsGcHk7LZcU+pkwlCcmIXQMbzZ+5w/lZvf2JgOl/ZxclackA8aT7C3hX9tNb6Izz2c3WA242K9m78vunVPoUld5kYqS6FatvnpNP8AYRPcWY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274520; 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:ARC-Authentication-Results; bh=8oo2cXdNc0EASL4nxiD2cZVWEHR1RI6RonruQAwZ/08=; b=omZvsq+BSwFRQ4ydxFDnbDvvACGLu7sEc2L/wG8VE+eQj6IDY4CYTb5V8KeqpPaUrDrjnOZCvylt+s6X1HdgNhQb/r5MqpCDCDvXuH3zzEK39ikejb4FYaUl6A782UUYRsslKDJ3Ortkf47DYrhnKQyHgOQZkddpWDV8r1NuFjE= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274520681754.3755810702044; Thu, 8 Aug 2019 07:28:40 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 58FC030A7BA5; Thu, 8 Aug 2019 14:28:39 +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 309875C226; Thu, 8 Aug 2019 14:28:39 +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 E3E1F180BA98; Thu, 8 Aug 2019 14:28:38 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQs3j017562 for ; Thu, 8 Aug 2019 10:26:54 -0400 Received: by smtp.corp.redhat.com (Postfix) id 082663DB4; Thu, 8 Aug 2019 14:26:54 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D10B5194B9 for ; Thu, 8 Aug 2019 14:26:50 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 46648102518; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:40 +0200 Message-Id: <5f54b9ea3a2fe8fc2da305eb5b4bd1ac12851d0d.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 06/10] qemu: Pass qemuCaps to qemuMigrationCookieXMLParse 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Thu, 08 Aug 2019 14:28:40 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to qemuMigrationCookieXMLParse. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_migration_cookie.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_coo= kie.c index 74a12d1b03..da5bc8d05f 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -1197,6 +1197,7 @@ qemuMigrationCookieCapsXMLParse(xmlXPathContextPtr ct= xt) static int qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, xmlDocPtr doc, xmlXPathContextPtr ctxt, unsigned int flags) @@ -1338,7 +1339,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mi= g, goto error; } mig->persistent =3D virDomainDefParseNode(doc, nodes[0], - caps, driver->xmlopt, NULL, + caps, driver->xmlopt, qemu= Caps, VIR_DOMAIN_DEF_PARSE_INACT= IVE | VIR_DOMAIN_DEF_PARSE_ABI_U= PDATE_MIGRATION | VIR_DOMAIN_DEF_PARSE_SKIP_= VALIDATE); @@ -1391,6 +1392,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mi= g, static int qemuMigrationCookieXMLParseStr(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, + virQEMUCapsPtr qemuCaps, const char *xml, unsigned int flags) { @@ -1403,7 +1405,7 @@ qemuMigrationCookieXMLParseStr(qemuMigrationCookiePtr= mig, if (!(doc =3D virXMLParseStringCtxt(xml, _("(qemu_migration_cookie)"),= &ctxt))) goto cleanup; =20 - ret =3D qemuMigrationCookieXMLParse(mig, driver, doc, ctxt, flags); + ret =3D qemuMigrationCookieXMLParse(mig, driver, qemuCaps, doc, ctxt, = flags); =20 cleanup: xmlXPathFreeContext(ctxt); @@ -1505,6 +1507,7 @@ qemuMigrationEatCookie(virQEMUDriverPtr driver, if (cookiein && cookieinlen && qemuMigrationCookieXMLParseStr(mig, driver, + priv->qemuCaps, cookiein, flags) < 0) goto error; --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274524; cv=none; d=zoho.com; s=zohoarc; b=LlixZPrOZRri8bm/zYjQkmPYTuD6j0Q+N2tMdowLr5R6CDR2jgQ3E6xZPSayTtJo3r1PeD/H7tkdSbhLETDMoX+1WuYn+x4ZKIWkU8KRVl049x3rg0J72WhgxK1oQW+IXufvYcv7wApudKrtg+uJNbZRmFfvbiMxsOSKTR6Q39c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274524; 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:ARC-Authentication-Results; bh=CcUlABO3MQh2fjog4ybrB4feTUcYiIcTh9kok7XdNiU=; b=TOA2DWSuXTSjYdQllqr85VPqQ0UBIzymuBCXRi5f/c0SI39Sdw9EYNh3GeIizXeKG7yCU2Nz/Kr+TgLCyvoxo8cjEZxP/DZONPI+zaGNdOt+QaQFiZnPoif0QqVdjfswaw0QH9hoVIJnzgZ2NiBDoU4nHY4xVCgMKK/VmrzIbUA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274524092452.0348015913205; Thu, 8 Aug 2019 07:28:44 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A7F013174640; Thu, 8 Aug 2019 14:28:42 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 817335D772; Thu, 8 Aug 2019 14:28:42 +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 44E8783544; Thu, 8 Aug 2019 14:28:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQtq0017769 for ; Thu, 8 Aug 2019 10:26:55 -0400 Received: by smtp.corp.redhat.com (Postfix) id DD749608AB; Thu, 8 Aug 2019 14:26:55 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 67D0960A9D for ; Thu, 8 Aug 2019 14:26:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 493FA102519; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:41 +0200 Message-Id: <3f16be8e3083938d1b1e146e150fb795f49145bd.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 07/10] qemu: Pass correct qemuCaps to virDomainDefCopy 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Thu, 08 Aug 2019 14:28:43 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. Several general functions from domain_conf.c were lazily passing NULL as the parseOpaque pointer instead of letting their callers pass the right data. This patch fixes all paths leading to virDomainDefCopy to do the right thing. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/conf/domain_conf.c | 18 +++++++++++------- src/conf/domain_conf.h | 9 ++++++--- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 10 +++++----- src/libxl/libxl_migration.c | 2 +- src/lxc/lxc_driver.c | 8 ++++---- src/lxc/lxc_process.c | 2 +- src/qemu/qemu_driver.c | 29 +++++++++++++++++++++-------- src/qemu/qemu_migration.c | 4 +++- src/qemu/qemu_process.c | 2 +- src/test/test_driver.c | 2 +- tests/qemuhotplugtest.c | 2 +- 12 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0456369d55..c44ceba7d5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3674,7 +3674,8 @@ virDomainObjWaitUntil(virDomainObjPtr vm, int virDomainObjSetDefTransient(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, - virDomainObjPtr domain) + virDomainObjPtr domain, + void *parseOpaque) { int ret =3D -1; =20 @@ -3684,7 +3685,8 @@ virDomainObjSetDefTransient(virCapsPtr caps, if (domain->newDef) return 0; =20 - if (!(domain->newDef =3D virDomainDefCopy(domain->def, caps, xmlopt, N= ULL, false))) + if (!(domain->newDef =3D virDomainDefCopy(domain->def, caps, xmlopt, + parseOpaque, false))) goto out; =20 ret =3D 0; @@ -3723,10 +3725,11 @@ virDomainObjRemoveTransientDef(virDomainObjPtr doma= in) virDomainDefPtr virDomainObjGetPersistentDef(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, - virDomainObjPtr domain) + virDomainObjPtr domain, + void *parseOpaque) { if (virDomainObjIsActive(domain) && - virDomainObjSetDefTransient(caps, xmlopt, domain) < 0) + virDomainObjSetDefTransient(caps, xmlopt, domain, parseOpaque) < 0) return NULL; =20 if (domain->newDef) @@ -29341,12 +29344,13 @@ virDomainDefCopy(virDomainDefPtr src, virDomainDefPtr virDomainObjCopyPersistentDef(virDomainObjPtr dom, virCapsPtr caps, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { virDomainDefPtr cur; =20 - cur =3D virDomainObjGetPersistentDef(caps, xmlopt, dom); - return virDomainDefCopy(cur, caps, xmlopt, NULL, false); + cur =3D virDomainObjGetPersistentDef(caps, xmlopt, dom, parseOpaque); + return virDomainDefCopy(cur, caps, xmlopt, parseOpaque, false); } =20 =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 57ca2a8ad1..7b9732fbbc 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2902,12 +2902,14 @@ void virDomainObjAssignDef(virDomainObjPtr domain, virDomainDefPtr *oldDef); int virDomainObjSetDefTransient(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, - virDomainObjPtr domain); + virDomainObjPtr domain, + void *parseOpaque); void virDomainObjRemoveTransientDef(virDomainObjPtr domain); virDomainDefPtr virDomainObjGetPersistentDef(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, - virDomainObjPtr domain); + virDomainObjPtr domain, + void *parseOpaque); =20 int virDomainObjUpdateModificationImpact(virDomainObjPtr vm, unsigned int *flags); @@ -2928,7 +2930,8 @@ virDomainDefPtr virDomainDefCopy(virDomainDefPtr src, bool migratable); virDomainDefPtr virDomainObjCopyPersistentDef(virDomainObjPtr dom, virCapsPtr caps, - virDomainXMLOptionPtr xmlopt= ); + virDomainXMLOptionPtr xmlopt, + void *parseOpaque); =20 typedef enum { /* parse internal domain status information */ diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 2d8569e592..b60511a266 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1340,7 +1340,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, VIR_FREE(managed_save_path); } =20 - if (virDomainObjSetDefTransient(cfg->caps, driver->xmlopt, vm) < 0) + if (virDomainObjSetDefTransient(cfg->caps, driver->xmlopt, vm, NULL) <= 0) goto cleanup; =20 /* Run an early hook to set-up missing devices */ diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index f430522b35..0e1bf2f0bb 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1607,7 +1607,7 @@ virDomainLiveConfigHelperMethod(virCapsPtr caps, return -1; =20 if (*flags & VIR_DOMAIN_AFFECT_CONFIG) { - if (!(*persistentDef =3D virDomainObjGetPersistentDef(caps, xmlopt= , dom))) { + if (!(*persistentDef =3D virDomainObjGetPersistentDef(caps, xmlopt= , dom, NULL))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Get persistent config failed")); return -1; @@ -2294,7 +2294,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned i= nt nvcpus, goto endjob; } =20 - if (!(def =3D virDomainObjGetPersistentDef(cfg->caps, driver->xmlopt, = vm))) + if (!(def =3D virDomainObjGetPersistentDef(cfg->caps, driver->xmlopt, = vm, NULL))) goto endjob; =20 maplen =3D VIR_CPU_MAPLEN(nvcpus); @@ -4126,7 +4126,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const = char *xml, =20 /* Make a copy for updated domain. */ if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, cfg->caps, - driver->xmlopt))) + driver->xmlopt, NULL))) goto endjob; =20 if (libxlDomainAttachDeviceConfig(vmdef, dev) < 0) @@ -4216,7 +4216,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const = char *xml, =20 /* Make a copy for updated domain. */ if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, cfg->caps, - driver->xmlopt))) + driver->xmlopt, NULL))) goto endjob; =20 if (libxlDomainDetachDeviceConfig(vmdef, dev) < 0) @@ -4303,7 +4303,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const = char *xml, =20 /* Make a copy for updated domain. */ if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, cfg->caps, - driver->xmlopt))) + driver->xmlopt, NULL))) goto cleanup; =20 if ((ret =3D libxlDomainUpdateDeviceConfig(vmdef, dev)) < 0) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 76bcb66a11..a1021d499b 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -1343,7 +1343,7 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, =20 vm->persistent =3D 1; if (!(vmdef =3D virDomainObjGetPersistentDef(cfg->caps, - driver->xmlopt, vm))) + driver->xmlopt, vm, NUL= L))) goto cleanup; =20 if (virDomainSaveConfig(cfg->configDir, cfg->caps, vmdef) < 0) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index d0b6703101..a2180b197e 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1913,7 +1913,7 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, =20 if (persistentDef) { /* Make a copy for updated domain. */ - persistentDefCopy =3D virDomainObjCopyPersistentDef(vm, caps, driv= er->xmlopt); + persistentDefCopy =3D virDomainObjCopyPersistentDef(vm, caps, driv= er->xmlopt, NULL); if (!persistentDefCopy) goto endjob; } @@ -4735,7 +4735,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr do= m, =20 if (flags & VIR_DOMAIN_AFFECT_CONFIG) { /* Make a copy for updated domain. */ - vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); + vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt, = NULL); if (!vmdef) goto endjob; =20 @@ -4840,7 +4840,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr do= m, goto endjob; =20 /* Make a copy for updated domain. */ - if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt= ))) + if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt= , NULL))) goto endjob; =20 /* virDomainDefCompatibleDevice call is delayed until we know the @@ -4919,7 +4919,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr do= m, =20 if (flags & VIR_DOMAIN_AFFECT_CONFIG) { /* Make a copy for updated domain. */ - vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); + vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt, = NULL); if (!vmdef) goto endjob; =20 diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index a1d028b2e6..3d03086ea7 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1289,7 +1289,7 @@ int virLXCProcessStart(virConnectPtr conn, * report implicit runtime defaults in the XML, like vnc listen/socket */ VIR_DEBUG("Setting current domain def as transient"); - if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0) + if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm, NULL) < 0) goto cleanup; =20 /* Run an early hook to set-up missing devices */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3004433aa5..f6e9c8672d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8826,6 +8826,7 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr v= m, const char *xml, unsigned int flags) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; virDomainDefPtr vmdef =3D NULL; virQEMUDriverConfigPtr cfg =3D NULL; virDomainDeviceDefPtr devConf =3D NULL; @@ -8847,7 +8848,8 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr v= m, * rely on the correct vm->def or vm->newDef being passed, so call the * device parse based on which definition is in use */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); + vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt, + priv->qemuCaps); if (!vmdef) goto cleanup; =20 @@ -8965,6 +8967,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, { virQEMUDriverPtr driver =3D dom->conn->privateData; virDomainObjPtr vm =3D NULL; + qemuDomainObjPrivatePtr priv; virDomainDefPtr vmdef =3D NULL; virDomainDeviceDefPtr dev =3D NULL, dev_copy =3D NULL; bool force =3D (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) !=3D 0; @@ -8987,6 +8990,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, if (!(vm =3D qemuDomObjFromDomain(dom))) goto cleanup; =20 + priv =3D vm->privateData; + if (virDomainUpdateDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0) goto cleanup; =20 @@ -9019,7 +9024,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, =20 if (flags & VIR_DOMAIN_AFFECT_CONFIG) { /* Make a copy for updated domain. */ - vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); + vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt, + priv->qemuCaps); if (!vmdef) goto endjob; =20 @@ -9077,6 +9083,7 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, const char *xml, unsigned int flags) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps =3D NULL; virQEMUDriverConfigPtr cfg =3D NULL; virDomainDeviceDefPtr dev =3D NULL, dev_copy =3D NULL; @@ -9115,7 +9122,7 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, =20 if (flags & VIR_DOMAIN_AFFECT_CONFIG) { /* Make a copy for updated domain. */ - vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); + vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt, = priv->qemuCaps); if (!vmdef) goto cleanup; =20 @@ -9171,6 +9178,7 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDrive= rPtr driver, const char *alias, unsigned int flags) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps =3D NULL; virQEMUDriverConfigPtr cfg =3D NULL; virDomainDefPtr def =3D NULL; @@ -9197,7 +9205,8 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDrive= rPtr driver, if (persistentDef) { virDomainDeviceDef dev; =20 - if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xm= lopt))) + if (!(vmdef =3D virDomainObjCopyPersistentDef(vm, caps, driver->xm= lopt, + priv->qemuCaps))) goto cleanup; =20 if (virDomainDefFindDevice(vmdef, alias, &dev, true) < 0) @@ -10810,7 +10819,8 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr = dom, if (persistentDef) { /* Make a copy for updated domain. */ if (!(persistentDefCopy =3D virDomainObjCopyPersistentDef(vm, caps, - driver->xm= lopt))) + driver->xm= lopt, + priv->qemu= Caps))) goto endjob; } =20 @@ -16477,6 +16487,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) goto cleanup; =20 + priv =3D vm->privateData; cfg =3D virQEMUDriverGetConfig(driver); =20 if (virDomainRevertToSnapshotEnsureACL(snapshot->domain->conn, vm->def= ) < 0) @@ -16553,7 +16564,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, * than inactive xml? */ if (snap->def->dom) { config =3D virDomainDefCopy(snap->def->dom, caps, - driver->xmlopt, NULL, true); + driver->xmlopt, priv->qemuCaps, true); if (!config) goto endjob; } @@ -16563,7 +16574,6 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, switch ((virDomainSnapshotState) snapdef->state) { case VIR_DOMAIN_SNAPSHOT_RUNNING: case VIR_DOMAIN_SNAPSHOT_PAUSED: - priv =3D vm->privateData; start_flags |=3D VIR_QEMU_PROCESS_START_PAUSED; =20 /* Transitions 2, 3, 5, 6, 8, 9 */ @@ -22016,6 +22026,7 @@ qemuDomainGetFSInfo(virDomainPtr dom, unsigned int flags) { virQEMUDriverPtr driver =3D dom->conn->privateData; + qemuDomainObjPrivatePtr priv; virDomainObjPtr vm; qemuAgentPtr agent; virCapsPtr caps =3D NULL; @@ -22027,6 +22038,8 @@ qemuDomainGetFSInfo(virDomainPtr dom, if (!(vm =3D qemuDomObjFromDomain(dom))) return ret; =20 + priv =3D vm->privateData; + if (virDomainGetFSInfoEnsureACL(dom->conn, vm->def) < 0) goto cleanup; =20 @@ -22042,7 +22055,7 @@ qemuDomainGetFSInfo(virDomainPtr dom, if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) goto endjob; =20 - if (!(def =3D virDomainDefCopy(vm->def, caps, driver->xmlopt, NULL, fa= lse))) + if (!(def =3D virDomainDefCopy(vm->def, caps, driver->xmlopt, priv->qe= muCaps, false))) goto endjob; =20 agent =3D qemuDomainObjEnterAgent(vm); diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index d07482d9f2..c2570f7303 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -4853,6 +4853,7 @@ qemuMigrationDstPersist(virQEMUDriverPtr driver, bool ignoreSaveError) { virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); + qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps =3D NULL; virDomainDefPtr vmdef; virDomainDefPtr oldDef =3D NULL; @@ -4867,7 +4868,8 @@ qemuMigrationDstPersist(virQEMUDriverPtr driver, oldDef =3D vm->newDef; vm->newDef =3D qemuMigrationCookieGetPersistent(mig); =20 - if (!(vmdef =3D virDomainObjGetPersistentDef(caps, driver->xmlopt, vm)= )) + if (!(vmdef =3D virDomainObjGetPersistentDef(caps, driver->xmlopt, vm, + priv->qemuCaps))) goto error; =20 if (virDomainSaveConfig(cfg->configDir, driver->caps, vmdef) < 0 && diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9345ecf1be..ffe4338854 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5637,7 +5637,7 @@ qemuProcessInit(virQEMUDriverPtr driver, * report implicit runtime defaults in the XML, like vnc listen/socket */ VIR_DEBUG("Setting current domain def as transient"); - if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0) + if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm, priv->qemuCa= ps) < 0) goto cleanup; =20 /* Update qemu capabilities according to lists passed in via namespace= */ diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18baa265..85cfcce79f 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -713,7 +713,7 @@ testDomainStartState(testDriverPtr privconn, =20 if (virDomainObjSetDefTransient(privconn->caps, privconn->xmlopt, - dom) < 0) { + dom, NULL) < 0) { goto cleanup; } =20 diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 354068d748..016a3ed4b1 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -427,7 +427,7 @@ testQemuHotplugCpuPrepare(const char *test, =20 /* create vm->newDef */ data->vm->persistent =3D true; - if (virDomainObjSetDefTransient(caps, driver.xmlopt, data->vm) < 0) + if (virDomainObjSetDefTransient(caps, driver.xmlopt, data->vm, NULL) <= 0) goto error; =20 priv =3D data->vm->privateData; --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274462; cv=none; d=zoho.com; s=zohoarc; b=dRPoF+gHDd3MXcxntnbtr9mE3gpyFdvmJsYTouEUudxHh4hkEdTpVduHbEV/Akv7+W5Ng0qPLdGqkmX+sCXqdcw5zVsN8FIP93dkUO8STUlrYS9WAtcQElHp1yUvr1SWvWFmV3FjesmgR9ZjUqDqy6kifLtEqYRHM3AVROhRq0w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274462; 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:ARC-Authentication-Results; bh=P/KN22Pko/Gp6/vKLX1ro78w4f1aBZBwP0naLCZNV3U=; b=ksQvBf7w929yakvXRSGVdnvQ4YP8M38rkv5hmmJ2G9yi8ap6nx7A9NI3fdGgXEnAiBBlZSkdHQuEWBTOkYwTD9iJi1SXQjLiZfCYo8DExoYlMl93mez+O+M/BAZYP7WzV5EzDYsRotVmAD19yq04SomoQ5mCu7AG0M7bs2XWVYI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274462649326.88222512772415; Thu, 8 Aug 2019 07:27:42 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id C453D3090FCD; Thu, 8 Aug 2019 14:27:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3870E100194E; Thu, 8 Aug 2019 14:27:40 +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 3BAB34EE96; Thu, 8 Aug 2019 14:27:39 +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 x78EQp4C017483 for ; Thu, 8 Aug 2019 10:26:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id DDE2A5C21F; Thu, 8 Aug 2019 14:26:51 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8EB065C219 for ; Thu, 8 Aug 2019 14:26:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 4BC7F10251A; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:42 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 08/10] qemu: Pass correct qemuCaps to virDomainDefPostParse 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Thu, 08 Aug 2019 14:27:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. This patch fixes all paths leading to virDomainDefPostParse. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 17 ++++++++++------- src/qemu/qemu_process.c | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f6e9c8672d..4da8b0e623 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8326,6 +8326,7 @@ static int qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev, virCapsPtr caps, + virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) { @@ -8517,7 +8518,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, return -1; } =20 - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, qemuCaps) = < 0) return -1; =20 return 0; @@ -8528,6 +8529,7 @@ static int qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev, virCapsPtr caps, + virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) { @@ -8709,7 +8711,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, return -1; } =20 - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, qemuCaps) = < 0) return -1; =20 return 0; @@ -8719,6 +8721,7 @@ static int qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev, virCapsPtr caps, + virQEMUCapsPtr qemuCaps, unsigned int parse_flags, virDomainXMLOptionPtr xmlopt) { @@ -8814,7 +8817,7 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, return -1; } =20 - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, qemuCaps) = < 0) return -1; =20 return 0; @@ -8866,7 +8869,7 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr v= m, false) < 0) goto cleanup; =20 - if (qemuDomainAttachDeviceConfig(vmdef, devConf, caps, + if (qemuDomainAttachDeviceConfig(vmdef, devConf, caps, priv->qemuC= aps, parse_flags, driver->xmlopt) < 0) goto cleanup; @@ -9031,7 +9034,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, =20 /* virDomainDefCompatibleDevice call is delayed until we know the * device we're going to update. */ - if ((ret =3D qemuDomainUpdateDeviceConfig(vmdef, dev, caps, + if ((ret =3D qemuDomainUpdateDeviceConfig(vmdef, dev, caps, priv->= qemuCaps, parse_flags, driver->xmlopt)) < 0) goto endjob; @@ -9126,7 +9129,7 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, if (!vmdef) goto cleanup; =20 - if (qemuDomainDetachDeviceConfig(vmdef, dev, caps, + if (qemuDomainDetachDeviceConfig(vmdef, dev, caps, priv->qemuCaps, parse_flags, driver->xmlopt) < 0) goto cleanup; @@ -9212,7 +9215,7 @@ qemuDomainDetachDeviceAliasLiveAndConfig(virQEMUDrive= rPtr driver, if (virDomainDefFindDevice(vmdef, alias, &dev, true) < 0) goto cleanup; =20 - if (qemuDomainDetachDeviceConfig(vmdef, &dev, caps, + if (qemuDomainDetachDeviceConfig(vmdef, &dev, caps, priv->qemuCaps, parse_flags, driver->xmlopt) < 0) goto cleanup; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ffe4338854..22ff4c42af 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5615,7 +5615,7 @@ qemuProcessInit(virQEMUDriverPtr driver, if (vm->def->postParseFailed) { VIR_DEBUG("re-running the post parse callback"); =20 - if (virDomainDefPostParse(vm->def, caps, 0, driver->xmlopt, NULL) = < 0) + if (virDomainDefPostParse(vm->def, caps, 0, driver->xmlopt, priv->= qemuCaps) < 0) goto cleanup; } =20 --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274477; cv=none; d=zoho.com; s=zohoarc; b=M5EwmslkII/nJGf2snQguD97DdE+sn1G6tkuN+6qj7frHF4I7yzOEK3xoIqzRqvRsCeFKvXiHliQSeFqG7fO/7GNBytLgQQ76uBr4YurK5zImRpBYQJQzxYdSHzjegYcE8shB9B5OHucgoiqTh48IutBRxsP43t+aQCU/r8JvFg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274477; 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:ARC-Authentication-Results; bh=7ZqxPYoR6BVMRtO9kKGdx3doZtUotCntlK4f4ez7NY8=; b=K67bu7ZBpmVN1n5D7X3Gtey52KpkxGBfiekjJAcEH9OGKUvCIlQfLJbAVQFHEyeQcpIVakUKfAsmYhPXZ6QJhPU27Max5O2YWAY3MIxcngjAAoXicqoqeHG+ejmQRaosyQRWFa/K+ue1LEoulNOBA8BsvP5udk/yjHO47HKxbXI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274477225740.9630951493306; Thu, 8 Aug 2019 07:27:57 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 805F1307D974; Thu, 8 Aug 2019 14:27:55 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4F214600C8; Thu, 8 Aug 2019 14:27:55 +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 0CB984EEBF; Thu, 8 Aug 2019 14:27:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQs2N017645 for ; Thu, 8 Aug 2019 10:26:54 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4DA4D5D721; Thu, 8 Aug 2019 14:26:54 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CC10D5D784 for ; Thu, 8 Aug 2019 14:26:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 4EA6A10251B; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:43 +0200 Message-Id: <0ca2a051ee598dc24d91bf28cedf6f2146e9ee9e.1565271790.git.jdenemar@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 09/10] qemu: Pass correct qemuCaps to virDomainDefParseNode 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Thu, 08 Aug 2019 14:27:56 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. Several general snapshot and checkpoint APIs were lazily passing NULL as the parseOpaque pointer instead of letting their callers pass the right data. This patch fixes all paths leading to virDomainDefParseNode. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/conf/checkpoint_conf.c | 9 ++++++--- src/conf/checkpoint_conf.h | 1 + src/conf/snapshot_conf.c | 11 ++++++++--- src/conf/snapshot_conf.h | 2 ++ src/esx/esx_driver.c | 2 +- src/qemu/qemu_driver.c | 18 +++++++++++++----- src/test/test_driver.c | 5 +++-- src/vbox/vbox_common.c | 4 ++-- tests/qemudomaincheckpointxml2xmltest.c | 2 +- tests/qemudomainsnapshotxml2xmltest.c | 2 +- 10 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/conf/checkpoint_conf.c b/src/conf/checkpoint_conf.c index 5ce4cc4853..b744e2b363 100644 --- a/src/conf/checkpoint_conf.c +++ b/src/conf/checkpoint_conf.c @@ -128,6 +128,7 @@ static virDomainCheckpointDefPtr virDomainCheckpointDefParse(xmlXPathContextPtr ctxt, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { virDomainCheckpointDefPtr ret =3D NULL; @@ -174,7 +175,7 @@ virDomainCheckpointDefParse(xmlXPathContextPtr ctxt, return NULL; } def->parent.dom =3D virDomainDefParseNode(ctxt->node->doc, dom= ainNode, - caps, xmlopt, NULL, + caps, xmlopt, parseOpa= que, domainflags); if (!def->parent.dom) return NULL; @@ -207,6 +208,7 @@ virDomainCheckpointDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { xmlXPathContextPtr ctxt =3D NULL; @@ -234,7 +236,7 @@ virDomainCheckpointDefParseNode(xmlDocPtr xml, } =20 ctxt->node =3D root; - def =3D virDomainCheckpointDefParse(ctxt, caps, xmlopt, flags); + def =3D virDomainCheckpointDefParse(ctxt, caps, xmlopt, parseOpaque, f= lags); cleanup: xmlXPathFreeContext(ctxt); return def; @@ -244,6 +246,7 @@ virDomainCheckpointDefPtr virDomainCheckpointDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { virDomainCheckpointDefPtr ret =3D NULL; @@ -253,7 +256,7 @@ virDomainCheckpointDefParseString(const char *xmlStr, if ((xml =3D virXMLParse(NULL, xmlStr, _("(domain_checkpoint)")))) { xmlKeepBlanksDefault(keepBlanksDefault); ret =3D virDomainCheckpointDefParseNode(xml, xmlDocGetRootElement(= xml), - caps, xmlopt, flags); + caps, xmlopt, parseOpaque, f= lags); xmlFreeDoc(xml); } xmlKeepBlanksDefault(keepBlanksDefault); diff --git a/src/conf/checkpoint_conf.h b/src/conf/checkpoint_conf.h index 03dd6b7bde..47ff69eb4d 100644 --- a/src/conf/checkpoint_conf.h +++ b/src/conf/checkpoint_conf.h @@ -75,6 +75,7 @@ virDomainCheckpointDefPtr virDomainCheckpointDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags); =20 virDomainCheckpointDefPtr diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index 324901a560..7996589ad2 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -228,6 +228,7 @@ static virDomainSnapshotDefPtr virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, bool *current, unsigned int flags) { @@ -303,7 +304,8 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, goto cleanup; } def->parent.dom =3D virDomainDefParseNode(ctxt->node->doc, dom= ainNode, - caps, xmlopt, NULL, do= mainflags); + caps, xmlopt, parseOpa= que, + domainflags); if (!def->parent.dom) goto cleanup; } else { @@ -413,6 +415,7 @@ virDomainSnapshotDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, bool *current, unsigned int flags) { @@ -443,7 +446,7 @@ virDomainSnapshotDefParseNode(xmlDocPtr xml, } =20 ctxt->node =3D root; - def =3D virDomainSnapshotDefParse(ctxt, caps, xmlopt, current, flags); + def =3D virDomainSnapshotDefParse(ctxt, caps, xmlopt, parseOpaque, cur= rent, flags); cleanup: xmlXPathFreeContext(ctxt); return def; @@ -453,6 +456,7 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, bool *current, unsigned int flags) { @@ -463,7 +467,8 @@ virDomainSnapshotDefParseString(const char *xmlStr, if ((xml =3D virXMLParse(NULL, xmlStr, _("(domain_snapshot)")))) { xmlKeepBlanksDefault(keepBlanksDefault); ret =3D virDomainSnapshotDefParseNode(xml, xmlDocGetRootElement(xm= l), - caps, xmlopt, current, flags); + caps, xmlopt, parseOpaque, + current, flags); xmlFreeDoc(xml); } xmlKeepBlanksDefault(keepBlanksDefault); diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index a0c87e7ade..216726fc16 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -106,12 +106,14 @@ unsigned int virDomainSnapshotFormatConvertXMLFlags(u= nsigned int flags); virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOption= Ptr xmlopt, + void *parseOpaque, bool *current, unsigned int flags= ); virDomainSnapshotDefPtr virDomainSnapshotDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPt= r xmlopt, + void *parseOpaque, bool *current, unsigned int flags); virDomainSnapshotDefPtr virDomainSnapshotDefNew(void); diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index b98c72dc3f..d6d219c101 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4117,7 +4117,7 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const= char *xmlDesc, return NULL; =20 def =3D virDomainSnapshotDefParseString(xmlDesc, priv->caps, - priv->xmlopt, NULL, parse_flags); + priv->xmlopt, NULL, NULL, parse_= flags); =20 if (!def) return NULL; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4da8b0e623..db6b00852f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -464,8 +464,12 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, int ret =3D -1; virCapsPtr caps =3D NULL; int direrr; + qemuDomainObjPrivatePtr priv; =20 virObjectLock(vm); + + priv =3D vm->privateData; + if (virAsprintf(&snapDir, "%s/%s", baseDir, vm->def->name) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to allocate memory for " @@ -504,7 +508,8 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, } =20 def =3D virDomainSnapshotDefParseString(xmlStr, caps, - qemu_driver->xmlopt, &cur, + qemu_driver->xmlopt, + priv->qemuCaps, &cur, flags); if (def =3D=3D NULL) { /* Nothing we can do here, skip this one */ @@ -579,8 +584,11 @@ qemuDomainCheckpointLoad(virDomainObjPtr vm, int ret =3D -1; virCapsPtr caps =3D NULL; int direrr; + qemuDomainObjPrivatePtr priv; =20 virObjectLock(vm); + priv =3D vm->privateData; + if (virAsprintf(&chkDir, "%s/%s", baseDir, vm->def->name) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to allocate memory for " @@ -620,6 +628,7 @@ qemuDomainCheckpointLoad(virDomainObjPtr vm, =20 def =3D virDomainCheckpointDefParseString(xmlStr, caps, qemu_driver->xmlopt, + priv->qemuCaps, flags); if (!def || virDomainCheckpointAlignDisks(def) < 0) { /* Nothing we can do here, skip this one */ @@ -15804,6 +15813,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, goto cleanup; } =20 + priv =3D vm->privateData; cfg =3D virQEMUDriverGetConfig(driver); =20 if (virDomainSnapshotCreateXMLEnsureACL(domain->conn, vm->def, flags) = < 0) @@ -15831,7 +15841,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, parse_flags |=3D VIR_DOMAIN_SNAPSHOT_PARSE_VALIDATE; =20 if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, caps, driver->x= mlopt, - NULL, parse_flags))) + priv->qemuCaps, NULL, pars= e_flags))) goto cleanup; =20 /* reject snapshot names containing slashes or starting with dot as @@ -15908,8 +15918,6 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, =20 qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE); =20 - priv =3D vm->privateData; - if (redefine) { if (virDomainSnapshotRedefinePrep(domain, vm, &def, &snap, driver->xmlopt, @@ -17182,7 +17190,7 @@ qemuDomainCheckpointCreateXML(virDomainPtr domain, } =20 if (!(def =3D virDomainCheckpointDefParseString(xmlDesc, caps, driver-= >xmlopt, - parse_flags))) + priv->qemuCaps, parse_fl= ags))) goto cleanup; /* Unlike snapshots, the RNG schema already ensured a sane filename. */ =20 diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 85cfcce79f..7e87772434 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -902,6 +902,7 @@ testParseDomainSnapshots(testDriverPtr privconn, def =3D virDomainSnapshotDefParseNode(ctxt->doc, node, privconn->caps, privconn->xmlopt, + NULL, &cur, VIR_DOMAIN_SNAPSHOT_PARSE_DISK= S | VIR_DOMAIN_SNAPSHOT_PARSE_INTE= RNAL | @@ -8168,7 +8169,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, privconn->caps, privconn->xmlopt, - NULL, + NULL, NULL, parse_flags))) goto cleanup; =20 @@ -8629,7 +8630,7 @@ testDomainCheckpointCreateXML(virDomainPtr domain, } =20 if (!(def =3D virDomainCheckpointDefParseString(xmlDesc, privconn->cap= s, - privconn->xmlopt, + privconn->xmlopt, NULL, parse_flags))) goto cleanup; =20 diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 6a4ef01e64..db3d940f85 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5505,7 +5505,7 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom, parse_flags |=3D VIR_DOMAIN_SNAPSHOT_PARSE_VALIDATE; =20 if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, data->caps, - data->xmlopt, NULL, + data->xmlopt, NULL, NULL, parse_flags))) goto cleanup; =20 @@ -6949,7 +6949,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) } def =3D virDomainSnapshotDefParseString(defXml, data->caps, - data->xmlopt, NULL, + data->xmlopt, NULL, NULL, VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_REDEFI= NE); if (!def) { diff --git a/tests/qemudomaincheckpointxml2xmltest.c b/tests/qemudomainchec= kpointxml2xmltest.c index 8a7c0922c7..9dabe92ab9 100644 --- a/tests/qemudomaincheckpointxml2xmltest.c +++ b/tests/qemudomaincheckpointxml2xmltest.c @@ -54,7 +54,7 @@ testCompareXMLToXMLFiles(const char *inxml, return -1; =20 if (!(def =3D virDomainCheckpointDefParseString(inXmlData, driver.caps, - driver.xmlopt, + driver.xmlopt, NULL, parseflags))) { if (flags & TEST_INVALID) return 0; diff --git a/tests/qemudomainsnapshotxml2xmltest.c b/tests/qemudomainsnapsh= otxml2xmltest.c index 10ea9cf8d2..c84ee0bf7d 100644 --- a/tests/qemudomainsnapshotxml2xmltest.c +++ b/tests/qemudomainsnapshotxml2xmltest.c @@ -55,7 +55,7 @@ testCompareXMLToXMLFiles(const char *inxml, goto cleanup; =20 if (!(def =3D virDomainSnapshotDefParseString(inXmlData, driver.caps, - driver.xmlopt, &cur, + driver.xmlopt, NULL, &cur, parseflags))) goto cleanup; if (cur) { --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 20 05:23:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1565274480; cv=none; d=zoho.com; s=zohoarc; b=JQJfa63hNDu8xqlTXfvNrX2hNRhqidPcPPQDAmg6uQHfhcYk1sT22LRV6IFvtTewTQtSfFPmSlBGt+aGRcng2p4noTGPE2uES6yQME68djRORuvWtv/fdTxg/c5Dtrlu8kkpRdM9qWOLxVgH8PNm9tk8JLlXISrAfnqxNgkNq2o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565274480; 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:ARC-Authentication-Results; bh=EPlHlwdzOsmbXNpJfFiVkd4BsxXp0IunaE5tB7trCFE=; b=h8JeQUpqIRg6ZDP+eJzdpGxXAL/0Ic94x4PEEKfyc3BjxVBcoJdicH02QuIpzVLbHGz3wQzVo6ZBRK9kGMxiY6NVciBGhIHPJKYbrzIGM0Bs9jj+Jun538NYdlJG7TwgmxLp9vfcXQyM7imXp02Udqx2goDMv3EZlzklKXO4UkI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1565274480280686.2731781204171; Thu, 8 Aug 2019 07:28:00 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 055F87652E; Thu, 8 Aug 2019 14:27:59 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C907F10016F3; Thu, 8 Aug 2019 14:27:58 +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 8B03962D11; Thu, 8 Aug 2019 14:27:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x78EQspx017667 for ; Thu, 8 Aug 2019 10:26:54 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9ADEF60BF1; Thu, 8 Aug 2019 14:26:54 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2268E60BEC for ; Thu, 8 Aug 2019 14:26:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 51E2610251C; Thu, 8 Aug 2019 16:26:47 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Thu, 8 Aug 2019 16:26:44 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 10/10] qemu: Pass correct qemuCaps to virDomainDeviceDefPostParse 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 08 Aug 2019 14:27:59 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Since qemuDomainDeviceDefPostParse callback requires qemuCaps, we need to make sure it gets the capabilities stored in the domain's private data if the domain is running. Passing NULL may cause QEMU capabilities probing to be triggered in case QEMU binary changed in the meantime. When this happens while a running domain object is locked, QMP event delivered to the domain before QEMU capabilities probing finishes will deadlock the event loop. QEMU capabilities lookup (via domainPostParseDataAlloc callback) is hidden inside virDomainDeviceDefPostParseOne with no way to pass qemuCaps to virDomainDeviceDef* functions. This patch fixes all remaining paths leading to virDomainDeviceDefPostParse. Signed-off-by: Jiri Denemark Reviewed-by: Michal Privoznik --- src/conf/domain_conf.c | 23 ++++++++++++++--------- src/conf/domain_conf.h | 4 +++- src/libxl/libxl_driver.c | 12 ++++++------ src/lxc/lxc_driver.c | 10 +++++----- src/openvz/openvz_driver.c | 2 +- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_driver.c | 20 ++++++++++++-------- src/vbox/vbox_common.c | 4 ++-- tests/qemuhotplugtest.c | 2 +- 9 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c44ceba7d5..a3b3e5938d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5454,22 +5454,24 @@ virDomainDeviceDefPostParseOne(virDomainDeviceDefPt= r dev, const virDomainDef *def, virCapsPtr caps, unsigned int flags, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { - void *parseOpaque =3D NULL; + void *data =3D NULL; int ret; =20 - if (xmlopt->config.domainPostParseDataAlloc) { + if (!parseOpaque && xmlopt->config.domainPostParseDataAlloc) { if (xmlopt->config.domainPostParseDataAlloc(def, caps, flags, xmlopt->config.priv, - &parseOpaque) < 0) + &data) < 0) return -1; + parseOpaque =3D data; } =20 ret =3D virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt, par= seOpaque); =20 - if (parseOpaque && xmlopt->config.domainPostParseDataFree) - xmlopt->config.domainPostParseDataFree(parseOpaque); + if (data && xmlopt->config.domainPostParseDataFree) + xmlopt->config.domainPostParseDataFree(data); =20 return ret; } @@ -16279,6 +16281,7 @@ virDomainDeviceDefParse(const char *xmlStr, const virDomainDef *def, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { xmlDocPtr xml; @@ -16441,7 +16444,8 @@ virDomainDeviceDefParse(const char *xmlStr, } =20 /* callback to fill driver specific device aspects */ - if (virDomainDeviceDefPostParseOne(dev, def, caps, flags, xmlopt) < 0) + if (virDomainDeviceDefPostParseOne(dev, def, caps, flags, + xmlopt, parseOpaque) < 0) goto error; =20 /* validate the configuration */ @@ -29799,7 +29803,8 @@ virDomainDeviceDefPtr virDomainDeviceDefCopy(virDomainDeviceDefPtr src, const virDomainDef *def, virCapsPtr caps, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { VIR_AUTOCLEAN(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; int flags =3D VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_S= ECURE; @@ -29887,7 +29892,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, return NULL; =20 xmlStr =3D virBufferContentAndReset(&buf); - return virDomainDeviceDefParse(xmlStr, def, caps, xmlopt, + return virDomainDeviceDefParse(xmlStr, def, caps, xmlopt, parseOpaque, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 7b9732fbbc..0be9f01b19 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2866,7 +2866,8 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def= ); virDomainDeviceDefPtr virDomainDeviceDefCopy(virDomainDeviceDefPtr src, const virDomainDef *def, virCapsPtr caps, - virDomainXMLOptionPtr xmlopt); + virDomainXMLOptionPtr xmlopt, + void *parseOpaque); virDomainDeviceInfoPtr virDomainDeviceGetInfo(virDomainDeviceDefPtr device= ); void virDomainDeviceSetData(virDomainDeviceDefPtr device, void *devicedata); @@ -2998,6 +2999,7 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(const c= har *xmlStr, const virDomainDef *def, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags); virDomainDiskDefPtr virDomainDiskDefParse(const char *xmlStr, const virDomainDef *def, diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 0e1bf2f0bb..b7a34352c5 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4120,7 +4120,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const = char *xml, =20 if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) { if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE)= )) goto endjob; =20 @@ -4137,7 +4137,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const = char *xml, /* If dev exists it was created to modify the domain config. Free = it. */ virDomainDeviceDefFree(dev); if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE)= )) goto endjob; =20 @@ -4209,7 +4209,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const = char *xml, =20 if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) { if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALI= DATE))) goto endjob; @@ -4227,7 +4227,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const = char *xml, /* If dev exists it was created to modify the domain config. Free = it. */ virDomainDeviceDefFree(dev); if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALI= DATE))) goto endjob; @@ -4297,7 +4297,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const = char *xml, =20 if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) { if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE)= )) goto cleanup; =20 @@ -4316,7 +4316,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const = char *xml, /* If dev exists it was created to modify the domain config. Free = it. */ virDomainDeviceDefFree(dev); if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE)= )) goto cleanup; =20 diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index a2180b197e..d8ae03c77a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -4716,7 +4716,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr do= m, goto endjob; =20 dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - caps, driver->xmlopt, + caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE= ); if (dev =3D=3D NULL) goto endjob; @@ -4728,7 +4728,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr do= m, * to CONFIG takes one instance. */ dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, - caps, driver->xmlopt); + caps, driver->xmlopt, NULL); if (!dev_copy) goto endjob; } @@ -4835,7 +4835,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr do= m, if (!(caps =3D virLXCDriverGetCapabilities(driver, false))) goto endjob; =20 - if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, caps, driver->xmlo= pt, + if (!(dev =3D virDomainDeviceDefParse(xml, vm->def, caps, driver->xmlo= pt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto endjob; =20 @@ -4899,7 +4899,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr do= m, goto endjob; =20 dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - caps, driver->xmlopt, + caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE= | VIR_DOMAIN_DEF_PARSE_SKIP_VAL= IDATE); if (dev =3D=3D NULL) @@ -4912,7 +4912,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr do= m, * to CONFIG takes one instance. */ dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, - caps, driver->xmlopt); + caps, driver->xmlopt, NULL); if (!dev_copy) goto endjob; } diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 39eeb2c12e..98db7fceec 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1962,7 +1962,7 @@ openvzDomainUpdateDeviceFlags(virDomainPtr dom, const= char *xml, if (!(def =3D virDomainObjGetOneDef(vm, flags))) goto cleanup; =20 - dev =3D virDomainDeviceDefParse(xml, def, driver->caps, driver->xmlopt, + dev =3D virDomainDeviceDefParse(xml, def, driver->caps, driver->xmlopt= , NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (!dev) goto cleanup; diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index a4b440a24f..1638d527fd 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1691,7 +1691,7 @@ phypDomainAttachDeviceFlags(virDomainPtr domain, =20 def->os.type =3D VIR_DOMAIN_OSTYPE_LINUX; =20 - dev =3D virDomainDeviceDefParse(xml, def, phyp_driver->caps, NULL, + dev =3D virDomainDeviceDefParse(xml, def, phyp_driver->caps, NULL, NUL= L, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (!dev) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index db6b00852f..a60231a658 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8866,7 +8866,8 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr v= m, goto cleanup; =20 if (!(devConf =3D virDomainDeviceDefParse(xml, vmdef, caps, - driver->xmlopt, parse_flag= s))) + driver->xmlopt, priv->qemu= Caps, + parse_flags))) goto cleanup; =20 if (virDomainDeviceValidateAliasForHotplug(vm, devConf, @@ -8886,7 +8887,8 @@ qemuDomainAttachDeviceLiveAndConfig(virDomainObjPtr v= m, =20 if (flags & VIR_DOMAIN_AFFECT_LIVE) { if (!(devLive =3D virDomainDeviceDefParse(xml, vm->def, caps, - driver->xmlopt, parse_flag= s))) + driver->xmlopt, priv->qemu= Caps, + parse_flags))) goto cleanup; =20 if (virDomainDeviceValidateAliasForHotplug(vm, devLive, @@ -9017,8 +9019,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, !(flags & VIR_DOMAIN_AFFECT_LIVE)) parse_flags |=3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 - dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - caps, driver->xmlopt, + dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, caps, + driver->xmlopt, priv->qemuCap= s, parse_flags); if (dev =3D=3D NULL) goto endjob; @@ -9029,7 +9031,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr d= om, * create a deep copy of device as adding * to CONFIG takes one instance. */ - dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, caps, driver->xm= lopt); + dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, caps, + driver->xmlopt, priv->qemuCaps); if (!dev_copy) goto endjob; } @@ -9115,8 +9118,8 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, !(flags & VIR_DOMAIN_AFFECT_LIVE)) parse_flags |=3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 - dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, - caps, driver->xmlopt, + dev =3D dev_copy =3D virDomainDeviceDefParse(xml, vm->def, caps, + driver->xmlopt, priv->qemuCap= s, parse_flags); if (dev =3D=3D NULL) goto cleanup; @@ -9127,7 +9130,8 @@ qemuDomainDetachDeviceLiveAndConfig(virQEMUDriverPtr = driver, * create a deep copy of device as adding * to CONFIG takes one instance. */ - dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, caps, driver->xm= lopt); + dev_copy =3D virDomainDeviceDefCopy(dev, vm->def, caps, + driver->xmlopt, priv->qemuCaps); if (!dev_copy) goto cleanup; } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index db3d940f85..49e657cdb7 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -4313,7 +4313,7 @@ static int vboxDomainAttachDeviceImpl(virDomainPtr do= m, =20 def->os.type =3D VIR_DOMAIN_OSTYPE_HVM; =20 - dev =3D virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt, + dev =3D virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt, NU= LL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (dev =3D=3D NULL) goto cleanup; @@ -4432,7 +4432,7 @@ static int vboxDomainDetachDevice(virDomainPtr dom, c= onst char *xml) =20 def->os.type =3D VIR_DOMAIN_OSTYPE_HVM; =20 - dev =3D virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt, + dev =3D virDomainDeviceDefParse(xml, def, data->caps, data->xmlopt, NU= LL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); if (dev =3D=3D NULL) diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 016a3ed4b1..6ad67c8902 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -274,7 +274,7 @@ testQemuHotplug(const void *data) device_parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; =20 if (!(dev =3D virDomainDeviceDefParse(device_xml, vm->def, - caps, driver.xmlopt, + caps, driver.xmlopt, NULL, device_parse_flags))) goto cleanup; =20 --=20 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list