From nobody Sat May 4 16:06:15 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1527787868725105.51414604249487; Thu, 31 May 2018 10:31:08 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D45673159739; Thu, 31 May 2018 17:31:06 +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 5B8CC608EF; Thu, 31 May 2018 17:31:06 +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 606A31800C9D; Thu, 31 May 2018 17:31:05 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4VHUcYZ030241 for ; Thu, 31 May 2018 13:30:38 -0400 Received: by smtp.corp.redhat.com (Postfix) id 83224208C6C2; Thu, 31 May 2018 17:30:38 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.136]) by smtp.corp.redhat.com (Postfix) with ESMTP id 27DA9208C6C1 for ; Thu, 31 May 2018 17:30:38 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Thu, 31 May 2018 19:30:22 +0200 Message-Id: <964e21ccd18027d0ff1228758d34c56c43f220eb.1527787717.git.pkrempa@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/4] util: storage: Add helper for determining whether a backing chain requires PR 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: , MIME-Version: 1.0 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.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Thu, 31 May 2018 17:31:07 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" With blockdev support we will need to introspect whether any of the backing chain members requires PR rather just one of them. Add a helper and reuse it in virDomainDefHasManagedPR. Signed-off-by: Peter Krempa Reviewed-by: J=EF=BF=BDn Tomko --- src/conf/domain_conf.c | 2 +- src/libvirt_private.syms | 1 + src/util/virstoragefile.c | 14 ++++++++++++++ src/util/virstoragefile.h | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bfe863d76d..be78d388df 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -29928,7 +29928,7 @@ virDomainDefHasManagedPR(const virDomainDef *def) size_t i; for (i =3D 0; i < def->ndisks; i++) { - if (virStoragePRDefIsManaged(def->disks[i]->src->pr)) + if (virStorageSourceChainHasManagedPR(def->disks[i]->src)) return true; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6001635916..68a1056f83 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2813,6 +2813,7 @@ virStoragePRDefIsEqual; virStoragePRDefIsManaged; virStoragePRDefParseXML; virStorageSourceBackingStoreClear; +virStorageSourceChainHasManagedPR; virStorageSourceClear; virStorageSourceCopy; virStorageSourceFindByNodeName; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 54de2c1c30..6c71d0cdf9 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2025,6 +2025,20 @@ virStoragePRDefIsManaged(virStoragePRDefPtr prd) } +bool +virStorageSourceChainHasManagedPR(virStorageSourcePtr src) +{ + virStorageSourcePtr n; + + for (n =3D src; virStorageSourceIsBacking(n); n =3D n->backingStore) { + if (virStoragePRDefIsManaged(src->pr)) + return true; + } + + return false; +} + + virSecurityDeviceLabelDefPtr virStorageSourceGetSecurityLabelDef(virStorageSourcePtr src, const char *model) diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 1631c4cf66..b1ff5142fb 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -401,6 +401,9 @@ bool virStoragePRDefIsEqual(virStoragePRDefPtr a, virStoragePRDefPtr b); bool virStoragePRDefIsManaged(virStoragePRDefPtr prd); +bool +virStorageSourceChainHasManagedPR(virStorageSourcePtr src); + virSecurityDeviceLabelDefPtr virStorageSourceGetSecurityLabelDef(virStorageSourcePtr src, const char *model); --=20 2.16.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 16:06:15 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1527787861423182.7824309420015; Thu, 31 May 2018 10:31:01 -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 59F5DC7D2C; Thu, 31 May 2018 17:30:57 +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 C710F60C80; Thu, 31 May 2018 17:30:56 +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 8FBD21800C9C; Thu, 31 May 2018 17:30:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4VHUdJ5030247 for ; Thu, 31 May 2018 13:30:39 -0400 Received: by smtp.corp.redhat.com (Postfix) id 25945208C6C2; Thu, 31 May 2018 17:30:39 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.136]) by smtp.corp.redhat.com (Postfix) with ESMTP id BE75A208C6C1 for ; Thu, 31 May 2018 17:30:38 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Thu, 31 May 2018 19:30:23 +0200 Message-Id: <4635895f190ae137a676f365226ddb2319b7ecf1.1527787717.git.pkrempa@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/4] qemu: command: Pass in 'src' rather than 'disk' to qemuBuildPRManagerInfoProps 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: , MIME-Version: 1.0 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.26]); Thu, 31 May 2018 17:31:00 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Everything is contained in the virStorageSourceStructure. Signed-off-by: Peter Krempa Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_command.c | 12 +++++------- src/qemu/qemu_command.h | 2 +- src/qemu/qemu_hotplug.c | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 26e61f26f4..9256104f27 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9691,7 +9691,7 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, /** * qemuBuildPRManagerInfoProps: - * @disk: disk definition + * @src: storage source * @propsret: Returns JSON object containing properties of the pr-manager-= helper object * * Build the JSON properties for the pr-manager object. @@ -9700,14 +9700,12 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, * -1 on failure (with error message set). */ int -qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk, +qemuBuildPRManagerInfoProps(virStorageSourcePtr src, virJSONValuePtr *propsret) { return qemuMonitorCreateObjectProps(propsret, - "pr-manager-helper", - disk->src->pr->mgralias, - "s:path", disk->src->pr->path, - NULL); + "pr-manager-helper", src->pr->mgra= lias, + "s:path", src->pr->path, NULL); } @@ -9734,7 +9732,7 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd, managedAdded =3D true; } - if (qemuBuildPRManagerInfoProps(disk, &props) < 0) + if (qemuBuildPRManagerInfoProps(disk->src, &props) < 0) goto cleanup; if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index e85efcc980..60b4dcf054 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -55,7 +55,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr drive= r, int **nicindexes); /* Generate the object properties for pr-manager */ -int qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk, +int qemuBuildPRManagerInfoProps(virStorageSourcePtr src, virJSONValuePtr *propsret); /* Generate the object properties for a secret */ diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c656409eaa..44bd41ccb6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -401,7 +401,7 @@ qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm, return 0; } - return qemuBuildPRManagerInfoProps(disk, propsret); + return qemuBuildPRManagerInfoProps(disk->src, propsret); } --=20 2.16.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 16:06:15 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 152778787601866.45650784573786; Thu, 31 May 2018 10:31:16 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 39B50C093542; Thu, 31 May 2018 17:31:13 +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 F3DE830012C7; Thu, 31 May 2018 17:31:12 +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 9A6154BB78; Thu, 31 May 2018 17:31:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4VHUefw030252 for ; Thu, 31 May 2018 13:30:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id BCBEA208C6C2; Thu, 31 May 2018 17:30:39 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.136]) by smtp.corp.redhat.com (Postfix) with ESMTP id 61007208C6C1 for ; Thu, 31 May 2018 17:30:39 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Thu, 31 May 2018 19:30:24 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/4] qemu: command: Return props as return value in qemuBuildPRManagerInfoProps 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: , MIME-Version: 1.0 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.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 31 May 2018 17:31:14 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Also since we don't do any conditional formatting, fix the comment for the function. Signed-off-by: Peter Krempa Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_command.c | 22 +++++++++++----------- src/qemu/qemu_command.h | 3 +-- src/qemu/qemu_hotplug.c | 5 ++++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9256104f27..2d559938ed 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9692,20 +9692,20 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, /** * qemuBuildPRManagerInfoProps: * @src: storage source - * @propsret: Returns JSON object containing properties of the pr-manager-= helper object * * Build the JSON properties for the pr-manager object. - * - * Returns: 0 on success (@propsret is NULL if no properties are needed), - * -1 on failure (with error message set). */ -int -qemuBuildPRManagerInfoProps(virStorageSourcePtr src, - virJSONValuePtr *propsret) +virJSONValuePtr +qemuBuildPRManagerInfoProps(virStorageSourcePtr src) { - return qemuMonitorCreateObjectProps(propsret, - "pr-manager-helper", src->pr->mgra= lias, - "s:path", src->pr->path, NULL); + virJSONValuePtr ret =3D NULL; + + if (qemuMonitorCreateObjectProps(&ret, + "pr-manager-helper", src->pr->mgralia= s, + "s:path", src->pr->path, NULL) < 0) + return NULL; + + return ret; } @@ -9732,7 +9732,7 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd, managedAdded =3D true; } - if (qemuBuildPRManagerInfoProps(disk->src, &props) < 0) + if (!(props =3D qemuBuildPRManagerInfoProps(disk->src))) goto cleanup; if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 60b4dcf054..10aa21bcdd 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -55,8 +55,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr drive= r, int **nicindexes); /* Generate the object properties for pr-manager */ -int qemuBuildPRManagerInfoProps(virStorageSourcePtr src, - virJSONValuePtr *propsret); +virJSONValuePtr qemuBuildPRManagerInfoProps(virStorageSourcePtr src); /* Generate the object properties for a secret */ int qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 44bd41ccb6..e78aff7adf 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -401,7 +401,10 @@ qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm, return 0; } - return qemuBuildPRManagerInfoProps(disk->src, propsret); + if (!(*propsret =3D qemuBuildPRManagerInfoProps(disk->src))) + return -1; + + return 0; } --=20 2.16.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 16:06:15 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1527787873106798.2590630327926; Thu, 31 May 2018 10:31:13 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 581FB359553; Thu, 31 May 2018 17:31:11 +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 16065608F0; Thu, 31 May 2018 17:31:11 +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 9ADF34CA81; Thu, 31 May 2018 17:31:10 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4VHUeck030253 for ; Thu, 31 May 2018 13:30:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5FDB8208C6C5; Thu, 31 May 2018 17:30:40 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.136]) by smtp.corp.redhat.com (Postfix) with ESMTP id 040CA208C6C1 for ; Thu, 31 May 2018 17:30:39 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Thu, 31 May 2018 19:30:25 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/4] qemu: Split handling of managed and unmanaged persistent reservations 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: , MIME-Version: 1.0 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.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 31 May 2018 17:31:12 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add code that will handle the managed persistent reservations object separately from the unmanaged one. There is only one managed object so handling it with disks is awkward and does not scale well when backing chains come into view. Signed-off-by: Peter Krempa Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_command.c | 113 +++++++++++++++--= ---- src/qemu/qemu_command.h | 1 + src/qemu/qemu_hotplug.c | 104 ++++++++---------= -- ...isk-virtio-scsi-reservations.x86_64-latest.args | 4 +- 4 files changed, 130 insertions(+), 92 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2d559938ed..a42acb3cfc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2201,6 +2201,35 @@ qemuBulildFloppyCommandLineOptions(virCommandPtr cmd, } +static int +qemuBuildDiskUnmanagedPRCommandLine(virCommandPtr cmd, + virStorageSourcePtr src) +{ + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + virJSONValuePtr props =3D NULL; + int ret =3D -1; + + if (!src->pr || + virStoragePRDefIsManaged(src->pr)) + return 0; + + if (!(props =3D qemuBuildPRManagerInfoProps(src))) + return -1; + + if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + goto cleanup; + + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); + + ret =3D 0; + cleanup: + virBufferFreeAndReset(&buf); + virJSONValueFree(props); + return ret; +} + + static int qemuBuildDiskDriveCommandLine(virCommandPtr cmd, const virDomainDef *def, @@ -2268,6 +2297,9 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, } } + if (qemuBuildDiskUnmanagedPRCommandLine(cmd, disk->src) < 0) + return -1; + if (qemuBuildDiskSecinfoCommandLine(cmd, secinfo) < 0) return -1; @@ -9689,58 +9721,77 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, } +static virJSONValuePtr +qemuBuildPRManagerInfoPropsInternal(const char *alias, + const char *path) +{ + virJSONValuePtr ret =3D NULL; + + if (qemuMonitorCreateObjectProps(&ret, + "pr-manager-helper", alias, + "s:path", path, NULL) < 0) + return NULL; + + return ret; +} + + /** - * qemuBuildPRManagerInfoProps: - * @src: storage source + * qemuBuildPRManagedManagerInfoProps: * - * Build the JSON properties for the pr-manager object. + * Build the JSON properties for the pr-manager object corresponding to th= e PR + * daemon managed by libvirt. */ virJSONValuePtr -qemuBuildPRManagerInfoProps(virStorageSourcePtr src) +qemuBuildPRManagedManagerInfoProps(qemuDomainObjPrivatePtr priv) { + char *path =3D NULL; virJSONValuePtr ret =3D NULL; - if (qemuMonitorCreateObjectProps(&ret, - "pr-manager-helper", src->pr->mgralia= s, - "s:path", src->pr->path, NULL) < 0) + if (!(path =3D qemuDomainGetManagedPRSocketPath(priv))) return NULL; + ret =3D qemuBuildPRManagerInfoPropsInternal(qemuDomainGetManagedPRAlia= s(), + path); + + VIR_FREE(path); return ret; } +/** + * qemuBuildPRManagerInfoProps: + * @src: storage source + * + * Build the JSON properties for the pr-manager object. + */ +virJSONValuePtr +qemuBuildPRManagerInfoProps(virStorageSourcePtr src) +{ + return qemuBuildPRManagerInfoPropsInternal(src->pr->mgralias, src->pr-= >path); +} + + static int -qemuBuildMasterPRCommandLine(virCommandPtr cmd, - const virDomainDef *def) +qemuBuildManagedPRCommandLine(virCommandPtr cmd, + const virDomainDef *def, + qemuDomainObjPrivatePtr priv) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; - size_t i; - bool managedAdded =3D false; virJSONValuePtr props =3D NULL; int ret =3D -1; - for (i =3D 0; i < def->ndisks; i++) { - const virDomainDiskDef *disk =3D def->disks[i]; - - if (!disk->src->pr) - continue; - - if (virStoragePRDefIsManaged(disk->src->pr)) { - if (managedAdded) - continue; - - managedAdded =3D true; - } + if (!virDomainDefHasManagedPR(def)) + return 0; - if (!(props =3D qemuBuildPRManagerInfoProps(disk->src))) - goto cleanup; + if (!(props =3D qemuBuildPRManagedManagerInfoProps(priv))) + return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) - goto cleanup; + if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + goto cleanup; - virCommandAddArg(cmd, "-object"); - virCommandAddArgBuffer(cmd, &buf); - } + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); ret =3D 0; cleanup: @@ -9955,7 +10006,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, if (qemuBuildMasterKeyCommandLine(cmd, priv) < 0) goto error; - if (qemuBuildMasterPRCommandLine(cmd, def) < 0) + if (qemuBuildManagedPRCommandLine(cmd, def, priv) < 0) goto error; if (enableFips) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 10aa21bcdd..b7580b4796 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -56,6 +56,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr drive= r, /* Generate the object properties for pr-manager */ virJSONValuePtr qemuBuildPRManagerInfoProps(virStorageSourcePtr src); +virJSONValuePtr qemuBuildPRManagedManagerInfoProps(qemuDomainObjPrivatePtr= priv); /* Generate the object properties for a secret */ int qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index e78aff7adf..21503b3905 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -351,60 +351,40 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr drive= r, * qemuDomainMaybeStartPRDaemon: * @vm: domain object * @disk: disk to hotplug + * @retProps: properties of the managed pr-manager-helper object which nee= ds + * to be added to the running vm * - * Checks if it's needed to start qemu-pr-helper and starts it. + * Checks if it's needed to start qemu-pr-helper and add the corresponding + * pr-manager-helper object. * - * Returns: 0 if qemu-pr-helper is not needed - * 1 if it is needed and was started - * -1 otherwise. + * Returns: 0 on success, -1 on error. If @retProps is populated the + * qemu-pr-helper daemon was started. */ static int -qemuDomainMaybeStartPRDaemon(virDomainObjPtr vm, - virDomainDiskDefPtr disk) +qemuDomainDiskAttachManagedPR(virDomainObjPtr vm, + virDomainDiskDefPtr disk, + virJSONValuePtr *retProps) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + virJSONValuePtr props =3D NULL; + int ret =3D -1; - if (!virStoragePRDefIsManaged(disk->src->pr)) { - /* @disk itself does not require qemu-pr-helper. */ - return 0; - } - - if (priv->prDaemonRunning) { - /* @disk requires qemu-pr-helper but there's already one running. = */ + if (priv->prDaemonRunning || + !virStorageSourceChainHasManagedPR(disk->src)) return 0; - } - /* @disk requires qemu-pr-helper but none is running. - * Start it now. */ - if (qemuProcessStartManagedPRDaemon(vm) < 0) + if (!(props =3D qemuBuildPRManagedManagerInfoProps(priv))) return -1; - return 1; -} - - -static int -qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm, - const virDomainDiskDef *disk, - virJSONValuePtr *propsret) -{ - qemuDomainObjPrivatePtr priv =3D vm->privateData; - - *propsret =3D NULL; - - if (!disk->src->pr) - return 0; - - if (virStoragePRDefIsManaged(disk->src->pr) && - priv->prDaemonRunning) { - /* @disk requires qemu-pr-helper but there's already one running. = */ - return 0; - } + if (qemuProcessStartManagedPRDaemon(vm) < 0) + goto cleanup; - if (!(*propsret =3D qemuBuildPRManagerInfoProps(disk->src))) - return -1; + VIR_STEAL_PTR(*retProps, props); + ret =3D 0; - return 0; + cleanup: + virJSONValueFree(props); + return ret; } @@ -419,21 +399,21 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, virDomainDiskDefPtr disk) { int ret =3D -1; - int rv; qemuDomainObjPrivatePtr priv =3D vm->privateData; virErrorPtr orig_err; char *devstr =3D NULL; char *drivestr =3D NULL; char *drivealias =3D NULL; - char *prmgrAlias =3D NULL; + char *unmanagedPrmgrAlias =3D NULL; + char *managedPrmgrAlias =3D NULL; char *encobjAlias =3D NULL; char *secobjAlias =3D NULL; bool driveAdded =3D false; - bool prdStarted =3D false; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); virJSONValuePtr secobjProps =3D NULL; virJSONValuePtr encobjProps =3D NULL; - virJSONValuePtr prmgrProps =3D NULL; + virJSONValuePtr unmanagedPrmgrProps =3D NULL; + virJSONValuePtr managedPrmgrProps =3D NULL; qemuDomainStorageSourcePrivatePtr srcPriv; qemuDomainSecretInfoPtr secinfo =3D NULL; qemuDomainSecretInfoPtr encinfo =3D NULL; @@ -461,16 +441,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0) goto error; - if (qemuMaybeBuildPRManagerInfoProps(vm, disk, &prmgrProps) < 0) + if (qemuDomainDiskAttachManagedPR(vm, disk, &managedPrmgrProps) < 0) goto error; - /* Start daemon only after prmgrProps is built. Otherwise - * qemuDomainMaybeStartPRDaemon() might start daemon and set - * priv->prDaemonRunning which confuses props building code. */ - if ((rv =3D qemuDomainMaybeStartPRDaemon(vm, disk)) < 0) + if (disk->src->pr && + virStoragePRDefIsManaged(disk->src->pr) && + !(unmanagedPrmgrProps =3D qemuBuildPRManagerInfoProps(disk->src))) goto error; - else if (rv > 0) - prdStarted =3D true; if (disk->src->haveTLS && qemuDomainAddDiskSrcTLSObject(driver, vm, disk->src) < 0) @@ -498,8 +475,12 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, qemuMonitorAddObject(priv->mon, &encobjProps, &encobjAlias) < 0) goto exit_monitor; - if (prmgrProps && - qemuMonitorAddObject(priv->mon, &prmgrProps, &prmgrAlias) < 0) + if (managedPrmgrProps && + qemuMonitorAddObject(priv->mon, &managedPrmgrProps, &managedPrmgrA= lias) < 0) + goto exit_monitor; + + if (unmanagedPrmgrProps && + qemuMonitorAddObject(priv->mon, &unmanagedPrmgrProps, &unmanagedPr= mgrAlias) < 0) goto exit_monitor; if (qemuMonitorAddDrive(priv->mon, drivestr) < 0) @@ -520,11 +501,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, ret =3D 0; cleanup: - virJSONValueFree(prmgrProps); + virJSONValueFree(managedPrmgrProps); + virJSONValueFree(unmanagedPrmgrProps); virJSONValueFree(encobjProps); virJSONValueFree(secobjProps); qemuDomainSecretDiskDestroy(disk); - VIR_FREE(prmgrAlias); + VIR_FREE(managedPrmgrAlias); + VIR_FREE(unmanagedPrmgrAlias); VIR_FREE(secobjAlias); VIR_FREE(encobjAlias); VIR_FREE(drivealias); @@ -543,8 +526,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias)); if (encobjAlias) ignore_value(qemuMonitorDelObject(priv->mon, encobjAlias)); - if (prmgrAlias) - ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias)); + if (unmanagedPrmgrAlias) + ignore_value(qemuMonitorDelObject(priv->mon, unmanagedPrmgrAlias)); + if (managedPrmgrAlias) + ignore_value(qemuMonitorDelObject(priv->mon, managedPrmgrAlias)); if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -2; virErrorRestore(&orig_err); @@ -554,7 +539,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, error: qemuDomainDelDiskSrcTLSObject(driver, vm, disk->src); ignore_value(qemuHotplugPrepareDiskAccess(driver, vm, disk, NULL, true= )); - if (prdStarted) + if (priv->prDaemonRunning && + !virDomainDefHasManagedPR(vm->def)) qemuProcessKillManagedPRDaemon(vm); goto cleanup; } diff --git a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-la= test.args b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-lat= est.args index 768bc22f9f..90843a19f5 100644 --- a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.ar= gs +++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-latest.ar= gs @@ -11,8 +11,6 @@ QEMU_AUDIO_DRV=3Dnone \ file=3D/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -object pr-manager-helper,id=3Dpr-helper0,\ path=3D/tmp/lib/domain--1-QEMUGuest1/pr-helper0.sock \ --object pr-manager-helper,id=3Dpr-helper-scsi0-0-0-1,\ -path=3D/path/to/qemu-pr-helper.sock \ -machine pc-i440fx-2.12,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff \ -m 214 \ -realtime mlock=3Doff \ @@ -34,6 +32,8 @@ server,nowait \ if=3Dnone,id=3Ddrive-scsi0-0-0-0 \ -device scsi-block,bus=3Dscsi0.0,channel=3D0,scsi-id=3D0,lun=3D0,\ drive=3Ddrive-scsi0-0-0-0,id=3Dscsi0-0-0-0,bootindex=3D1 \ +-object pr-manager-helper,id=3Dpr-helper-scsi0-0-0-1,\ +path=3D/path/to/qemu-pr-helper.sock \ -drive file=3D/dev/HostVG/QEMUGuest2,file.pr-manager=3Dpr-helper-scsi0-0-0= -1,\ format=3Draw,if=3Dnone,id=3Ddrive-scsi0-0-0-1 \ -device scsi-block,bus=3Dscsi0.0,channel=3D0,scsi-id=3D0,lun=3D1,\ --=20 2.16.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list