From nobody Sun Feb 8 16:50:17 2026 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 1553681270184259.47411410414986; Wed, 27 Mar 2019 03:07:50 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A6DC53082E51; Wed, 27 Mar 2019 10:07:48 +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 7A0C8271BF; Wed, 27 Mar 2019 10:07:48 +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 36EC81819AFA; Wed, 27 Mar 2019 10:07:48 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2RA7dsI022340 for ; Wed, 27 Mar 2019 06:07:39 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3E2161001E7F; Wed, 27 Mar 2019 10:07:39 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-59.phx2.redhat.com [10.3.116.59]) by smtp.corp.redhat.com (Postfix) with ESMTP id C2B1E1001E67; Wed, 27 Mar 2019 10:07:38 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 27 Mar 2019 05:07:14 -0500 Message-Id: <20190327100734.10225-4-eblake@redhat.com> In-Reply-To: <20190327100734.10225-1-eblake@redhat.com> References: <20190327100734.10225-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Cc: nsoffer@redhat.com Subject: [libvirt] [PATCH v7 03/23] snapshot: Refactor qemu to utilize virDomainMoment more 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: , 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.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Wed, 27 Mar 2019 10:07:49 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Use the common base class virDomainMoment for iterator callbacks related to snapshots from the qemu code, so that when checkpoint operations are introduced, they can share the same callbacks. Simplify the code for qemuDomainSnapshotCurrent by better utilizing virDomainMoment helpers. Signed-off-by: Eric Blake Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_domain.h | 20 +++++++++------- src/qemu/qemu_domain.c | 33 +++++++++++++------------- src/qemu/qemu_driver.c | 53 +++++++++++++++++++++++------------------- 3 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index ca24de15e5..00b497e6a6 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1,7 +1,7 @@ /* * qemu_domain.h: QEMU domain private state * - * Copyright (C) 2006-2016 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -38,6 +38,7 @@ # include "virchrdev.h" # include "virobject.h" # include "logging/log_manager.h" +# include "virdomainmomentobjlist.h" # define QEMU_DOMAIN_FORMAT_LIVE_FLAGS \ (VIR_DOMAIN_XML_SECURE) @@ -698,19 +699,22 @@ int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, bool update_current, bool metadata_only); -typedef struct _virQEMUSnapRemove virQEMUSnapRemove; -typedef virQEMUSnapRemove *virQEMUSnapRemovePtr; -struct _virQEMUSnapRemove { +typedef struct _virQEMUMomentRemove virQEMUMomentRemove; +typedef virQEMUMomentRemove *virQEMUMomentRemovePtr; +struct _virQEMUMomentRemove { virQEMUDriverPtr driver; virDomainObjPtr vm; int err; bool metadata_only; - bool current; + virDomainMomentObjPtr current; + bool found; + int (*momentDiscard)(virQEMUDriverPtr, virDomainObjPtr, + virDomainMomentObjPtr, bool, bool); }; -int qemuDomainSnapshotDiscardAll(void *payload, - const void *name, - void *data); +int qemuDomainMomentDiscardAll(void *payload, + const void *name, + void *data); int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver, virDomainObjPtr vm); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9ca4ca33e5..54afb6dd7b 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1,7 +1,7 @@ /* * qemu_domain.c: QEMU domain private state * - * Copyright (C) 2006-2016 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -8650,18 +8650,18 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } /* Hash iterator callback to discard multiple snapshots. */ -int qemuDomainSnapshotDiscardAll(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *data) +int qemuDomainMomentDiscardAll(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data) { - virDomainMomentObjPtr snap =3D payload; - virQEMUSnapRemovePtr curr =3D data; + virDomainMomentObjPtr moment =3D payload; + virQEMUMomentRemovePtr curr =3D data; int err; - if (virDomainSnapshotGetCurrent(curr->vm->snapshots) =3D=3D snap) - curr->current =3D true; - err =3D qemuDomainSnapshotDiscard(curr->driver, curr->vm, snap, false, - curr->metadata_only); + if (!curr->found && curr->current =3D=3D moment) + curr->found =3D true; + err =3D curr->momentDiscard(curr->driver, curr->vm, moment, false, + curr->metadata_only); if (err && !curr->err) curr->err =3D err; return 0; @@ -8671,14 +8671,13 @@ int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver, virDomainObjPtr vm) { - virQEMUSnapRemove rem; + virQEMUMomentRemove rem =3D { + .driver =3D driver, + .vm =3D vm, + .metadata_only =3D true + }; - rem.driver =3D driver; - rem.vm =3D vm; - rem.metadata_only =3D true; - rem.err =3D 0; - virDomainSnapshotForEach(vm->snapshots, qemuDomainSnapshotDiscardAll, - &rem); + virDomainSnapshotForEach(vm->snapshots, qemuDomainMomentDiscardAll, &r= em); virDomainSnapshotObjListRemoveAll(vm->snapshots); return rem.err; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 930ce9d401..62d8d977c5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16126,6 +16126,7 @@ qemuDomainSnapshotCurrent(virDomainPtr domain, { virDomainObjPtr vm; virDomainSnapshotPtr snapshot =3D NULL; + const char *name; virCheckFlags(0, NULL); @@ -16135,13 +16136,14 @@ qemuDomainSnapshotCurrent(virDomainPtr domain, if (virDomainSnapshotCurrentEnsureACL(domain->conn, vm->def) < 0) goto cleanup; - if (!virDomainSnapshotGetCurrent(vm->snapshots)) { + name =3D virDomainSnapshotGetCurrentName(vm->snapshots); + if (!name) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s", _("the domain does not have a current snapshot")); goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, virDomainSnapshotGetCurrentN= ame(vm->snapshots)); + snapshot =3D virGetDomainSnapshot(domain, name); cleanup: virDomainObjEndAPI(&vm); @@ -16673,40 +16675,41 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, } -typedef struct _virQEMUSnapReparent virQEMUSnapReparent; -typedef virQEMUSnapReparent *virQEMUSnapReparentPtr; -struct _virQEMUSnapReparent { - virQEMUDriverConfigPtr cfg; +typedef struct _virQEMUMomentReparent virQEMUMomentReparent; +typedef virQEMUMomentReparent *virQEMUMomentReparentPtr; +struct _virQEMUMomentReparent { + const char *dir; virDomainMomentObjPtr parent; virDomainObjPtr vm; virCapsPtr caps; virDomainXMLOptionPtr xmlopt; int err; + int (*writeMetadata)(virDomainObjPtr, virDomainMomentObjPtr, + virCapsPtr, virDomainXMLOptionPtr, const char *); }; static int -qemuDomainSnapshotReparentChildren(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *data) +qemuDomainMomentReparentChildren(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data) { - virDomainMomentObjPtr snap =3D payload; - virQEMUSnapReparentPtr rep =3D data; + virDomainMomentObjPtr moment =3D payload; + virQEMUMomentReparentPtr rep =3D data; if (rep->err < 0) return 0; - VIR_FREE(snap->def->parent); + VIR_FREE(moment->def->parent); if (rep->parent->def && - VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { + VIR_STRDUP(moment->def->parent, rep->parent->def->name) < 0) { rep->err =3D -1; return 0; } - rep->err =3D qemuDomainSnapshotWriteMetadata(rep->vm, snap, - rep->caps, rep->xmlopt, - rep->cfg->snapshotDir); + rep->err =3D rep->writeMetadata(rep->vm, moment, rep->caps, rep->xmlop= t, + rep->dir); return 0; } @@ -16719,8 +16722,8 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, virDomainObjPtr vm =3D NULL; int ret =3D -1; virDomainMomentObjPtr snap =3D NULL; - virQEMUSnapRemove rem; - virQEMUSnapReparent rep; + virQEMUMomentRemove rem; + virQEMUMomentReparent rep; bool metadata_only =3D !!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_= ONLY); int external =3D 0; virQEMUDriverConfigPtr cfg =3D NULL; @@ -16766,13 +16769,14 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr sna= pshot, rem.vm =3D vm; rem.metadata_only =3D metadata_only; rem.err =3D 0; - rem.current =3D false; - virDomainMomentForEachDescendant(snap, - qemuDomainSnapshotDiscardAll, + rem.current =3D virDomainSnapshotGetCurrent(vm->snapshots); + rem.found =3D false; + rem.momentDiscard =3D qemuDomainSnapshotDiscard; + virDomainMomentForEachDescendant(snap, qemuDomainMomentDiscardAll, &rem); if (rem.err < 0) goto endjob; - if (rem.current) { + if (rem.found) { virDomainSnapshotSetCurrent(vm->snapshots, snap); if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, @@ -16787,14 +16791,15 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr sna= pshot, } } } else if (snap->nchildren) { - rep.cfg =3D cfg; + rep.dir =3D cfg->snapshotDir; rep.parent =3D snap->parent; rep.vm =3D vm; rep.err =3D 0; rep.caps =3D driver->caps; rep.xmlopt =3D driver->xmlopt; + rep.writeMetadata =3D qemuDomainSnapshotWriteMetadata; virDomainMomentForEachChild(snap, - qemuDomainSnapshotReparentChildren, + qemuDomainMomentReparentChildren, &rep); if (rep.err < 0) goto endjob; --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list