From nobody Mon Feb 9 13:25:05 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 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=1621601356; cv=none; d=zohomail.com; s=zohoarc; b=P3vyZHPzLhkqJHPaHbFpWGrdkDL6f+e5LRxqzB6jwEmZjSUd/GGK1nWYiXCKP1QMkIUMpD/YutyTy2lJstakruQ+qBKV6ztvVkQ4/b31776Uv3gA9dEbHoSdFF/J07oYq3mxB9TZUgRSd/fz5dp1p3DsyGMU9bzhInIvQnzAeIM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621601356; 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; bh=yjmqBaVZDTziBjRVK7mw16rdycggNWgRqf0HDR+fWLE=; b=H6eDXeazCasfcWSwJNfH7Fm/Q9nOb7TB4LAlqmyPF16DunXeHobm3Nbg7tJ+bD+JMBiY2Dnfkaoqn2cVcy7unQiSnRCDRhUgqUYZfJz7DejNuZIorcUmN+dyjF4bophOhjTaPH2q7HMsPcYTNWRkq7G1SpuXUgKdwrop5jukH+w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1621601356872946.3032234411093; Fri, 21 May 2021 05:49:16 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-26-SuuIOcZJMX-K_Uy36cCwHA-1; Fri, 21 May 2021 08:48:12 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id ACD286972D; Fri, 21 May 2021 12:48:03 +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 6483C1037E86; Fri, 21 May 2021 12:48:03 +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 261451801267; Fri, 21 May 2021 12:48:03 +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 14LClmKx030976 for ; Fri, 21 May 2021 08:47:48 -0400 Received: by smtp.corp.redhat.com (Postfix) id DE58750F89; Fri, 21 May 2021 12:47:48 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.14]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4189E421F for ; Fri, 21 May 2021 12:47:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621601355; h=from:from:sender:sender: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: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=yjmqBaVZDTziBjRVK7mw16rdycggNWgRqf0HDR+fWLE=; b=FUov3IlaeJzPDsqUF1Q44ymcUi15B16keuQJk7SRF1NPE2ncvG4Y2VRp2W/VfRdMafERZ1 EceqO3HVMKS1pGmGAkCZxpBZp3N9cvNaMiUjZ/4hO6IY6Kph922oNPZLGfc+IkhZbBKOYw ZNAeqIJBNmHeXbkl3x3N+1/G1S6cTUU= X-MC-Unique: SuuIOcZJMX-K_Uy36cCwHA-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 07/35] qemu: snapshot: move transient snapshot code to qemu_process Date: Fri, 21 May 2021 14:47:07 +0200 Message-Id: <1a3966cf749821a03a395ac2e12fd9a5ad81c769.1621601160.git.pkrempa@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 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The code deals with the startup of the VM and just uses the snapshot code to achieve the desired outcome. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_process.c | 61 +++++++++++++++++++++++++++++- src/qemu/qemu_snapshot.c | 82 +++------------------------------------- src/qemu/qemu_snapshot.h | 26 ++++++++++++- 3 files changed, 89 insertions(+), 80 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 543b50f875..9222f16caa 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6937,6 +6937,65 @@ qemuProcessEnablePerf(virDomainObj *vm) } +static int +qemuProcessSetupDisksTransientSnapshot(virDomainObj *vm, + qemuDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(qemuSnapshotDiskContext) snapctxt =3D NULL; + g_autoptr(GHashTable) blockNamedNodeData =3D NULL; + size_t i; + + if (!(blockNamedNodeData =3D qemuBlockGetNamedNodeData(vm, asyncJob))) + return -1; + + snapctxt =3D qemuSnapshotDiskContextNew(vm->def->ndisks, vm, asyncJob); + + for (i =3D 0; i < vm->def->ndisks; i++) { + virDomainDiskDef *domdisk =3D vm->def->disks[i]; + g_autoptr(virDomainSnapshotDiskDef) snapdisk =3D NULL; + + if (!domdisk->transient) + continue; + + /* validation code makes sure that we do this only for local disks + * with a file source */ + + snapdisk =3D qemuSnapshotGetTransientDiskDef(domdisk); + + if (qemuSnapshotDiskPrepareOne(snapctxt, domdisk, snapdisk, + blockNamedNodeData, + false, + false) < 0) + return -1; + } + + if (qemuSnapshotDiskCreate(snapctxt) < 0) + return -1; + + /* the overlays are established, so they can be deleted on shutdown */ + priv->inhibitDiskTransientDelete =3D false; + + return 0; +} + + +static int +qemuProcessSetupDisksTransient(virDomainObj *vm, + qemuDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + + if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV))) + return 0; + + if (qemuProcessSetupDisksTransientSnapshot(vm, asyncJob) < 0) + return -1; + + return 0; +} + + /** * qemuProcessLaunch: * @@ -7291,7 +7350,7 @@ qemuProcessLaunch(virConnectPtr conn, if (!incoming && !snapshot) { VIR_DEBUG("Setting up transient disk"); - if (qemuSnapshotCreateDisksTransient(vm, asyncJob) < 0) + if (qemuProcessSetupDisksTransient(vm, asyncJob) < 0) goto cleanup; } diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 8855a019cb..928b7af287 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -906,7 +906,7 @@ struct _qemuSnapshotDiskContext { typedef struct _qemuSnapshotDiskContext qemuSnapshotDiskContext; -static qemuSnapshotDiskContext * +qemuSnapshotDiskContext * qemuSnapshotDiskContextNew(size_t ndisks, virDomainObj *vm, qemuDomainAsyncJob asyncJob) @@ -925,7 +925,7 @@ qemuSnapshotDiskContextNew(size_t ndisks, } -static void +void qemuSnapshotDiskContextCleanup(qemuSnapshotDiskContext *snapctxt) { if (!snapctxt) @@ -940,8 +940,6 @@ qemuSnapshotDiskContextCleanup(qemuSnapshotDiskContext = *snapctxt) g_free(snapctxt); } -G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuSnapshotDiskContext, qemuSnapshotDiskCon= textCleanup); - /** * qemuSnapshotDiskBitmapsPropagate: @@ -1032,7 +1030,7 @@ qemuSnapshotDiskPrepareOneBlockdev(virQEMUDriver *dri= ver, } -static int +int qemuSnapshotDiskPrepareOne(qemuSnapshotDiskContext *snapctxt, virDomainDiskDef *disk, virDomainSnapshotDiskDef *snapdisk, @@ -1170,7 +1168,7 @@ qemuSnapshotDiskPrepareActiveExternal(virDomainObj *v= m, } -static virDomainSnapshotDiskDef * +virDomainSnapshotDiskDef * qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk) { g_autoptr(virDomainSnapshotDiskDef) snapdisk =3D g_new0(virDomainSnaps= hotDiskDef, 1); @@ -1193,39 +1191,6 @@ qemuSnapshotGetTransientDiskDef(virDomainDiskDef *do= mdisk) } -static qemuSnapshotDiskContext * -qemuSnapshotDiskPrepareDisksTransient(virDomainObj *vm, - GHashTable *blockNamedNodeData, - qemuDomainAsyncJob asyncJob) -{ - g_autoptr(qemuSnapshotDiskContext) snapctxt =3D NULL; - size_t i; - - snapctxt =3D qemuSnapshotDiskContextNew(vm->def->ndisks, vm, asyncJob); - - for (i =3D 0; i < vm->def->ndisks; i++) { - virDomainDiskDef *domdisk =3D vm->def->disks[i]; - g_autoptr(virDomainSnapshotDiskDef) snapdisk =3D NULL; - - if (!domdisk->transient) - continue; - - /* validation code makes sure that we do this only for local disks - * with a file source */ - - snapdisk =3D qemuSnapshotGetTransientDiskDef(domdisk); - - if (qemuSnapshotDiskPrepareOne(snapctxt, domdisk, snapdisk, - blockNamedNodeData, - false, - false) < 0) - return NULL; - } - - return g_steal_pointer(&snapctxt); -} - - static void qemuSnapshotDiskUpdateSourceRenumber(virStorageSource *src) { @@ -1284,7 +1249,7 @@ qemuSnapshotDiskUpdateSource(virDomainObj *vm, } -static int +int qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt) { qemuDomainObjPrivate *priv =3D snapctxt->vm->privateData; @@ -1352,43 +1317,6 @@ qemuSnapshotCreateActiveExternalDisks(virDomainObj *= vm, } -/** - * qemuSnapshotCreateDisksTransient: - * @vm: domain object - * @asyncJob: qemu async job type - * - * Creates overlays on top of disks which are configured as . = Note - * that the validation code ensures that disks have appropriate - * configuration. - */ -int -qemuSnapshotCreateDisksTransient(virDomainObj *vm, - qemuDomainAsyncJob asyncJob) -{ - qemuDomainObjPrivate *priv =3D vm->privateData; - g_autoptr(qemuSnapshotDiskContext) snapctxt =3D NULL; - g_autoptr(GHashTable) blockNamedNodeData =3D NULL; - - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { - if (!(blockNamedNodeData =3D qemuBlockGetNamedNodeData(vm, asyncJo= b))) - return -1; - - if (!(snapctxt =3D qemuSnapshotDiskPrepareDisksTransient(vm, - blockNamedN= odeData, - asyncJob))) - return -1; - - if (qemuSnapshotDiskCreate(snapctxt) < 0) - return -1; - } - - /* the overlays are established, so they can be deleted on shutdown */ - priv->inhibitDiskTransientDelete =3D false; - - return 0; -} - - static int qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, virDomainObj *vm, diff --git a/src/qemu/qemu_snapshot.h b/src/qemu/qemu_snapshot.h index 62ff22221d..4fba7e4e24 100644 --- a/src/qemu/qemu_snapshot.h +++ b/src/qemu/qemu_snapshot.h @@ -55,6 +55,28 @@ qemuSnapshotDelete(virDomainObj *vm, virDomainSnapshotPtr snapshot, unsigned int flags); + +typedef struct _qemuSnapshotDiskContext qemuSnapshotDiskContext; + +qemuSnapshotDiskContext * +qemuSnapshotDiskContextNew(size_t ndisks, + virDomainObj *vm, + qemuDomainAsyncJob asyncJob); + +void +qemuSnapshotDiskContextCleanup(qemuSnapshotDiskContext *snapctxt); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuSnapshotDiskContext, qemuSnapshotDiskCon= textCleanup); + +int +qemuSnapshotDiskPrepareOne(qemuSnapshotDiskContext *snapctxt, + virDomainDiskDef *disk, + virDomainSnapshotDiskDef *snapdisk, + GHashTable *blockNamedNodeData, + bool reuse, + bool updateConfig); int -qemuSnapshotCreateDisksTransient(virDomainObj *vm, - qemuDomainAsyncJob asyncJob); +qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt); + +virDomainSnapshotDiskDef * +qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk); --=20 2.31.1