From nobody Sun May 12 18:27:55 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1708955028221142.06448508059293; Mon, 26 Feb 2024 05:43:48 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 3273416D4; Mon, 26 Feb 2024 08:43:47 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 972421D0F; Mon, 26 Feb 2024 08:41:06 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 3450919EB; Mon, 26 Feb 2024 08:40:54 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 AB93E19EB for ; Mon, 26 Feb 2024 08:40:53 -0500 (EST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-52-_n6BvV1xP_iui1TWBw_k_w-1; Mon, 26 Feb 2024 08:40:52 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (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 mimecast-mx02.redhat.com (Postfix) with ESMTPS id BAAEA83B82A for ; Mon, 26 Feb 2024 13:40:51 +0000 (UTC) Received: from antique-work.redhat.com (unknown [10.45.226.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 63094112132A for ; Mon, 26 Feb 2024 13:40:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: _n6BvV1xP_iui1TWBw_k_w-1 From: Pavel Hrdina To: devel@lists.libvirt.org Subject: [libvirt PATCH 1/2] qemu_snapshot: call qemuSnapshotDeleteUpdateDisks only for external snapshots Date: Mon, 26 Feb 2024 14:40:49 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: IDFISRM3ZAUWGXFMEC6ZF37ABZNTXZNT X-Message-ID-Hash: IDFISRM3ZAUWGXFMEC6ZF37ABZNTXZNT X-MailFrom: phrdina@redhat.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 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: Content-Type: text/plain; charset="utf-8"; x-default="true" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1708955029684100001 Calling this function when deleting internal snapshot isn't required because with internal snapshots all changes are done within the file itself so there is no file deletion and no need to update snapshot metadata. Signed-off-by: Pavel Hrdina Reviewed-by: Peter Krempa --- src/qemu/qemu_snapshot.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 0cac0c4146..be089a31db 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -3537,14 +3537,16 @@ qemuSnapshotDiscardMetadata(virDomainObj *vm, if (rep.err < 0) ret =3D -1; =20 - data.snap =3D snap; - data.vm =3D vm; - data.error =3D 0; - virDomainMomentForEachDescendant(snap, - qemuSnapshotDeleteUpdateDisks, - &data); - if (data.error < 0) - ret =3D -1; + if (virDomainSnapshotIsExternal(snap)) { + data.snap =3D snap; + data.vm =3D vm; + data.error =3D 0; + virDomainMomentForEachDescendant(snap, + qemuSnapshotDeleteUpdateDisks, + &data); + if (data.error < 0) + ret =3D -1; + } =20 virDomainMomentMoveChildren(snap, snap->parent); } --=20 2.43.2 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org From nobody Sun May 12 18:27:55 2024 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1708955132871792.2580084724472; Mon, 26 Feb 2024 05:45:32 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id C603A175B; Mon, 26 Feb 2024 08:45:31 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 405091D95; Mon, 26 Feb 2024 08:41:18 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 1718A19EB; Mon, 26 Feb 2024 08:40:55 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 252261932 for ; Mon, 26 Feb 2024 08:40:54 -0500 (EST) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-297-V2hluPvCOBO7YEoWp9nu9A-1; Mon, 26 Feb 2024 08:40:52 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (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 mimecast-mx02.redhat.com (Postfix) with ESMTPS id 542DE106D063 for ; Mon, 26 Feb 2024 13:40:52 +0000 (UTC) Received: from antique-work.redhat.com (unknown [10.45.226.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id F045A1121312 for ; Mon, 26 Feb 2024 13:40:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: V2hluPvCOBO7YEoWp9nu9A-1 From: Pavel Hrdina To: devel@lists.libvirt.org Subject: [libvirt PATCH 2/2] qemu_snapshot: correctly update metadata when deleting external snapshot with multiple branches Date: Mon, 26 Feb 2024 14:40:50 +0100 Message-ID: <31399ead868e1c5d8877b1e5bd4351b54f3fdf0f.1708954737.git.phrdina@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: 366QDX4DPNP6Y4EJN74BIIT6ZYIUWAS3 X-Message-ID-Hash: 366QDX4DPNP6Y4EJN74BIIT6ZYIUWAS3 X-MailFrom: phrdina@redhat.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 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: Content-Type: text/plain; charset="utf-8"; x-default="true" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1708955134041100001 XML metadata for snapshot contains only single list of disk overlays from the moment when the snapshot was taken. When user creates multiple branches of snapshots the parent snapshot will still list only the original disk overlays. This may cause an issue in a specific scenario: s1 | +- s2 +- s3 (active) For this snapshot topology when we delete s2 metadata for s1 are not updated. Now when we delete s1 the code operated with incorrect overlays from s1 metadata in order to update s3 metadata resulting in no changes to s3 metadata. Now when user tries to delete s3 it fails with following error: error: Failed to delete snapshot s3 error: operation failed: snapshot VM disk source and parent disk source= are not the same For the actual deletion there is a code to figure out the correct disk source but it was not used to update metadata as well. Due to reasons how block commit in libvirt works we need to create a copy of that disk source in order to have it available when updating metadata as the original source will be freed at that point. Resolves: https://issues.redhat.com/browse/RHEL-26276 Signed-off-by: Pavel Hrdina Reviewed-by: Peter Krempa --- src/qemu/qemu_snapshot.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index be089a31db..09ec959f10 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2639,6 +2639,8 @@ typedef struct _qemuSnapshotDeleteExternalData { virDomainSnapshotDiskDef *snapDisk; /* snapshot disk definition */ virDomainDiskDef *domDisk; /* VM disk definition */ virStorageSource *diskSrc; /* source of disk we are deleting */ + virStorageSource *diskSrcMetadata; /* copy of diskSrc to be used when = updating + metadata because diskSrc is free= d */ virDomainMomentObj *parentSnap; virDomainDiskDef *parentDomDisk; /* disk definition from snapshot meta= data */ virStorageSource *parentDiskSrc; /* backing disk source of the @diskSr= c */ @@ -2657,6 +2659,7 @@ qemuSnapshotDeleteExternalDataFree(qemuSnapshotDelete= ExternalData *data) if (!data) return; =20 + virObjectUnref(data->diskSrcMetadata); virObjectUnref(data->job); g_slist_free_full(data->disksWithBacking, g_free); =20 @@ -2893,6 +2896,8 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *v= m, if (!data->diskSrc) return -1; =20 + data->diskSrcMetadata =3D virStorageSourceCopy(data->diskS= rc, false); + if (!virStorageSourceIsSameLocation(data->diskSrc, snapDis= kSrc)) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("VM disk source and snapshot disk sou= rce are not the same")); @@ -3049,6 +3054,7 @@ typedef struct _qemuSnapshotUpdateDisksData qemuSnaps= hotUpdateDisksData; struct _qemuSnapshotUpdateDisksData { virDomainMomentObj *snap; virDomainObj *vm; + GSList *externalData; int error; }; =20 @@ -3078,7 +3084,8 @@ static int qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap, virDomainDef *def, virDomainDef *parentDef, - virDomainSnapshotDiskDef *snapDisk) + virDomainSnapshotDiskDef *snapDisk, + virStorageSource *diskSrc) { virDomainDiskDef *disk =3D NULL; =20 @@ -3091,7 +3098,7 @@ qemuSnapshotUpdateDisksSingle(virDomainMomentObj *sna= p, if (!(parentDisk =3D qemuDomainDiskByName(parentDef, snapDisk->nam= e))) return -1; =20 - if (virStorageSourceIsSameLocation(snapDisk->src, disk->src)) { + if (virStorageSourceIsSameLocation(diskSrc, disk->src)) { virObjectUnref(disk->src); disk->src =3D virStorageSourceCopy(parentDisk->src, false); } @@ -3102,7 +3109,7 @@ qemuSnapshotUpdateDisksSingle(virDomainMomentObj *sna= p, virStorageSource *next =3D disk->src->backingStore; =20 while (next) { - if (virStorageSourceIsSameLocation(snapDisk->src, next)) { + if (virStorageSourceIsSameLocation(diskSrc, next)) { cur->backingStore =3D next->backingStore; next->backingStore =3D NULL; virObjectUnref(next); @@ -3128,17 +3135,15 @@ qemuSnapshotDeleteUpdateDisks(void *payload, qemuDomainObjPrivate *priv =3D data->vm->privateData; virQEMUDriver *driver =3D priv->driver; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); - virDomainSnapshotDef *snapdef =3D virDomainSnapshotObjGetDef(data->sna= p); - ssize_t i; + GSList *cur =3D NULL; =20 - for (i =3D 0; i < snapdef->ndisks; i++) { - virDomainSnapshotDiskDef *snapDisk =3D &(snapdef->disks[i]); - - if (snapDisk->snapshot =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_NO) - continue; + for (cur =3D data->externalData; cur; cur =3D g_slist_next(cur)) { + qemuSnapshotDeleteExternalData *curdata =3D cur->data; =20 if (qemuSnapshotUpdateDisksSingle(snap, snap->def->dom, - data->snap->def->dom, snapDisk) = < 0) { + data->snap->def->dom, + curdata->snapDisk, + curdata->diskSrcMetadata) < 0) { data->error =3D -1; } =20 @@ -3149,7 +3154,8 @@ qemuSnapshotDeleteUpdateDisks(void *payload, dom =3D data->snap->def->dom; =20 if (qemuSnapshotUpdateDisksSingle(snap, snap->def->inactiveDom, - dom, snapDisk) < 0) { + dom, curdata->snapDisk, + curdata->diskSrcMetadata) < = 0) { data->error =3D -1; } } @@ -3513,6 +3519,7 @@ qemuSnapshotDeleteUpdateParent(virDomainObj *vm, static int qemuSnapshotDiscardMetadata(virDomainObj *vm, virDomainMomentObj *snap, + GSList *externalData, bool update_parent) { qemuDomainObjPrivate *priv =3D vm->privateData; @@ -3540,6 +3547,7 @@ qemuSnapshotDiscardMetadata(virDomainObj *vm, if (virDomainSnapshotIsExternal(snap)) { data.snap =3D snap; data.vm =3D vm; + data.externalData =3D externalData; data.error =3D 0; virDomainMomentForEachDescendant(snap, qemuSnapshotDeleteUpdateDisks, @@ -3643,7 +3651,7 @@ qemuSnapshotDiscardImpl(virQEMUDriver *driver, } } =20 - if (qemuSnapshotDiscardMetadata(vm, snap, update_parent) < 0) + if (qemuSnapshotDiscardMetadata(vm, snap, externalData, update_parent)= < 0) return -1; =20 return 0; --=20 2.43.2 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org