From nobody Sun Sep 7 23:51:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1755778599; cv=none; d=zohomail.com; s=zohoarc; b=B7k0DRwRUQrJe+oIOOSsSSRIpIHYeoM1rM/wEgN1K0go0DTrcUA6zVfpoUJ6JItrRawx8DJlubCHE5nL55zNxwT2mdqqlnezQra29FGdtOv8NSf8mr+D9liWgzdgtY3O3dVeWx7YFNq7u2TI8qZP7KUv3HYNCQ9oFeX7XbVu974= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755778599; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=bs/cMsbmsIGpZ8qKAO2to3d47uYql/DfrAafIXQUZfE=; b=GgUhc79KmmER5WS0MfKFPHM79xiOXmy3jpCWAXYPAfQ/0JfJNonRNMTUbfGkW5CwTvc64gjSHQ5o2J7wBawWGr2oOWOHl17CQ2MD4HIvUFwA2XhzFGOyz4wuePEKiRLlbgE/o8szXI/PrqsZKfNLtDh3cMTmKS4qmwAysU1PVyI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1755778599558318.85616535949885; Thu, 21 Aug 2025 05:16:39 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id A7E4B12C2; Thu, 21 Aug 2025 08:16:38 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 95B3F1361; Thu, 21 Aug 2025 08:12:59 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id ECE40E75; Thu, 21 Aug 2025 08:12:56 -0400 (EDT) Received: from relay.virtuozzo.com (relay.virtuozzo.com [130.117.225.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 6633612A0 for ; Thu, 21 Aug 2025 08:12:51 -0400 (EDT) Received: from [130.117.225.5] (helo=vz9-barybin-2.ch-qa.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1up3QC-004YJR-31; Thu, 21 Aug 2025 13:56:58 +0200 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=YDBrL1Mtg177tei7p/iBRDr6/CwPel2G3+vdgBC8bgI=; b=esPhaDZ5ybB5 5pdMeW4gUrr6R1o3hkHg08JwBCCXfDRVD5GAdQvdCkMLu/FGrmhRgLCZKqCtE0Zc5b5hK9fdgypYH Jnq2Hw1x80j7OXJBxh9wcuf9zsw6tOBRn7bPOflDw1nMg8qR9MEBEd6UKDJdAp8JSq/5VtUy7oJea C3RmK5z7nqBNsGemn13GyFoiN7qkLK7yZH0hik5KgnL9dTBxC8BchJvjFiyJg8MwHxloV/nAOYAn+ SNPCh3kAYA9A/W0BjKX9vNCtJ4H61iJg2Ulcb4yd5EMcnAU4vCJR6j8ATBT9F4E6VGWpPccVGkthG n0oIp82u4WFkvGbVCHG54A==; To: devel@lists.libvirt.org Subject: [PATCH 1/2] api: remote: introduce virDomainBlockRebase2 API Date: Thu, 21 Aug 2025 14:51:36 +0300 Message-ID: <20250821115652.21045-2-nikolai.barybin@virtuozzo.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250821115652.21045-1-nikolai.barybin@virtuozzo.com> References: <20250821115652.21045-1-nikolai.barybin@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JDIZPX4EIKRAFRGEZSO5ABBMAAF6KRUO X-Message-ID-Hash: JDIZPX4EIKRAFRGEZSO5ABBMAAF6KRUO X-MailFrom: nikolai.barybin@virtuozzo.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: den@openvz.org, Nikolai Barybin X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Nikolai Barybin via Devel Reply-To: Nikolai Barybin X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1755778602846116600 Content-Type: text/plain; charset="utf-8" This new API is a superset of virDomainBlockPull and virDomainBlockRebase which supports extendable list of virTypedParameterPtr params. If "base" =3D=3D NULL and flags =3D=3D 0 it is equivalent to virDomainBlock= Pull. Signed-off-by: Nikolai Barybin --- include/libvirt/libvirt-domain.h | 20 +++++++++ src/driver-hypervisor.h | 8 ++++ src/libvirt-domain.c | 69 ++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 +++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 17 +++++++- src/remote_protocol-structs | 10 +++++ 7 files changed, 129 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 71bb49fe6c..cd33001fb4 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4459,6 +4459,26 @@ int virDomainBlockRebase(virDomainPtr dom, const cha= r *disk, const char *base, unsigned long bandwidth, unsigned int flags); =20 +/** + * VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE: + * Macro for the virDomainBlockRebase2 parameter 'base' + * + * Since: 11.6.0 + */ +#define VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE "base" + +/** + * VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH: + * Macro for the virDomainBlockRebase2 parameter 'bandwidth' + * + * Since: 11.6.0 + */ +#define VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH "bandwidth" + +int virDomainBlockRebase2(virDomainPtr dom, const char *disk, + virTypedParameterPtr params, int nparams, + unsigned int flags); + /** * virDomainBlockCopyFlags: * diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 6a43688b0c..e64e00674c 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1089,6 +1089,13 @@ typedef int unsigned long bandwidth, unsigned int flags); =20 +typedef int +(*virDrvDomainBlockRebase2)(virDomainPtr dom, + const char *path, + virTypedParameterPtr params, + int nparams, + unsigned int flags); + typedef int (*virDrvDomainBlockCopy)(virDomainPtr dom, const char *path, @@ -1681,6 +1688,7 @@ struct _virHypervisorDriver { virDrvDomainBlockJobSetSpeed domainBlockJobSetSpeed; virDrvDomainBlockPull domainBlockPull; virDrvDomainBlockRebase domainBlockRebase; + virDrvDomainBlockRebase2 domainBlockRebase2; virDrvDomainBlockCopy domainBlockCopy; virDrvDomainBlockCommit domainBlockCommit; virDrvConnectSetKeepAlive connectSetKeepAlive; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index ca110bdf85..7924a0d6cc 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -11197,6 +11197,75 @@ virDomainBlockRebase(virDomainPtr dom, const char = *disk, } =20 =20 +/** + * virDomainBlockRebase2: + * @dom: pointer to domain object + * @disk: path to the block device, or device shorthand + * @params: pointer to block rebase parameter + * @nparams: number of block rebase parameters + * @flags: bitwise-OR of virDomainBlockRebaseFlags + * + * Generalized version of virDomainBlockRebase() which can act either as + * virDomainBlockRebase() or virDomainBlockPull() depending on @params and= @flags. + * + * Returns 0 if the operation has started, -1 on failure. + * + * Since: 11.6.0 + */ +int +virDomainBlockRebase2(virDomainPtr dom, + const char *disk, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(dom, "disk=3D%s, params=3D%p, nparams=3D%u, flags=3D0= x%x", + disk, params, nparams, flags); + VIR_TYPED_PARAMS_DEBUG(params, nparams); + + virResetLastError(); + + virCheckDomainReturn(dom, -1); + conn =3D dom->conn; + + virCheckReadOnlyGoto(conn->flags, error); + virCheckNonNullArgGoto(disk, error); + + if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY) { + const char *base =3D NULL; + if (virTypedParamsGetString(params, nparams, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE, + &base) <=3D 0 || + base =3D=3D NULL) + goto error; + } else if (flags & (VIR_DOMAIN_BLOCK_REBASE_SHALLOW | + VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT | + VIR_DOMAIN_BLOCK_REBASE_COPY_RAW | + VIR_DOMAIN_BLOCK_REBASE_COPY_DEV)) { + virReportInvalidArg(flags, "%s", + _("use of flags requires a copy job")); + goto error; + } + + if (conn->driver->domainBlockRebase2) { + int ret; + ret =3D conn->driver->domainBlockRebase2(dom, disk, params, nparam= s, + flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(dom->conn); + return -1; +} + + /** * virDomainBlockCopy: * @dom: pointer to domain object diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index c506acd2ed..a1cb290c22 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -956,4 +956,9 @@ LIBVIRT_11.2.0 { virDomainDelThrottleGroup; } LIBVIRT_10.2.0; =20 +LIBVIRT_11.6.0 { + global: + virDomainBlockRebase2; +} LIBVIRT_11.2.0; + # .... define new API here using predicted next version number .... diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index ec71eaed87..5902b1f04b 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -7865,6 +7865,7 @@ static virHypervisorDriver hypervisor_driver =3D { .domainBlockJobSetSpeed =3D remoteDomainBlockJobSetSpeed, /* 0.9.4 */ .domainBlockPull =3D remoteDomainBlockPull, /* 0.9.4 */ .domainBlockRebase =3D remoteDomainBlockRebase, /* 0.9.10 */ + .domainBlockRebase2 =3D remoteDomainBlockRebase2, /* 11.6.0 */ .domainBlockCopy =3D remoteDomainBlockCopy, /* 1.2.9 */ .domainBlockCommit =3D remoteDomainBlockCommit, /* 0.10.2 */ .connectSetKeepAlive =3D remoteConnectSetKeepAlive, /* 0.9.8 */ diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 3c93203210..41a85a4f71 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -119,6 +119,9 @@ const REMOTE_DOMAIN_NUMA_PARAMETERS_MAX =3D 16; /* Upper limit on list of perf events. */ const REMOTE_DOMAIN_PERF_EVENTS_MAX =3D 64; =20 +/* Upper limit on block rebase2 tunable parameters. */ +const REMOTE_DOMAIN_BLOCK_REBASE2_PARAMETERS_MAX =3D 2; + /* Upper limit on block copy tunable parameters. */ const REMOTE_DOMAIN_BLOCK_COPY_PARAMETERS_MAX =3D 16; =20 @@ -1440,6 +1443,12 @@ struct remote_domain_block_rebase_args { unsigned hyper bandwidth; unsigned int flags; }; +struct remote_domain_block_rebase2_args { + remote_nonnull_domain dom; + remote_nonnull_string path; + remote_typed_param params; + unsigned int flags; +}; struct remote_domain_block_copy_args { remote_nonnull_domain dom; remote_nonnull_string path; @@ -7119,5 +7128,11 @@ enum remote_procedure { * @generate: both * @acl: none */ - REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453 + REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453, + + /** + * @generate: both + * @acl: domain:block_write + */ + REMOTE_PROC_DOMAIN_BLOCK_REBASE2 =3D 454 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 0f87d13a5a..9cfb476fd9 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1010,6 +1010,15 @@ struct remote_domain_block_rebase_args { uint64_t bandwidth; u_int flags; }; +struct remote_domain_block_rebase2_args { + remote_nonnull_domain dom; + remote_nonnull_string path; + struct { + u_int params_len; + remote_typed_param * params_val; + } params; + u_int flags; +}; struct remote_domain_block_copy_args { remote_nonnull_domain dom; remote_nonnull_string path; @@ -3791,4 +3800,5 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_THROTTLE_GROUP =3D 451, REMOTE_PROC_DOMAIN_DEL_THROTTLE_GROUP =3D 452, REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453, + REMOTE_PROC_DOMAIN_BLOCK_REBASE2 =3D 454, }; --=20 2.47.3 From nobody Sun Sep 7 23:51:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1755778448; cv=none; d=zohomail.com; s=zohoarc; b=kUbgi2kHYYuDtZ2SL9fWg85m2W6+CZm0NUZsIFTSEjEBvK5VveinxyokJalu3+/qIwwMhm1wjHwfF4SQfAYtExYo99qWSKbG5oDhwKBIvwwv+wzYM6U8PxavUUe7836kPTNOML1FnnAyAP1wJixl4ww0xLX8vPsAV++GtqixOCk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755778448; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=EUZOsF9VvwQgwoOaFIWmzotZ+Zy+iEnHFZhf28Zf1D0=; b=IIEBlnv5iSqbn2nPuKKSpjsz2lGBaYp1ptknyu4THDmU5Ye4bNI6K/KCEnFGT6+DE2aZdnLIpo63a6VZ/rFFDOLqBSJsIE7UCa7H50HRNwoUyYsP0Bx4CsDKs2/WiHZOnwizNWSCLh2dRx/BYZtjjipGCSmEdsfyoqngHY0SYnc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1755778448666234.7476523146563; Thu, 21 Aug 2025 05:14:08 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3BEE3132E; Thu, 21 Aug 2025 08:14:07 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id AB61412A9; Thu, 21 Aug 2025 08:12:57 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 2F87112A6; Thu, 21 Aug 2025 08:12:53 -0400 (EDT) Received: from relay.virtuozzo.com (relay.virtuozzo.com [130.117.225.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 50E18C86 for ; Thu, 21 Aug 2025 08:12:49 -0400 (EDT) Received: from [130.117.225.5] (helo=vz9-barybin-2.ch-qa.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1up3QE-004YJR-2T; Thu, 21 Aug 2025 13:57:00 +0200 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 X-Greylist: delayed 949 seconds by postgrey-1.37 at lists.libvirt.org; Thu, 21 Aug 2025 08:12:49 EDT DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=YLSrJUmS78vSAaS7gBBGM7HG0CNLJo++v3I31zntniE=; b=AwSSzTAxZIkD pDv4OPha5ztbZtAjXy0qQwRJC/mtJRJOBeOzQZN0G2YNLzDJoiqpuyOsojhpMjjZA2caiLf7SoPi6 EhhHlWPz9nkKVcTLTMYwD3l1ExaLW/+Z20lajKDcpgdCIAkLoD9nhvMqCv7ADuiTqcocsgYsuIHid uyyAOxocVRZcaAiTdmgwSDbYkJyWqo8ZK7JpBbjD231rvwzptJDuUOyeEdl37CiRc+WevUiu9WP1r razUgKiThEhxLovQEwSfDhdvaun9k5FHtFFlWQfFdek+TbFCUzPl57aHNfn0uvNV0E1fCEgf2muFu dIN6gIGO9wAc/XVg3udDDg==; To: devel@lists.libvirt.org Subject: [PATCH 2/2] qemu: implement driver support for domainBlockRebase2 API Date: Thu, 21 Aug 2025 14:51:37 +0300 Message-ID: <20250821115652.21045-3-nikolai.barybin@virtuozzo.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250821115652.21045-1-nikolai.barybin@virtuozzo.com> References: <20250821115652.21045-1-nikolai.barybin@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: FNY24TC3SWQJ5VGD4CIEHBBYGTEV6UAQ X-Message-ID-Hash: FNY24TC3SWQJ5VGD4CIEHBBYGTEV6UAQ X-MailFrom: nikolai.barybin@virtuozzo.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: den@openvz.org, Nikolai Barybin X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Nikolai Barybin via Devel Reply-To: Nikolai Barybin X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1755778451936116600 Content-Type: text/plain; charset="utf-8" Introduce qemuDomainBlockRebase2 which validates and parses list of params. Since new heavily reuses qemuDomainBlockRebase logic let's now make qemuDomainBlockPull and qemuDomainBlockRebase stub functions. Signed-off-by: Nikolai Barybin --- src/qemu/qemu_driver.c | 113 +++++++++++++++++++++++++++++++++-------- 1 file changed, 93 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ac72ea5cb0..405c20045c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14559,16 +14559,19 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, return ret; } =20 + static int -qemuDomainBlockRebase(virDomainPtr dom, - const char *path, - const char *base, - unsigned long bandwidth, - unsigned int flags) +qemuDomainBlockRebase2(virDomainPtr dom, + const char *path, + virTypedParameterPtr params, + int nparams, + unsigned int flags) { virDomainObj *vm; int ret =3D -1; - unsigned long long speed =3D bandwidth; + size_t i =3D 0; + unsigned long long bandwidth =3D 0; + const char *base =3D NULL; g_autoptr(virStorageSource) dest =3D NULL; =20 virCheckFlags(VIR_DOMAIN_BLOCK_REBASE_SHALLOW | @@ -14579,12 +14582,30 @@ qemuDomainBlockRebase(virDomainPtr dom, VIR_DOMAIN_BLOCK_REBASE_COPY_DEV | VIR_DOMAIN_BLOCK_REBASE_BANDWIDTH_BYTES, -1); =20 + if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE, + VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH, + VIR_TYPED_PARAM_ULLONG, + NULL) < 0) + return -1; + if (!(vm =3D qemuDomainObjFromDomain(dom))) return -1; =20 - if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0) + if (virDomainBlockRebase2EnsureACL(dom->conn, vm->def) < 0) goto cleanup; =20 + for (i =3D 0; i < nparams; i++) { + virTypedParameterPtr param =3D ¶ms[i]; + + if (STREQ(param->field, VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH)) { + bandwidth =3D param->value.ul; + } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE)= ) { + base =3D param->value.s; + } + } + /* For normal rebase (enhanced blockpull), the common code handles * everything, including vm cleanup. */ if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY)) @@ -14602,13 +14623,13 @@ qemuDomainBlockRebase(virDomainPtr dom, =20 /* Convert bandwidth MiB to bytes, if necessary */ if (!(flags & VIR_DOMAIN_BLOCK_REBASE_BANDWIDTH_BYTES)) { - if (speed > LLONG_MAX >> 20) { + if (bandwidth > LLONG_MAX >> 20) { virReportError(VIR_ERR_OVERFLOW, _("bandwidth must be less than %1$llu"), LLONG_MAX >> 20); goto cleanup; } - speed <<=3D 20; + bandwidth <<=3D 20; } =20 /* XXX: If we are doing a shallow copy but not reusing an external @@ -14626,7 +14647,7 @@ qemuDomainBlockRebase(virDomainPtr dom, flags &=3D (VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT); ret =3D qemuDomainBlockCopyCommon(vm, dom->conn, path, dest, - speed, 0, 0, flags, true); + bandwidth, 0, 0, flags, true); dest =3D NULL; =20 cleanup: @@ -14635,6 +14656,48 @@ qemuDomainBlockRebase(virDomainPtr dom, } =20 =20 +static int +qemuDomainBlockRebase(virDomainPtr dom, + const char *path, + const char *base, + unsigned long bandwidth, + unsigned int flags) +{ + int nparams =3D 0; + int maxparams =3D 0; + virTypedParameterPtr params =3D NULL; + int ret =3D -1; + + if (base && + virTypedParamsAddString(¶ms, &nparams, &maxparams, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE, + base) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to add param %1$s:%2$s to params list"), + VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE, base); + goto end; + } + + if (bandwidth > 0 && + virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH, + bandwidth) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to add param %1$s:%2$lu to params list"), + VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH, bandwidth); + goto end; + } + + ret =3D qemuDomainBlockRebase2(dom, path, params, nparams, flags); + + end: + virTypedParamsFree(params, nparams); + params =3D NULL; + nparams =3D 0; + return ret; +} + + static int qemuDomainBlockCopy(virDomainPtr dom, const char *disk, @@ -14722,19 +14785,28 @@ qemuDomainBlockPull(virDomainPtr dom, unsigned long bandwidth, unsigned int flags) { - virDomainObj *vm; - virCheckFlags(VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES, -1); - - if (!(vm =3D qemuDomainObjFromDomain(dom))) - return -1; + int nparams =3D 0; + int maxparams =3D 0; + virTypedParameterPtr params =3D NULL; + int ret =3D -1; =20 - if (virDomainBlockPullEnsureACL(dom->conn, vm->def) < 0) { - virDomainObjEndAPI(&vm); - return -1; + if (bandwidth > 0 && + virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH, + bandwidth) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to add param %1$s:%2$lu to params list"), + VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH, bandwidth); + goto end; } =20 - /* qemuDomainBlockPullCommon consumes the reference on @vm */ - return qemuDomainBlockPullCommon(vm, path, NULL, bandwidth, flags); + ret =3D qemuDomainBlockRebase2(dom, path, params, nparams, flags); + + end: + virTypedParamsFree(params, nparams); + params =3D NULL; + nparams =3D 0; + return ret; } =20 =20 @@ -20579,6 +20651,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainBlockJobSetSpeed =3D qemuDomainBlockJobSetSpeed, /* 0.9.4 */ .domainBlockPull =3D qemuDomainBlockPull, /* 0.9.4 */ .domainBlockRebase =3D qemuDomainBlockRebase, /* 0.9.10 */ + .domainBlockRebase2 =3D qemuDomainBlockRebase2, /* 11.6.0 */ .domainBlockCopy =3D qemuDomainBlockCopy, /* 1.2.9 */ .domainBlockCommit =3D qemuDomainBlockCommit, /* 1.0.0 */ .connectIsAlive =3D qemuConnectIsAlive, /* 0.9.8 */ --=20 2.47.3