From nobody Sun Apr 19 12:43:36 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; 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 38.145.34.151 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=1776241261; cv=none; d=zohomail.com; s=zohoarc; b=WyBHps9fa9Cgbz0W+tK01jB/nIonMec1wrF4MVBlJLXI59obxu+n1V7rQB4mC1oVGrgiPQbEavbCeYybxSjyedmNF9ptVsThL1Azpn3Bn7PdVqSSd3H/HbE2rnohjT3G4HOD2XRojH6Jv+ofC+ZsMNrS0Xs6gM+MphvMGQfE4h0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776241261; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Subject:Subject:To:To:Message-Id:Cc; bh=pRhYe3BWk3DMc2VE833zQmZ/gvuHHZ7EBmEqiDqKjes=; b=RlSbAjpybeeHDCKNQgGG8+m8f5QIAPvy0LL4IBfvN1rHK18BPrBVlkl45kKRUoRQajfcN+zKrJ9YEefLNKjhawoE5EigQicRXGR+n3xKucPhZ01vTxYx8pSuG6ckyC1LxCq0v+L2JcekDxYlqqI69nOB2Kc30XhXdLAgNHjm8xQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 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 [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776241261399253.10660051733237; Wed, 15 Apr 2026 01:21:01 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 192FA41841; Wed, 15 Apr 2026 04:20:59 -0400 (EDT) Received: from [172.19.199.3] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 5BF38418CF; Wed, 15 Apr 2026 04:20:04 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id BE8303F2F6; Wed, 15 Apr 2026 04:19:56 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id AA3B23F2F5 for ; Wed, 15 Apr 2026 04:19:55 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-527-aTy-nc7UMzaWXmiimxEX0w-1; Wed, 15 Apr 2026 04:19:54 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 343E619560AF for ; Wed, 15 Apr 2026 08:19:53 +0000 (UTC) Received: from speedmetal.lan (unknown [10.44.24.20]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5FFBC30001A5 for ; Wed, 15 Apr 2026 08:19:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,RCVD_IN_SBL_CSS,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776241195; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=pRhYe3BWk3DMc2VE833zQmZ/gvuHHZ7EBmEqiDqKjes=; b=dlnZvTamEeKpgA9csgo6s3D+YtUgoIsfJxqgbWm+tt7QndAQG7FHnZ//kX22AIQ0PvkSTZ LN5rE4G98M3Pr3k2oG8FrC7XYdG9f9DCBc6kUhVrWu1pQkDenjCUcP4ZtnnQaIfw30zkHK 5OQRaQ4zHZOu2hpcLBTpPbIEjR6YGBM= X-MC-Unique: aTy-nc7UMzaWXmiimxEX0w-1 X-Mimecast-MFC-AGG-ID: aTy-nc7UMzaWXmiimxEX0w_1776241193 To: devel@lists.libvirt.org Subject: [PATCH] qemu: Add support for 'VIR_DOMAIN_BLOCK_RESIZE_CAPACITY' with qcow2 using the 'data-file' feature Date: Wed, 15 Apr 2026 10:19:50 +0200 Message-ID: <81e9cf0f4843b6e0209855ede817f4287a58e347.1776241190.git.pkrempa@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 835-RVoJ_8B5gE49zSOGnz4SzBkbetYeyY4u4MuJyBE_1776241193 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: GZVMH4NNW6GUSIHVVOZTQAVKIVZBLZX2 X-Message-ID-Hash: GZVMH4NNW6GUSIHVVOZTQAVKIVZBLZX2 X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776241262244158501 Content-Type: text/plain; charset="utf-8" From: Peter Krempa If a qcow2 image uses a 'data-file' on a local block device we can still honour VIR_DOMAIN_BLOCK_RESIZE_CAPACITY but use the capacity of the data-file instead. The code is modified to first pick the virStorageSource which we'll probe for size based on the config of the VM and uses to determine the new size. Resolves: https://redhat.atlassian.net/browse/RHEL-155809 Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 49 ++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b5ea0086b9..997dbf986c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9446,6 +9446,7 @@ qemuDomainBlockResize(virDomainPtr dom, const char *nodename =3D NULL; virDomainDiskDef *disk =3D NULL; virDomainDiskDef *persistDisk =3D NULL; + virStorageSource *size_src =3D NULL; virCheckFlags(VIR_DOMAIN_BLOCK_RESIZE_BYTES | VIR_DOMAIN_BLOCK_RESIZE_CAPACITY | @@ -9495,36 +9496,46 @@ qemuDomainBlockResize(virDomainPtr dom, goto endjob; } - /* The physical capacity is needed both when automatic sizing is reque= sted - * and when a slice is used on top of a block device. + /* When resizing to capacity (or when resizing a device with a storage= slice + * -> effectively removing the slice) it's possible that we're dealing= with + * a qcow2 image using the 'data-file' feature in which case we want t= o use + * the size of the data file. Similarly all limitations about the supp= ort of + * VIR_DOMAIN_BLOCK_RESIZE_CAPACITY are based on the actual 'data-file' + * which stores the actual blocks and thus represents the capacity. */ - if (virStorageSourceIsBlockLocal(disk->src) && - ((flags & VIR_DOMAIN_BLOCK_RESIZE_CAPACITY) || - disk->src->sliceStorage)) { + if ((flags & VIR_DOMAIN_BLOCK_RESIZE_CAPACITY) || disk->src->sliceStor= age) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(priv= ->driver); - if (qemuDomainStorageUpdatePhysical(cfg, vm, disk->src) < 0) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("failed to update capacity of '%1$s'"), disk-= >src->path); - goto endjob; + if (disk->src->dataFileStore) + size_src =3D disk->src->dataFileStore; + else + size_src =3D disk->src; + + if (flags & VIR_DOMAIN_BLOCK_RESIZE_CAPACITY) { + if (!qemuBlockStorageSourceIsRaw(size_src) || + !virStorageSourceIsBlockLocal(size_src)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("block resize to full capacity supported = only with 'raw' or local block-based disks")); + goto endjob; + } } + if (virStorageSourceIsBlockLocal(size_src)) { + if (qemuDomainStorageUpdatePhysical(cfg, vm, size_src) < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("failed to update capacity of '%1$s'"), s= ize_src->path); + goto endjob; + } + } } if (flags & VIR_DOMAIN_BLOCK_RESIZE_CAPACITY) { - if (!qemuBlockStorageSourceIsRaw(disk->src) || - !virStorageSourceIsBlockLocal(disk->src)) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("block resize to full capacity supported only= with 'raw' local block-based disks")); - goto endjob; - } - if (size =3D=3D 0) { - size =3D disk->src->physical; - } else if (size !=3D disk->src->physical) { + size =3D size_src->physical; + } else if (size !=3D size_src->physical) { virReportError(VIR_ERR_INVALID_ARG, _("Requested resize to '%1$llu' but device size= is '%2$llu'"), - size, disk->src->physical); + size, size_src->physical); goto endjob; } } --=20 2.53.0