From nobody Wed Apr 24 07:48:47 2024 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 1553060495919936.6015452381857; Tue, 19 Mar 2019 22:41:35 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 9B5AE811A9; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 76D111018A36; Wed, 20 Mar 2019 05:41:33 +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 3D54F3FB12; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5f92a017170 for ; Wed, 20 Mar 2019 01:41:09 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0056517F8D; Wed, 20 Mar 2019 05:41:09 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 936FA17795; Wed, 20 Mar 2019 05:41:08 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:50 -0500 Message-Id: <20190320054105.17689-2-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 01/16] test: Avoid use-after-free on virDomainSnapshotDelete 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.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 20 Mar 2019 05:41:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" The following virsh command was triggering a use-after-free: $ virsh -c test:///default ' snapshot-create-as test s1 snapshot-create-as test s2 snapshot-delete --children-only test s1 snapshot-current --name test' Domain snapshot s1 created Domain snapshot s2 created Domain snapshot s1 children deleted error: name in virGetDomainSnapshot must not be NULL I got lucky on that run - although the error message is quite unexpected. On other runs, I was able to get a core dump, and valgrind confirms there is a definitive problem. The culprit? We were inconsistent about whether we set vm->current_snapshot, snap->def->current, or both when updating how the current snapshot was being tracked. As a result, deletion did not see that snapshot s2 was previously current, and failed to update vm->current_snapshot, so that the next API using the current snapshot failed because it referenced stale memory for the now-gone s2 (instead of the intended s1). The test driver code was copied from the qemu code (which DOES track both pieces of state everywhere), but was purposefully simplified because the test driver does not have to write persistent snapshot state to the file system. But when you realize that the only reason snap->def->current needs to exist is when writing out one file per snapshot for qemu, it's just as easy to state that the test driver never has to mess with the field (rather than chasing down which places forgot to set the field), and have vm->current_snapshot be the sole source of truth in the test driver. Ideally, I'd get rid of the 'current' member in virDomainSnapshotDef, as well as the 'current_snapshot' member in virDomainDef, and instead track the current member in virDomainSnapshotObjList, coupled with writing ALL snapshot state for qemu in a single file (where I can use as a wrapper, rather than VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL to output 1 XML on a per-snapshot file basis). But that's a bigger change, so for now I'm just patching things to avoid the test driver segfault. Signed-off-by: Eric Blake Reviewed-by: J=C3=A1n Tomko --- src/test/test_driver.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 0bb48b4364..bd0a14114e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1,7 +1,7 @@ /* * test_driver.c: A "mock" hypervisor for use by application unit tests * - * Copyright (C) 2006-2015 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 @@ -6441,7 +6441,7 @@ testDomainSnapshotDiscardAll(void *payload, virDomainSnapshotObjPtr snap =3D payload; testSnapRemoveDataPtr curr =3D data; - if (snap->def->current) + if (curr->vm->current_snapshot =3D=3D snap) curr->current =3D true; virDomainSnapshotObjListRemove(curr->vm->snapshots, snap); return 0; @@ -6507,11 +6507,8 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsh= ot, virDomainSnapshotForEachDescendant(snap, testDomainSnapshotDiscardAll, &rem); - if (rem.current) { - if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) - snap->def->current =3D true; + if (rem.current) vm->current_snapshot =3D snap; - } } else if (snap->nchildren) { testSnapReparentData rep; rep.parent =3D snap->parent; @@ -6539,12 +6536,9 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsh= ot, if (snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent= ); - if (!parentsnap) { + if (!parentsnap) VIR_WARN("missing parent snapshot matching name '%s'", snap->def->parent); - } else { - parentsnap->def->current =3D true; - } } vm->current_snapshot =3D parentsnap; } @@ -6623,12 +6617,9 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snap= shot, } - if (vm->current_snapshot) { - vm->current_snapshot->def->current =3D false; + if (vm->current_snapshot) vm->current_snapshot =3D NULL; - } - snap->def->current =3D true; config =3D virDomainDefCopy(snap->def->dom, privconn->caps, privconn->xmlopt, NULL, true); if (!config) --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 155306047929225.354329051433297; Tue, 19 Mar 2019 22:41:19 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D96B5308429D; Wed, 20 Mar 2019 05:41:16 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BC5DC60BF3; Wed, 20 Mar 2019 05:41:15 +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 CED4141F3D; Wed, 20 Mar 2019 05:41:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fCBQ017186 for ; Wed, 20 Mar 2019 01:41:12 -0400 Received: by smtp.corp.redhat.com (Postfix) id 565B41A913; Wed, 20 Mar 2019 05:41:12 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id B0C461974C; Wed, 20 Mar 2019 05:41:11 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:51 -0500 Message-Id: <20190320054105.17689-3-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 02/16] snapshot: Use accessors for virDomainSnapshot members 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Wed, 20 Mar 2019 05:41:17 +0000 (UTC) Upcoming patches want to add virDomainCheckpoint that behaves very similarly to virDomainSnapshot; the easiest way to share common code is to give both classes a common base class. If this were C++, we'd just use public member inheritance; but since it is C, we instead have to touch EVERY use of member fields that will be relocated. To avoid having to make future edits, wrap the majority of accesses behind static inline functions, so that we only have to touch one place when changing class inheritance. I wrote the patch by temporarily renaming the members so the compiler would force me to find all uses, but the final commit does not preserve that rename. Signed-off-by: Eric Blake Reviewed-by: J=C3=A1n Tomko --- src/datatypes.h | 18 ++++++-- src/esx/esx_driver.c | 66 ++++++++++++++--------------- src/libvirt-domain-snapshot.c | 24 +++++------ src/qemu/qemu_driver.c | 40 ++++++++--------- src/remote/remote_daemon_dispatch.c | 4 +- src/remote/remote_driver.c | 4 +- src/rpc/gendispatch.pl | 2 +- src/test/test_driver.c | 20 ++++----- src/vbox/vbox_common.c | 56 ++++++++++++------------ src/vz/vz_driver.c | 52 +++++++++++------------ 10 files changed, 149 insertions(+), 137 deletions(-) diff --git a/src/datatypes.h b/src/datatypes.h index 12015679f3..a66dfbe983 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -1,7 +1,7 @@ /* * datatypes.h: management of structs for public data types * - * Copyright (C) 2006-2015 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -296,8 +296,8 @@ extern virClassPtr virAdmClientClass; do { \ virDomainSnapshotPtr _snap =3D (obj); \ if (!virObjectIsClass(_snap, virDomainSnapshotClass) || \ - !virObjectIsClass(_snap->domain, virDomainClass) || \ - !virObjectIsClass(_snap->domain->conn, virConnectClass)) { \ + !virObjectIsClass(virSnapDom(_snap), virDomainClass) || \ + !virObjectIsClass(virSnapDom(_snap)->conn, virConnectClass)) {= \ virReportErrorHelper(VIR_FROM_DOMAIN_SNAPSHOT, \ VIR_ERR_INVALID_DOMAIN_SNAPSHOT, \ __FILE__, __FUNCTION__, __LINE__, \ @@ -679,6 +679,18 @@ struct _virDomainSnapshot { virDomainPtr domain; }; +static inline char * +virSnapName(virDomainSnapshotPtr snapshot) +{ + return snapshot->name; +} + +static inline virDomainPtr +virSnapDom(virDomainSnapshotPtr snapshot) +{ + return snapshot->domain; +} + /** * _virNWFilter: * diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index c6d112268f..c016f8051f 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4166,7 +4166,7 @@ static char * esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags) { - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTreeParent =3D NULL; @@ -4181,15 +4181,15 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sn= apshot, if (esxVI_EnsureSession(priv->primary) < 0) return NULL; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; } - def.name =3D snapshot->name; + def.name =3D virSnapName(snapshot); def.description =3D snapshotTree->description; def.parent =3D snapshotTreeParent ? snapshotTreeParent->name : NULL; @@ -4201,7 +4201,7 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snap= shot, def.state =3D esxVI_VirtualMachinePowerState_ConvertToLibvirt (snapshotTree->state); - virUUIDFormat(snapshot->domain->uuid, uuid_string); + virUUIDFormat(virSnapDom(snapshot)->uuid, uuid_string); xml =3D virDomainSnapshotDefFormat(uuid_string, &def, priv->caps, priv= ->xmlopt, 0); @@ -4299,7 +4299,7 @@ static int esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int f= lags) { int count =3D -1; - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; bool recurse; @@ -4315,9 +4315,9 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr sna= pshot, unsigned int flags) if (esxVI_EnsureSession(priv->primary) < 0) return -1; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotTreeList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotTreeList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotTreeList, virSnapName(snap= shot), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4346,7 +4346,7 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotP= tr snapshot, unsigned int flags) { int result =3D -1; - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; bool recurse; @@ -4370,9 +4370,9 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotP= tr snapshot, if (esxVI_EnsureSession(priv->primary) < 0) return -1; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotTreeList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotTreeList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotTreeList, virSnapName(snap= shot), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4457,7 +4457,7 @@ esxDomainHasCurrentSnapshot(virDomainPtr domain, unsi= gned int flags) static virDomainSnapshotPtr esxDomainSnapshotGetParent(virDomainSnapshotPtr snapshot, unsigned int fla= gs) { - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTreeParent =3D NULL; @@ -4468,9 +4468,9 @@ esxDomainSnapshotGetParent(virDomainSnapshotPtr snaps= hot, unsigned int flags) if (esxVI_EnsureSession(priv->primary) < 0) return NULL; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4483,7 +4483,7 @@ esxDomainSnapshotGetParent(virDomainSnapshotPtr snaps= hot, unsigned int flags) goto cleanup; } - parent =3D virGetDomainSnapshot(snapshot->domain, snapshotTreeParent->= name); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snapshotTreePare= nt->name); cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotList); @@ -4522,7 +4522,7 @@ esxDomainSnapshotCurrent(virDomainPtr domain, unsigne= d int flags) static int esxDomainSnapshotIsCurrent(virDomainSnapshotPtr snapshot, unsigned int fla= gs) { - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *currentSnapshotTree =3D NULL; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; @@ -4534,21 +4534,21 @@ esxDomainSnapshotIsCurrent(virDomainSnapshotPtr sna= pshot, unsigned int flags) return -1; /* Check that snapshot exists. */ - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; } - if (esxVI_LookupCurrentSnapshotTree(priv->primary, snapshot->domain->u= uid, + if (esxVI_LookupCurrentSnapshotTree(priv->primary, virSnapDom(snapshot= )->uuid, ¤tSnapshotTree, esxVI_Occurrence_RequiredItem) < 0= ) { goto cleanup; } - ret =3D STREQ(snapshot->name, currentSnapshotTree->name); + ret =3D STREQ(virSnapName(snapshot), currentSnapshotTree->name); cleanup: esxVI_VirtualMachineSnapshotTree_Free(¤tSnapshotTree); @@ -4560,7 +4560,7 @@ esxDomainSnapshotIsCurrent(virDomainSnapshotPtr snaps= hot, unsigned int flags) static int esxDomainSnapshotHasMetadata(virDomainSnapshotPtr snapshot, unsigned int f= lags) { - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; int ret =3D -1; @@ -4571,9 +4571,9 @@ esxDomainSnapshotHasMetadata(virDomainSnapshotPtr sna= pshot, unsigned int flags) return -1; /* Check that snapshot exists. If so, there is no metadata. */ - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4591,7 +4591,7 @@ static int esxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flag= s) { int result =3D -1; - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; esxVI_ManagedObjectReference *task =3D NULL; @@ -4603,9 +4603,9 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapsh= ot, unsigned int flags) if (esxVI_EnsureSession(priv->primary) < 0) return -1; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4613,7 +4613,7 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapsh= ot, unsigned int flags) if (esxVI_RevertToSnapshot_Task(priv->primary, snapshotTree->snapshot,= NULL, esxVI_Boolean_Undefined, &task) < 0 || - esxVI_WaitForTaskCompletion(priv->primary, task, snapshot->domain-= >uuid, + esxVI_WaitForTaskCompletion(priv->primary, task, virSnapDom(snapsh= ot)->uuid, esxVI_Occurrence_RequiredItem, priv->parsedUri->autoAnswer, &taskInfo= State, &taskInfoErrorMessage) < 0) { @@ -4622,7 +4622,7 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapsh= ot, unsigned int flags) if (taskInfoState !=3D esxVI_TaskInfoState_Success) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not revert to snapshot '%s': %s"), snapsho= t->name, + _("Could not revert to snapshot '%s': %s"), virSnap= Name(snapshot), taskInfoErrorMessage); goto cleanup; } @@ -4643,7 +4643,7 @@ static int esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) { int result =3D -1; - esxPrivate *priv =3D snapshot->domain->conn->privateData; + esxPrivate *priv =3D virSnapDom(snapshot)->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList =3D NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree =3D NULL; esxVI_Boolean removeChildren =3D esxVI_Boolean_False; @@ -4660,9 +4660,9 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot= , unsigned int flags) if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN) removeChildren =3D esxVI_Boolean_True; - if (esxVI_LookupRootSnapshotTreeList(priv->primary, snapshot->domain->= uuid, + if (esxVI_LookupRootSnapshotTreeList(priv->primary, virSnapDom(snapsho= t)->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, virSnapName(snapshot= ), &snapshotTree, NULL, esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; @@ -4677,7 +4677,7 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot= , unsigned int flags) if (esxVI_RemoveSnapshot_Task(priv->primary, snapshotTree->snapshot, removeChildren, &task) < 0 || - esxVI_WaitForTaskCompletion(priv->primary, task, snapshot->domain-= >uuid, + esxVI_WaitForTaskCompletion(priv->primary, task, virSnapDom(snapsh= ot)->uuid, esxVI_Occurrence_RequiredItem, priv->parsedUri->autoAnswer, &taskInfo= State, &taskInfoErrorMessage) < 0) { @@ -4686,7 +4686,7 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot= , unsigned int flags) if (taskInfoState !=3D esxVI_TaskInfoState_Success) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not delete snapshot '%s': %s"), snapshot->= name, + _("Could not delete snapshot '%s': %s"), virSnapNam= e(snapshot), taskInfoErrorMessage); goto cleanup; } diff --git a/src/libvirt-domain-snapshot.c b/src/libvirt-domain-snapshot.c index be9bf71af9..e1275c69b0 100644 --- a/src/libvirt-domain-snapshot.c +++ b/src/libvirt-domain-snapshot.c @@ -45,7 +45,7 @@ virDomainSnapshotGetName(virDomainSnapshotPtr snapshot) virCheckDomainSnapshotReturn(snapshot, NULL); - return snapshot->name; + return virSnapName(snapshot); } @@ -68,7 +68,7 @@ virDomainSnapshotGetDomain(virDomainSnapshotPtr snapshot) virCheckDomainSnapshotReturn(snapshot, NULL); - return snapshot->domain; + return virSnapDom(snapshot); } @@ -91,7 +91,7 @@ virDomainSnapshotGetConnect(virDomainSnapshotPtr snapshot) virCheckDomainSnapshotReturn(snapshot, NULL); - return snapshot->domain->conn; + return virSnapDom(snapshot)->conn; } @@ -273,7 +273,7 @@ virDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapsh= ot, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, NULL); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if ((conn->flags & VIR_CONNECT_RO) && (flags & VIR_DOMAIN_SNAPSHOT_XML_SECURE)) { @@ -606,7 +606,7 @@ virDomainSnapshotNumChildren(virDomainSnapshotPtr snaps= hot, unsigned int flags) virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if (conn->driver->domainSnapshotNumChildren) { int ret =3D conn->driver->domainSnapshotNumChildren(snapshot, flag= s); @@ -700,7 +700,7 @@ virDomainSnapshotListChildrenNames(virDomainSnapshotPtr= snapshot, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; virCheckNonNullArgGoto(names, error); virCheckNonNegativeArgGoto(nameslen, error); @@ -796,7 +796,7 @@ virDomainSnapshotListAllChildren(virDomainSnapshotPtr s= napshot, *snaps =3D NULL; virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if (conn->driver->domainSnapshotListAllChildren) { int ret =3D conn->driver->domainSnapshotListAllChildren(snapshot, = snaps, @@ -958,7 +958,7 @@ virDomainSnapshotGetParent(virDomainSnapshotPtr snapsho= t, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, NULL); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if (conn->driver->domainSnapshotGetParent) { virDomainSnapshotPtr snap; @@ -996,7 +996,7 @@ virDomainSnapshotIsCurrent(virDomainSnapshotPtr snapsho= t, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if (conn->driver->domainSnapshotIsCurrent) { int ret; @@ -1035,7 +1035,7 @@ virDomainSnapshotHasMetadata(virDomainSnapshotPtr sna= pshot, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; if (conn->driver->domainSnapshotHasMetadata) { int ret; @@ -1106,7 +1106,7 @@ virDomainRevertToSnapshot(virDomainSnapshotPtr snapsh= ot, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; virCheckReadOnlyGoto(conn->flags, error); @@ -1163,7 +1163,7 @@ virDomainSnapshotDelete(virDomainSnapshotPtr snapshot, virResetLastError(); virCheckDomainSnapshotReturn(snapshot, -1); - conn =3D snapshot->domain->conn; + conn =3D virSnapDom(snapshot)->conn; virCheckReadOnlyGoto(conn->flags, error); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a16eab5467..6e504dd17c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -193,7 +193,7 @@ qemuDomObjFromDomain(virDomainPtr domain) static virDomainObjPtr qemuDomObjFromSnapshot(virDomainSnapshotPtr snapshot) { - return qemuDomObjFromDomain(snapshot->domain); + return qemuDomObjFromDomain(virSnapDom(snapshot)); } @@ -218,7 +218,7 @@ static virDomainSnapshotObjPtr qemuSnapObjFromSnapshot(virDomainObjPtr vm, virDomainSnapshotPtr snapshot) { - return qemuSnapObjFromName(vm, snapshot->name); + return qemuSnapObjFromName(vm, virSnapName(snapshot)); } static int @@ -16047,7 +16047,7 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapsh= otPtr snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return -1; - if (virDomainSnapshotListChildrenNamesEnsureACL(snapshot->domain->conn= , vm->def) < 0) + if (virDomainSnapshotListChildrenNamesEnsureACL(virSnapDom(snapshot)->= conn, vm->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) @@ -16077,7 +16077,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr = snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return -1; - if (virDomainSnapshotNumChildrenEnsureACL(snapshot->domain->conn, vm->= def) < 0) + if (virDomainSnapshotNumChildrenEnsureACL(virSnapDom(snapshot)->conn, = vm->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) @@ -16107,13 +16107,13 @@ qemuDomainSnapshotListAllChildren(virDomainSnapsh= otPtr snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return -1; - if (virDomainSnapshotListAllChildrenEnsureACL(snapshot->domain->conn, = vm->def) < 0) + if (virDomainSnapshotListAllChildrenEnsureACL(virSnapDom(snapshot)->co= nn, vm->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - n =3D virDomainListSnapshots(vm->snapshots, snap, snapshot->domain, sn= aps, + n =3D virDomainListSnapshots(vm->snapshots, snap, virSnapDom(snapshot)= , snaps, flags); cleanup: @@ -16186,7 +16186,7 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return NULL; - if (virDomainSnapshotGetParentEnsureACL(snapshot->domain->conn, vm->de= f) < 0) + if (virDomainSnapshotGetParentEnsureACL(virSnapDom(snapshot)->conn, vm= ->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) @@ -16199,7 +16199,7 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, goto cleanup; } - parent =3D virGetDomainSnapshot(snapshot->domain, snap->def->parent); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); cleanup: virDomainObjEndAPI(&vm); @@ -16240,7 +16240,7 @@ static char * qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags) { - virQEMUDriverPtr driver =3D snapshot->domain->conn->privateData; + virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; char *xml =3D NULL; virDomainSnapshotObjPtr snap =3D NULL; @@ -16251,13 +16251,13 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr= snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return NULL; - if (virDomainSnapshotGetXMLDescEnsureACL(snapshot->domain->conn, vm->d= ef, flags) < 0) + if (virDomainSnapshotGetXMLDescEnsureACL(virSnapDom(snapshot)->conn, v= m->def, flags) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - virUUIDFormat(snapshot->domain->uuid, uuidstr); + virUUIDFormat(virSnapDom(snapshot)->uuid, uuidstr); xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, driver->caps, driver->xmlopt, @@ -16282,14 +16282,14 @@ qemuDomainSnapshotIsCurrent(virDomainSnapshotPtr = snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return -1; - if (virDomainSnapshotIsCurrentEnsureACL(snapshot->domain->conn, vm->de= f) < 0) + if (virDomainSnapshotIsCurrentEnsureACL(virSnapDom(snapshot)->conn, vm= ->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; ret =3D (vm->current_snapshot && - STREQ(snapshot->name, vm->current_snapshot->def->name)); + STREQ(virSnapName(snapshot), vm->current_snapshot->def->name)); cleanup: virDomainObjEndAPI(&vm); @@ -16310,7 +16310,7 @@ qemuDomainSnapshotHasMetadata(virDomainSnapshotPtr = snapshot, if (!(vm =3D qemuDomObjFromSnapshot(snapshot))) return -1; - if (virDomainSnapshotHasMetadataEnsureACL(snapshot->domain->conn, vm->= def) < 0) + if (virDomainSnapshotHasMetadataEnsureACL(virSnapDom(snapshot)->conn, = vm->def) < 0) goto cleanup; if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) @@ -16343,7 +16343,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) { - virQEMUDriverPtr driver =3D snapshot->domain->conn->privateData; + virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; int ret =3D -1; virDomainSnapshotObjPtr snap =3D NULL; @@ -16386,7 +16386,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, cfg =3D virQEMUDriverGetConfig(driver); - if (virDomainRevertToSnapshotEnsureACL(snapshot->domain->conn, vm->def= ) < 0) + if (virDomainRevertToSnapshotEnsureACL(virSnapDom(snapshot)->conn, vm-= >def) < 0) goto cleanup; if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) @@ -16593,7 +16593,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, qemuDomainFixupCPUs(vm, &cookie->cpu) < 0) goto cleanup; - rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, + rc =3D qemuProcessStart(virSnapDom(snapshot)->conn, driver, vm, cookie ? cookie->cpu : NULL, jobType, NULL, -1, NULL, snap, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, @@ -16681,7 +16681,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, start_flags |=3D paused ? VIR_QEMU_PROCESS_START_PAUSED : 0; virObjectEventStateQueue(driver->domainEventState, event); - rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NU= LL, + rc =3D qemuProcessStart(virSnapDom(snapshot)->conn, driver, vm= , NULL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, NU= LL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags); @@ -16806,7 +16806,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) { - virQEMUDriverPtr driver =3D snapshot->domain->conn->privateData; + virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; int ret =3D -1; virDomainSnapshotObjPtr snap =3D NULL; @@ -16825,7 +16825,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, cfg =3D virQEMUDriverGetConfig(driver); - if (virDomainSnapshotDeleteEnsureACL(snapshot->domain->conn, vm->def) = < 0) + if (virDomainSnapshotDeleteEnsureACL(virSnapDom(snapshot)->conn, vm->d= ef) < 0) goto cleanup; if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon= _dispatch.c index df28259042..49721536d0 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -7351,9 +7351,9 @@ make_nonnull_nwfilter_binding(remote_nonnull_nwfilter= _binding *binding_dst, virN static int make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst,= virDomainSnapshotPtr snapshot_src) { - if (VIR_STRDUP(snapshot_dst->name, snapshot_src->name) < 0) + if (VIR_STRDUP(snapshot_dst->name, virSnapName(snapshot_src)) < 0) return -1; - if (make_nonnull_domain(&snapshot_dst->dom, snapshot_src->domain) < 0)= { + if (make_nonnull_domain(&snapshot_dst->dom, virSnapDom(snapshot_src)) = < 0) { VIR_FREE(snapshot_dst->name); return -1; } diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 5c4dd41227..f67ea1132c 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8270,8 +8270,8 @@ make_nonnull_nwfilter_binding(remote_nonnull_nwfilter= _binding *binding_dst, virN static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst,= virDomainSnapshotPtr snapshot_src) { - snapshot_dst->name =3D snapshot_src->name; - make_nonnull_domain(&snapshot_dst->dom, snapshot_src->domain); + snapshot_dst->name =3D virSnapName(snapshot_src); + make_nonnull_domain(&snapshot_dst->dom, virSnapDom(snapshot_src)); } /*----------------------------------------------------------------------*/ diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index ae3a42c4c1..985eb995aa 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -1335,7 +1335,7 @@ elsif ($mode eq "client") { if ($is_first_arg) { if ($name eq "domain_snapshot") { - $priv_src =3D "$arg_name->domain->conn"; + $priv_src =3D "virSnapDom($arg_name)->conn"; } else { $priv_src =3D "$arg_name->conn"; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index bd0a14114e..e1ad9382e0 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5961,13 +5961,13 @@ static virDomainSnapshotObjPtr testSnapObjFromSnapshot(virDomainObjPtr vm, virDomainSnapshotPtr snapshot) { - return testSnapObjFromName(vm, snapshot->name); + return testSnapObjFromName(vm, virSnapName(snapshot)); } static virDomainObjPtr testDomObjFromSnapshot(virDomainSnapshotPtr snapshot) { - return testDomObjFromDomain(snapshot->domain); + return testDomObjFromDomain(virSnapDom(snapshot)); } static int @@ -6105,7 +6105,7 @@ testDomainSnapshotListAllChildren(virDomainSnapshotPt= r snapshot, if (!(snap =3D testSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - n =3D virDomainListSnapshots(vm->snapshots, snap, snapshot->domain, sn= aps, + n =3D virDomainListSnapshots(vm->snapshots, snap, virSnapDom(snapshot)= , snaps, flags); cleanup: @@ -6178,7 +6178,7 @@ testDomainSnapshotGetParent(virDomainSnapshotPtr snap= shot, goto cleanup; } - parent =3D virGetDomainSnapshot(snapshot->domain, snap->def->parent); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); cleanup: virDomainObjEndAPI(&vm); @@ -6218,7 +6218,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, char *xml =3D NULL; virDomainSnapshotObjPtr snap =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; - testDriverPtr privconn =3D snapshot->domain->conn->privateData; + testDriverPtr privconn =3D virSnapDom(snapshot)->conn->privateData; virCheckFlags(VIR_DOMAIN_SNAPSHOT_XML_SECURE, NULL); @@ -6228,7 +6228,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, if (!(snap =3D testSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - virUUIDFormat(snapshot->domain->uuid, uuidstr); + virUUIDFormat(virSnapDom(snapshot)->uuid, uuidstr); xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps, privconn->xmlopt, @@ -6252,7 +6252,7 @@ testDomainSnapshotIsCurrent(virDomainSnapshotPtr snap= shot, return -1; ret =3D (vm->current_snapshot && - STREQ(snapshot->name, vm->current_snapshot->def->name)); + STREQ(virSnapName(snapshot), vm->current_snapshot->def->name)); virDomainObjEndAPI(&vm); return ret; @@ -6555,7 +6555,7 @@ static int testDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) { - testDriverPtr privconn =3D snapshot->domain->conn->privateData; + testDriverPtr privconn =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; virDomainSnapshotObjPtr snap =3D NULL; virObjectEventPtr event =3D NULL; @@ -6647,7 +6647,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, } virResetError(err); - testDomainShutdownState(snapshot->domain, vm, + testDomainShutdownState(virSnapDom(snapshot), vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT); event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, @@ -6719,7 +6719,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, if (virDomainObjIsActive(vm)) { /* Transitions 4, 7 */ - testDomainShutdownState(snapshot->domain, vm, + testDomainShutdownState(virSnapDom(snapshot), vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT); event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index b8dfb55ef4..49c7e8a27d 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5732,7 +5732,7 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def, virDomainSnapshotPtr snapshot) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID domiid; IMachine *machine =3D NULL; @@ -5756,7 +5756,7 @@ vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr= def, if (openSessionForMachine(data, dom->uuid, &domiid, &machine) < 0) goto cleanup; - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; rc =3D gVBoxAPI.UISnapshot.GetId(snap, &snapIid); @@ -5972,7 +5972,7 @@ static int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr def, virDomainSnapshotPtr snapshot) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID domiid; ISnapshot *snap =3D NULL; @@ -5994,7 +5994,7 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr = def, if (openSessionForMachine(data, dom->uuid, &domiid, &machine) < 0) goto cleanup; - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; rc =3D gVBoxAPI.UISnapshot.GetMachine(snap, &snapMachine); @@ -6195,7 +6195,7 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr = def, static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID domiid; IMachine *machine =3D NULL; @@ -6218,12 +6218,12 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomain= SnapshotPtr snapshot, if (openSessionForMachine(data, dom->uuid, &domiid, &machine) < 0) goto cleanup; - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; if (VIR_ALLOC(def) < 0 || !(def->dom =3D virDomainDefNew())) goto cleanup; - if (VIR_STRDUP(def->name, snapshot->name) < 0) + if (VIR_STRDUP(def->name, virSnapName(snapshot)) < 0) goto cleanup; if (gVBoxAPI.vboxSnapshotRedefine) { @@ -6265,7 +6265,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get description of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } if (str16) { @@ -6282,7 +6282,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get creation time of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } /* timestamp is in milliseconds while creationTime in seconds */ @@ -6292,7 +6292,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get parent of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } if (parent) { @@ -6300,7 +6300,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (NS_FAILED(rc) || !str16) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get name of parent of snapshot %s"= ), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } VBOX_UTF16_TO_UTF8(str16, &str8); @@ -6316,7 +6316,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get online state of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } if (online) @@ -6531,7 +6531,7 @@ static virDomainSnapshotPtr vboxDomainSnapshotGetParent(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID iid; IMachine *machine =3D NULL; @@ -6550,20 +6550,20 @@ vboxDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, if (openSessionForMachine(data, dom->uuid, &iid, &machine) < 0) goto cleanup; - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; rc =3D gVBoxAPI.UISnapshot.GetParent(snap, &parent); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get parent of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } if (!parent) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("snapshot '%s' does not have a parent"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } @@ -6571,7 +6571,7 @@ vboxDomainSnapshotGetParent(virDomainSnapshotPtr snap= shot, if (NS_FAILED(rc) || !nameUtf16) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get name of parent of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } VBOX_UTF16_TO_UTF8(nameUtf16, &name); @@ -6652,7 +6652,7 @@ vboxDomainSnapshotCurrent(virDomainPtr dom, unsigned = int flags) static int vboxDomainSnapshotIsCurrent(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID iid; IMachine *machine =3D NULL; @@ -6671,7 +6671,7 @@ static int vboxDomainSnapshotIsCurrent(virDomainSnaps= hotPtr snapshot, if (openSessionForMachine(data, dom->uuid, &iid, &machine) < 0) goto cleanup; - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; rc =3D gVBoxAPI.UIMachine.GetCurrentSnapshot(machine, ¤t); @@ -6698,7 +6698,7 @@ static int vboxDomainSnapshotIsCurrent(virDomainSnaps= hotPtr snapshot, goto cleanup; } - ret =3D STREQ(snapshot->name, name); + ret =3D STREQ(virSnapName(snapshot), name); cleanup: VBOX_UTF8_FREE(name); @@ -6713,7 +6713,7 @@ static int vboxDomainSnapshotIsCurrent(virDomainSnaps= hotPtr snapshot, static int vboxDomainSnapshotHasMetadata(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID iid; IMachine *machine =3D NULL; @@ -6729,7 +6729,7 @@ static int vboxDomainSnapshotHasMetadata(virDomainSna= pshotPtr snapshot, goto cleanup; /* Check that snapshot exists. If so, there is no metadata. */ - if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->nam= e))) + if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; ret =3D 0; @@ -6744,7 +6744,7 @@ static int vboxDomainSnapshotHasMetadata(virDomainSna= pshotPtr snapshot, static int vboxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID domiid; IMachine *machine =3D NULL; @@ -6763,7 +6763,7 @@ static int vboxDomainRevertToSnapshot(virDomainSnapsh= otPtr snapshot, if (openSessionForMachine(data, dom->uuid, &domiid, &machine) < 0) goto cleanup; - newSnapshot =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->na= me); + newSnapshot =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(= snapshot)); if (!newSnapshot) goto cleanup; @@ -6771,7 +6771,7 @@ static int vboxDomainRevertToSnapshot(virDomainSnapsh= otPtr snapshot, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not get online state of snapshot %s"), - snapshot->name); + virSnapName(snapshot)); goto cleanup; } @@ -6908,7 +6908,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) * the machine with the new file. */ - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; virDomainSnapshotDefPtr def =3D NULL; char *defXml =3D NULL; @@ -7345,7 +7345,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) static int vboxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) { - virDomainPtr dom =3D snapshot->domain; + virDomainPtr dom =3D virSnapDom(snapshot); vboxDriverPtr data =3D dom->conn->privateData; vboxIID domiid; IMachine *machine =3D NULL; @@ -7365,7 +7365,7 @@ static int vboxDomainSnapshotDelete(virDomainSnapshot= Ptr snapshot, if (openSessionForMachine(data, dom->uuid, &domiid, &machine) < 0) goto cleanup; - snap =3D vboxDomainSnapshotGet(data, dom, machine, snapshot->name); + snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(snapsho= t)); if (!snap) goto cleanup; diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 066d617524..1bf6daf9b0 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -2148,7 +2148,7 @@ static virDomainSnapshotObjPtr vzSnapObjFromSnapshot(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotPtr snapshot) { - return vzSnapObjFromName(snapshots, snapshot->name); + return vzSnapObjFromName(snapshots, virSnapName(snapshot)); } static int @@ -2271,14 +2271,14 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, unsigned int flags) virDomainSnapshotObjPtr snap; char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainSnapshotObjListPtr snapshots =3D NULL; - vzConnPtr privconn =3D snapshot->domain->conn->privateData; + vzConnPtr privconn =3D virSnapDom(snapshot)->conn->privateData; virCheckFlags(VIR_DOMAIN_SNAPSHOT_XML_SECURE, NULL); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return NULL; - if (virDomainSnapshotGetXMLDescEnsureACL(snapshot->domain->conn, dom->= def, flags) < 0) + if (virDomainSnapshotGetXMLDescEnsureACL(virSnapDom(snapshot)->conn, d= om->def, flags) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2287,7 +2287,7 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snaps= hot, unsigned int flags) if (!(snap =3D vzSnapObjFromSnapshot(snapshots, snapshot))) goto cleanup; - virUUIDFormat(snapshot->domain->uuid, uuidstr); + virUUIDFormat(virSnapDom(snapshot)->uuid, uuidstr); xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->drive= r->caps, privconn->driver->xmlopt, @@ -2311,10 +2311,10 @@ vzDomainSnapshotNumChildren(virDomainSnapshotPtr sn= apshot, unsigned int flags) virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | VIR_DOMAIN_SNAPSHOT_FILTERS_ALL, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotNumChildrenEnsureACL(snapshot->domain->conn, dom-= >def) < 0) + if (virDomainSnapshotNumChildrenEnsureACL(virSnapDom(snapshot)->conn, = dom->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2346,10 +2346,10 @@ vzDomainSnapshotListChildrenNames(virDomainSnapshot= Ptr snapshot, virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | VIR_DOMAIN_SNAPSHOT_FILTERS_ALL, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotListChildrenNamesEnsureACL(snapshot->domain->conn= , dom->def) < 0) + if (virDomainSnapshotListChildrenNamesEnsureACL(virSnapDom(snapshot)->= conn, dom->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2380,10 +2380,10 @@ vzDomainSnapshotListAllChildren(virDomainSnapshotPt= r snapshot, virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | VIR_DOMAIN_SNAPSHOT_FILTERS_ALL, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotListAllChildrenEnsureACL(snapshot->domain->conn, = dom->def) < 0) + if (virDomainSnapshotListAllChildrenEnsureACL(virSnapDom(snapshot)->co= nn, dom->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2392,7 +2392,7 @@ vzDomainSnapshotListAllChildren(virDomainSnapshotPtr = snapshot, if (!(snap =3D vzSnapObjFromSnapshot(snapshots, snapshot))) goto cleanup; - n =3D virDomainListSnapshots(snapshots, snap, snapshot->domain, snaps,= flags); + n =3D virDomainListSnapshots(snapshots, snap, virSnapDom(snapshot), sn= aps, flags); cleanup: virDomainSnapshotObjListFree(snapshots); @@ -2471,10 +2471,10 @@ vzDomainSnapshotGetParent(virDomainSnapshotPtr snap= shot, unsigned int flags) virCheckFlags(0, NULL); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return NULL; - if (virDomainSnapshotGetParentEnsureACL(snapshot->domain->conn, dom->d= ef) < 0) + if (virDomainSnapshotGetParentEnsureACL(virSnapDom(snapshot)->conn, do= m->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2490,7 +2490,7 @@ vzDomainSnapshotGetParent(virDomainSnapshotPtr snapsh= ot, unsigned int flags) goto cleanup; } - parent =3D virGetDomainSnapshot(snapshot->domain, snap->def->parent); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); cleanup: virDomainSnapshotObjListFree(snapshots); @@ -2543,17 +2543,17 @@ vzDomainSnapshotIsCurrent(virDomainSnapshotPtr snap= shot, unsigned int flags) virCheckFlags(0, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotIsCurrentEnsureACL(snapshot->domain->conn, dom->d= ef) < 0) + if (virDomainSnapshotIsCurrentEnsureACL(virSnapDom(snapshot)->conn, do= m->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) goto cleanup; current =3D vzFindCurrentSnapshot(snapshots); - ret =3D current && STREQ(snapshot->name, current->def->name); + ret =3D current && STREQ(virSnapName(snapshot), current->def->name); cleanup: virDomainSnapshotObjListFree(snapshots); @@ -2573,10 +2573,10 @@ vzDomainSnapshotHasMetadata(virDomainSnapshotPtr sn= apshot, virCheckFlags(0, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotHasMetadataEnsureACL(snapshot->domain->conn, dom-= >def) < 0) + if (virDomainSnapshotHasMetadataEnsureACL(virSnapDom(snapshot)->conn, = dom->def) < 0) goto cleanup; if (!(snapshots =3D prlsdkLoadSnapshots(dom))) @@ -2674,13 +2674,13 @@ vzDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, unsigned int flags) virCheckFlags(VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainSnapshotDeleteEnsureACL(snapshot->domain->conn, dom->def)= < 0) + if (virDomainSnapshotDeleteEnsureACL(virSnapDom(snapshot)->conn, dom->= def) < 0) goto cleanup; - ret =3D prlsdkDeleteSnapshot(dom, snapshot->name, + ret =3D prlsdkDeleteSnapshot(dom, virSnapName(snapshot), flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN= ); cleanup: @@ -2698,10 +2698,10 @@ vzDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, unsigned int flags) virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED, -1); - if (!(dom =3D vzDomObjFromDomain(snapshot->domain))) + if (!(dom =3D vzDomObjFromDomain(virSnapDom(snapshot)))) return -1; - if (virDomainRevertToSnapshotEnsureACL(snapshot->domain->conn, dom->de= f) < 0) + if (virDomainRevertToSnapshotEnsureACL(virSnapDom(snapshot)->conn, dom= ->def) < 0) goto cleanup; if (vzDomainObjBeginJob(dom) < 0) @@ -2711,7 +2711,7 @@ vzDomainRevertToSnapshot(virDomainSnapshotPtr snapsho= t, unsigned int flags) if (vzEnsureDomainExists(dom) < 0) goto cleanup; - ret =3D prlsdkSwitchToSnapshot(dom, snapshot->name, + ret =3D prlsdkSwitchToSnapshot(dom, virSnapName(snapshot), flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED= ); cleanup: if (job) --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060498936650.515719463639; Tue, 19 Mar 2019 22:41:38 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DC95C81E15; Wed, 20 Mar 2019 05:41:36 +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 B5F1E6B49F; Wed, 20 Mar 2019 05:41:36 +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 7635B1819AFF; Wed, 20 Mar 2019 05:41:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fCoQ017193 for ; Wed, 20 Mar 2019 01:41:12 -0400 Received: by smtp.corp.redhat.com (Postfix) id D87591A836; Wed, 20 Mar 2019 05:41:12 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7A66D1974C; Wed, 20 Mar 2019 05:41:12 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:52 -0500 Message-Id: <20190320054105.17689-4-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 03/16] snapshot: Create virDomainMoment base class 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.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 20 Mar 2019 05:41:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Upcoming patches want to add virDomainCheckpoint that behaves very similarly to virDomainSnapshot; the easiest way to share common code is to give both classes a common base class. Thanks to the accessor functions in the previous patch, we have very few changes required outside of datatypes.[ch]. The subclass does have to use a dummy field, though, to satisfy virobject's insistence on size differentiation for type safety. Note that virClassNew() supports a NULL dispose method for a class that has nothing to clean up, but VIR_CLASS_NEW has no easy way to register such a class without a #define hack. I promised my teenage daughter Evelyn that I'd give her credit for her contribution to this commit. I asked her "What would be a good name for a base class for DomainSnapshot and DomainCheckpoint". After explaining what a base class was (using the classic OOB Square and Circle inherit from Shape), she came up with "DomainMoment", which is way better than my initial thought of "DomainPointInTime" or "DomainPIT". Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/datatypes.h | 26 ++++++-- src/datatypes.c | 110 ++++++++++++++++++++-------------- src/libvirt-domain-snapshot.c | 2 +- 3 files changed, 88 insertions(+), 50 deletions(-) diff --git a/src/datatypes.h b/src/datatypes.h index a66dfbe983..70d947657b 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -31,6 +31,7 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; +extern virClassPtr virDomainMomentClass; extern virClassPtr virDomainSnapshotClass; extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; @@ -668,27 +669,42 @@ struct _virStream { virFreeCallback ff; }; +/** + * _virDomainMoment + * + * Internal abstract structure serving as a base class to a named + * point in time object related to a domain + */ +typedef struct _virDomainMoment virDomainMoment; +typedef virDomainMoment *virDomainMomentPtr; +struct _virDomainMoment { + virObject parent; + char *name; + virDomainPtr domain; +}; + /** * _virDomainSnapshot * * Internal structure associated with a domain snapshot */ struct _virDomainSnapshot { - virObject parent; - char *name; - virDomainPtr domain; + virDomainMoment parent; + + /* Unused attribute to allow for subclass creation */ + bool dummy; }; static inline char * virSnapName(virDomainSnapshotPtr snapshot) { - return snapshot->name; + return snapshot->parent.name; } static inline virDomainPtr virSnapDom(virDomainSnapshotPtr snapshot) { - return snapshot->domain; + return snapshot->parent.domain; } /** diff --git a/src/datatypes.c b/src/datatypes.c index 9b92d892d5..f0cfbe11fc 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -1,7 +1,7 @@ /* * datatypes.c: management of structs for public data types * - * Copyright (C) 2006-2015 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -36,6 +36,7 @@ VIR_LOG_INIT("datatypes"); virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; +virClassPtr virDomainMomentClass; virClassPtr virDomainSnapshotClass; virClassPtr virInterfaceClass; virClassPtr virNetworkClass; @@ -50,7 +51,8 @@ virClassPtr virStoragePoolClass; static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); -static void virDomainSnapshotDispose(void *obj); +static void virDomainMomentDispose(void *obj); +#define virDomainSnapshotDispose NULL static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); static void virNodeDeviceDispose(void *obj); @@ -86,7 +88,8 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnect); DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); - DECLARE_CLASS(virDomainSnapshot); + DECLARE_CLASS(virDomainMoment); + DECLARE_CLASS_COMMON(virDomainSnapshot, virDomainMomentClass); DECLARE_CLASS(virInterface); DECLARE_CLASS(virNetwork); DECLARE_CLASS(virNodeDevice); @@ -900,6 +903,64 @@ virNWFilterBindingDispose(void *obj) } +/** + * virGetDomainMoment: + * @domain: the domain involved in a point-in-time moment + * @name: pointer to the domain moment name + * + * Allocates a new concrete subclass of a domain moment object. When + * the object is no longer needed, virObjectUnref() must be called in + * order to not leak data. + * + * Returns a pointer to the domain moment object, or NULL on error. + */ +static virDomainMomentPtr +virGetDomainMoment(virDomainPtr domain, const char *name, virClassPtr subc= lass) +{ + virDomainMomentPtr ret =3D NULL; + + if (virDataTypesInitialize() < 0) + return NULL; + + virCheckDomainGoto(domain, error); + virCheckNonNullArgGoto(name, error); + + if (!(ret =3D virObjectNew(subclass))) + goto error; + if (VIR_STRDUP(ret->name, name) < 0) + goto error; + + ret->domain =3D virObjectRef(domain); + + return ret; + + error: + virObjectUnref(ret); + return NULL; +} + + +/** + * virDomainMomentDispose: + * @obj: the domain moment to release + * + * Unconditionally release all memory associated with a moment. + * The object must not be used once this method returns. + * + * It will also unreference the associated connection object, + * which may also be released if its ref count hits zero. + */ +static void +virDomainMomentDispose(void *obj) +{ + virDomainMomentPtr moment =3D obj; + VIR_DEBUG("release moment %p %s", moment, moment->name); + + VIR_FREE(moment->name); + virObjectUnref(moment->domain); +} + + /** * virGetDomainSnapshot: * @domain: the domain to snapshot @@ -913,47 +974,8 @@ virNWFilterBindingDispose(void *obj) virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain, const char *name) { - virDomainSnapshotPtr ret =3D NULL; - - if (virDataTypesInitialize() < 0) - return NULL; - - virCheckDomainGoto(domain, error); - virCheckNonNullArgGoto(name, error); - - if (!(ret =3D virObjectNew(virDomainSnapshotClass))) - goto error; - if (VIR_STRDUP(ret->name, name) < 0) - goto error; - - ret->domain =3D virObjectRef(domain); - - return ret; - - error: - virObjectUnref(ret); - return NULL; -} - - -/** - * virDomainSnapshotDispose: - * @obj: the domain snapshot to release - * - * Unconditionally release all memory associated with a snapshot. - * The snapshot object must not be used once this method returns. - * - * It will also unreference the associated connection object, - * which may also be released if its ref count hits zero. - */ -static void -virDomainSnapshotDispose(void *obj) -{ - virDomainSnapshotPtr snapshot =3D obj; - VIR_DEBUG("release snapshot %p %s", snapshot, snapshot->name); - - VIR_FREE(snapshot->name); - virObjectUnref(snapshot->domain); + return (virDomainSnapshotPtr) virGetDomainMoment(domain, name, + virDomainSnapshotClas= s); } diff --git a/src/libvirt-domain-snapshot.c b/src/libvirt-domain-snapshot.c index e1275c69b0..27fb350cc6 100644 --- a/src/libvirt-domain-snapshot.c +++ b/src/libvirt-domain-snapshot.c @@ -1206,7 +1206,7 @@ int virDomainSnapshotRef(virDomainSnapshotPtr snapshot) { VIR_DEBUG("snapshot=3D%p, refs=3D%d", snapshot, - snapshot ? snapshot->parent.u.s.refs : 0); + snapshot ? snapshot->parent.parent.u.s.refs : 0); virResetLastError(); --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060481575117.7068811329234; Tue, 19 Mar 2019 22:41:21 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 83EFC3082E25; Wed, 20 Mar 2019 05:41:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 509EC5D70A; Wed, 20 Mar 2019 05:41:19 +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 07B0741F3F; Wed, 20 Mar 2019 05:41:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fDJD017201 for ; Wed, 20 Mar 2019 01:41:13 -0400 Received: by smtp.corp.redhat.com (Postfix) id 67F2E1974C; Wed, 20 Mar 2019 05:41:13 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0A0611A913; Wed, 20 Mar 2019 05:41:12 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:53 -0500 Message-Id: <20190320054105.17689-5-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 04/16] vbox: Clean up some snapshot usage 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.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Wed, 20 Mar 2019 05:41:20 +0000 (UTC) Content-Type: text/plain; charset="utf-8" An upcoming patch will be reworking virDomainSnapshotDef to have a base class; minimize the churn by using a local variable to reduce the number of dereferences required when acessing the domain definition associated with the snapshot. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/vbox/vbox_common.c | 65 ++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 49c7e8a27d..ac7e02eed6 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5984,6 +5984,7 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr = def, vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; size_t i =3D 0, diskCount =3D 0, sdCount =3D 0; int ret =3D -1; + virDomainDefPtr defdom =3D def->dom; if (!data->vboxObj) return ret; @@ -6027,26 +6028,26 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPt= r def, goto cleanup; } if (medium) { - def->dom->ndisks++; + defdom->ndisks++; VBOX_RELEASE(medium); } } } /* Allocate mem, if fails return error */ - if (VIR_ALLOC_N(def->dom->disks, def->dom->ndisks) >=3D 0) { - for (i =3D 0; i < def->dom->ndisks; i++) { + if (VIR_ALLOC_N(defdom->disks, defdom->ndisks) >=3D 0) { + for (i =3D 0; i < defdom->ndisks; i++) { virDomainDiskDefPtr diskDef =3D virDomainDiskDefNew(NULL); if (!diskDef) goto cleanup; - def->dom->disks[i] =3D diskDef; + defdom->disks[i] =3D diskDef; } } else { goto cleanup; } /* get the attachment details here */ - for (i =3D 0; i < mediumAttachments.count && diskCount < def->dom->ndi= sks; i++) { + for (i =3D 0; i < mediumAttachments.count && diskCount < defdom->ndisk= s; i++) { PRUnichar *storageControllerName =3D NULL; PRUint32 deviceType =3D DeviceType_Null; PRUint32 storageBus =3D StorageBus_Null; @@ -6125,7 +6126,7 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr = def, } VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); VBOX_UTF16_FREE(mediumLocUtf16); - if (VIR_STRDUP(def->dom->disks[diskCount]->src->path, mediumLocUtf= 8) < 0) + if (VIR_STRDUP(defdom->disks[diskCount]->src->path, mediumLocUtf8)= < 0) goto cleanup; VBOX_UTF8_FREE(mediumLocUtf8); @@ -6136,11 +6137,11 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPt= r def, goto cleanup; } - def->dom->disks[diskCount]->dst =3D vboxGenerateMediumName(storage= Bus, - devicePor= t, - deviceSlo= t, - sdCount); - if (!def->dom->disks[diskCount]->dst) { + defdom->disks[diskCount]->dst =3D vboxGenerateMediumName(storageBu= s, + devicePort, + deviceSlot, + sdCount); + if (!defdom->disks[diskCount]->dst) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not generate medium name for the disk " "at: port:%d, slot:%d"), devicePort, deviceSl= ot); @@ -6149,16 +6150,16 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPt= r def, } if (storageBus =3D=3D StorageBus_IDE) { - def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_IDE; + defdom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_IDE; } else if (storageBus =3D=3D StorageBus_SATA) { sdCount++; - def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SATA; + defdom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SATA; } else if (storageBus =3D=3D StorageBus_SCSI || storageBus =3D=3D StorageBus_SAS) { sdCount++; - def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; + defdom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; } else if (storageBus =3D=3D StorageBus_Floppy) { - def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_FDC; + defdom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_FDC; } rc =3D gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceT= ype); @@ -6168,15 +6169,15 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPt= r def, goto cleanup; } if (deviceType =3D=3D DeviceType_HardDisk) - def->dom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_= DISK; + defdom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_DI= SK; else if (deviceType =3D=3D DeviceType_Floppy) - def->dom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_= FLOPPY; + defdom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_FL= OPPY; else if (deviceType =3D=3D DeviceType_DVD) - def->dom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_= CDROM; + defdom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_CD= ROM; if (readOnly =3D=3D PR_TRUE) - def->dom->disks[diskCount]->src->readonly =3D true; - def->dom->disks[diskCount]->src->type =3D VIR_STORAGE_TYPE_FILE; + defdom->disks[diskCount]->src->readonly =3D true; + defdom->disks[diskCount]->src->type =3D VIR_STORAGE_TYPE_FILE; diskCount++; } @@ -6209,6 +6210,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, PRBool online =3D PR_FALSE; char uuidstr[VIR_UUID_STRING_BUFLEN]; char *ret =3D NULL; + virDomainDefPtr defdom; if (!data->vboxObj) return ret; @@ -6223,6 +6225,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (VIR_ALLOC(def) < 0 || !(def->dom =3D virDomainDefNew())) goto cleanup; + defdom =3D def->dom; if (VIR_STRDUP(def->name, virSnapName(snapshot)) < 0) goto cleanup; @@ -6233,25 +6236,25 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomain= SnapshotPtr snapshot, PRUint32 memorySize =3D 0; PRUint32 CPUCount =3D 0; - def->dom->virtType =3D VIR_DOMAIN_VIRT_VBOX; - def->dom->id =3D dom->id; - memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN); - if (VIR_STRDUP(def->dom->name, dom->name) < 0) + defdom->virtType =3D VIR_DOMAIN_VIRT_VBOX; + defdom->id =3D dom->id; + memcpy(defdom->uuid, dom->uuid, VIR_UUID_BUFLEN); + if (VIR_STRDUP(defdom->name, dom->name) < 0) goto cleanup; gVBoxAPI.UIMachine.GetMemorySize(machine, &memorySize); - def->dom->mem.cur_balloon =3D memorySize * 1024; + defdom->mem.cur_balloon =3D memorySize * 1024; /* Currently setting memory and maxMemory as same, cause * the notation here seems to be inconsistent while * reading and while dumping xml */ - virDomainDefSetMemoryTotal(def->dom, memorySize * 1024); - def->dom->os.type =3D VIR_DOMAIN_OSTYPE_HVM; - def->dom->os.arch =3D virArchFromHost(); + virDomainDefSetMemoryTotal(defdom, memorySize * 1024); + defdom->os.type =3D VIR_DOMAIN_OSTYPE_HVM; + defdom->os.arch =3D virArchFromHost(); gVBoxAPI.UIMachine.GetCPUCount(machine, &CPUCount); - if (virDomainDefSetVcpusMax(def->dom, CPUCount, data->xmlopt) < 0) + if (virDomainDefSetVcpusMax(defdom, CPUCount, data->xmlopt) < 0) goto cleanup; - if (virDomainDefSetVcpus(def->dom, CPUCount) < 0) + if (virDomainDefSetVcpus(defdom, CPUCount) < 0) goto cleanup; if (vboxSnapshotGetReadWriteDisks(def, snapshot) < 0) @@ -6325,7 +6328,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, def->state =3D VIR_DOMAIN_SNAPSHOT_SHUTOFF; virUUIDFormat(dom->uuid, uuidstr); - memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN); + memcpy(defdom->uuid, dom->uuid, VIR_UUID_BUFLEN); ret =3D virDomainSnapshotDefFormat(uuidstr, def, data->caps, data->xml= opt, 0); cleanup: --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060502325599.9226149282798; Tue, 19 Mar 2019 22:41:42 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7616720260; Wed, 20 Mar 2019 05:41:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 50EA26B49F; Wed, 20 Mar 2019 05:41:40 +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 E54313FA45; Wed, 20 Mar 2019 05:41:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fE98017208 for ; Wed, 20 Mar 2019 01:41:14 -0400 Received: by smtp.corp.redhat.com (Postfix) id F352C17797; Wed, 20 Mar 2019 05:41:13 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8D6C417795; Wed, 20 Mar 2019 05:41:13 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:54 -0500 Message-Id: <20190320054105.17689-6-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 05/16] snapshot: Drop virDomainSnapshotDef.current 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.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 20 Mar 2019 05:41:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" The only use for the 'current' member of virDomainSnapshotDef was with the PARSE/FORMAT_INTERNAL flag for controlling an internal-use element marking whether a particular snapshot definition was current, and even then, only by the qemu driver on output, and by qemu and test driver on input. But this duplicates vm->snapshot_current, and gets in the way of potential simplifications to have qemu store a single file for all snapshots rather than one file per snapshot. Get rid of the member by adding a bool* parameter during parse (ignored if the PARSE_INTERNAL flag is not set), and by adding a new flag during format (if FORMAT_INTERNAL is set, the value printed in depends on the new FORMAT_CURRENT). Then update the qemu driver accordingly. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/snapshot_conf.h | 6 ++-- src/conf/snapshot_conf.c | 18 ++++++---- src/conf/virdomainsnapshotobjlist.c | 4 +-- src/esx/esx_driver.c | 2 +- src/qemu/qemu_domain.c | 18 +++++----- src/qemu/qemu_driver.c | 51 +++++++++++++++-------------- src/test/test_driver.c | 5 ++- src/vbox/vbox_common.c | 4 +-- src/vz/vz_driver.c | 3 +- tests/domainsnapshotxml2xmltest.c | 5 ++- 10 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index 7230b9950f..b13a500af4 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -88,9 +88,6 @@ struct _virDomainSnapshotDef { virDomainDefPtr dom; virObjectPtr cookie; - - /* Internal use. */ - bool current; /* At most one snapshot in the list should have this set= */ }; typedef enum { @@ -103,6 +100,7 @@ typedef enum { typedef enum { VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE =3D 1 << 0, VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL =3D 1 << 1, + VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT =3D 1 << 2, } virDomainSnapshotFormatFlags; unsigned int virDomainSnapshotFormatConvertXMLFlags(unsigned int flags); @@ -110,11 +108,13 @@ unsigned int virDomainSnapshotFormatConvertXMLFlags(u= nsigned int flags); virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOption= Ptr xmlopt, + bool *current, unsigned int flags= ); virDomainSnapshotDefPtr virDomainSnapshotDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPt= r xmlopt, + bool *current, unsigned int flags); void virDomainSnapshotDefFree(virDomainSnapshotDefPtr def); char *virDomainSnapshotDefFormat(const char *uuidstr, diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ffb1313c89..bf5fdc0647 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -184,12 +184,14 @@ virDomainSnapshotDiskDefParseXML(xmlNodePtr node, /* flags is bitwise-or of virDomainSnapshotParseFlags. * If flags does not include VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE, then - * caps are ignored. + * caps are ignored. If flags does not include + * VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL, then current is ignored. */ static virDomainSnapshotDefPtr virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + bool *current, unsigned int flags) { virDomainSnapshotDefPtr def =3D NULL; @@ -350,7 +352,7 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, _("Could not find 'active' element")); goto cleanup; } - def->current =3D active !=3D 0; + *current =3D active !=3D 0; } if (!offline && virSaveCookieParse(ctxt, &def->cookie, saveCookie) < 0) @@ -374,6 +376,7 @@ virDomainSnapshotDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + bool *current, unsigned int flags) { xmlXPathContextPtr ctxt =3D NULL; @@ -391,7 +394,7 @@ virDomainSnapshotDefParseNode(xmlDocPtr xml, } ctxt->node =3D root; - def =3D virDomainSnapshotDefParse(ctxt, caps, xmlopt, flags); + def =3D virDomainSnapshotDefParse(ctxt, caps, xmlopt, current, flags); cleanup: xmlXPathFreeContext(ctxt); return def; @@ -401,6 +404,7 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + bool *current, unsigned int flags) { virDomainSnapshotDefPtr ret =3D NULL; @@ -410,7 +414,7 @@ virDomainSnapshotDefParseString(const char *xmlStr, if ((xml =3D virXMLParse(NULL, xmlStr, _("(domain_snapshot)")))) { xmlKeepBlanksDefault(keepBlanksDefault); ret =3D virDomainSnapshotDefParseNode(xml, xmlDocGetRootElement(xm= l), - caps, xmlopt, flags); + caps, xmlopt, current, flags); xmlFreeDoc(xml); } xmlKeepBlanksDefault(keepBlanksDefault); @@ -849,7 +853,8 @@ virDomainSnapshotDefFormatInternal(virBufferPtr buf, goto error; if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL) - virBufferAsprintf(buf, "%d\n", def->current); + virBufferAsprintf(buf, "%d\n", + !!(flags & VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT)); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); @@ -875,7 +880,8 @@ virDomainSnapshotDefFormat(const char *uuidstr, virBuffer buf =3D VIR_BUFFER_INITIALIZER; virCheckFlags(VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | - VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL, NULL); + VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL | + VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT, NULL); if (virDomainSnapshotDefFormatInternal(&buf, uuidstr, def, caps, xmlopt, flags) < 0) return NULL; diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index e2f2110108..be44bdde71 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -108,7 +108,8 @@ virDomainSnapshotObjListParse(const char *xmlStr, virDomainSnapshotDefPtr def; virDomainSnapshotObjPtr snap; - def =3D virDomainSnapshotDefParseNode(xml, nodes[i], caps, xmlopt,= flags); + def =3D virDomainSnapshotDefParseNode(xml, nodes[i], caps, xmlopt,= NULL, + flags); if (!def) goto cleanup; if (!(snap =3D virDomainSnapshotAssignDef(snapshots, def))) { @@ -134,7 +135,6 @@ virDomainSnapshotObjListParse(const char *xmlStr, _("no snapshot matching current=3D'%s'"), curre= nt); goto cleanup; } - (*current_snap)->def->current =3D true; } ret =3D 0; diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index c016f8051f..1c6a2dcb71 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4102,7 +4102,7 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const= char *xmlDesc, return NULL; def =3D virDomainSnapshotDefParseString(xmlDesc, priv->caps, - priv->xmlopt, 0); + priv->xmlopt, NULL, 0); if (!def) return NULL; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 86e80391e1..f8387339f0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8458,11 +8458,14 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, char *snapDir =3D NULL; char *snapFile =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; + unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | + VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; + if (vm->current_snapshot =3D=3D snapshot) + flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; virUUIDFormat(vm->def->uuid, uuidstr); - newxml =3D virDomainSnapshotDefFormat( - uuidstr, snapshot->def, caps, xmlopt, - VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | VIR_DOMAIN_SNAPSHOT_FORMAT_INT= ERNAL); + newxml =3D virDomainSnapshotDefFormat(uuidstr, snapshot->def, caps, xm= lopt, + flags); if (newxml =3D=3D NULL) return -1; @@ -8612,6 +8615,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, goto cleanup; if (snap =3D=3D vm->current_snapshot) { + vm->current_snapshot =3D NULL; if (update_parent && snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); @@ -8619,18 +8623,16 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, VIR_WARN("missing parent snapshot matching name '%s'", snap->def->parent); } else { - parentsnap->def->current =3D true; + vm->current_snapshot =3D parentsnap; if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver= ->caps, driver->xmlopt, cfg->snapshotDir) < 0)= { VIR_WARN("failed to set parent snapshot '%s' as curren= t", snap->def->parent); - parentsnap->def->current =3D false; - parentsnap =3D NULL; + vm->current_snapshot =3D NULL; } } } - vm->current_snapshot =3D parentsnap; } if (unlink(snapFile) < 0) @@ -8656,7 +8658,7 @@ int qemuDomainSnapshotDiscardAll(void *payload, virQEMUSnapRemovePtr curr =3D data; int err; - if (snap->def->current) + if (curr->vm->current_snapshot =3D=3D snap) curr->current =3D true; err =3D qemuDomainSnapshotDiscard(curr->driver, curr->vm, snap, false, curr->metadata_only); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6e504dd17c..7e0e76a31a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -419,6 +419,7 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, virDomainSnapshotDefPtr def =3D NULL; virDomainSnapshotObjPtr snap =3D NULL; virDomainSnapshotObjPtr current =3D NULL; + bool cur; unsigned int flags =3D (VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE | VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL); @@ -465,7 +466,7 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, } def =3D virDomainSnapshotDefParseString(xmlStr, caps, - qemu_driver->xmlopt, + qemu_driver->xmlopt, &cur, flags); if (def =3D=3D NULL) { /* Nothing we can do here, skip this one */ @@ -480,7 +481,7 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, snap =3D virDomainSnapshotAssignDef(vm->snapshots, def); if (snap =3D=3D NULL) { virDomainSnapshotDefFree(def); - } else if (snap->def->current) { + } else if (cur) { current =3D snap; if (!vm->current_snapshot) vm->current_snapshot =3D snap; @@ -15661,6 +15662,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, virDomainSnapshotObjPtr snap =3D NULL; virDomainSnapshotPtr snapshot =3D NULL; virDomainSnapshotDefPtr def =3D NULL; + virDomainSnapshotObjPtr current =3D NULL; bool update_current =3D true; bool redefine =3D flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE; unsigned int parse_flags =3D VIR_DOMAIN_SNAPSHOT_PARSE_DISKS; @@ -15722,7 +15724,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, parse_flags |=3D VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE; if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, caps, driver->x= mlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; /* reject snapshot names containing slashes or starting with dot as @@ -15856,19 +15858,17 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, def =3D NULL; } - if (update_current) - snap->def->current =3D true; - if (vm->current_snapshot) { + current =3D vm->current_snapshot; + if (current) { if (!redefine && - VIR_STRDUP(snap->def->parent, vm->current_snapshot->def->name)= < 0) + VIR_STRDUP(snap->def->parent, current->def->name) < 0) goto endjob; if (update_current) { - vm->current_snapshot->def->current =3D false; - if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, + vm->current_snapshot =3D NULL; + if (qemuDomainSnapshotWriteMetadata(vm, current, driver->caps, driver->xmlo= pt, cfg->snapshotDir) < 0) goto endjob; - vm->current_snapshot =3D NULL; } } @@ -15914,6 +15914,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { + if (update_current) + vm->current_snapshot =3D snap; if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0) { @@ -15925,9 +15927,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, _("unable to save metadata for snapshot %s"), snap->def->name); virDomainSnapshotObjListRemove(vm->snapshots, snap); + vm->current_snapshot =3D NULL; } else { - if (update_current) - vm->current_snapshot =3D snap; other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); snap->parent =3D other; @@ -16347,6 +16348,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virDomainObjPtr vm =3D NULL; int ret =3D -1; virDomainSnapshotObjPtr snap =3D NULL; + virDomainSnapshotObjPtr current =3D NULL; virObjectEventPtr event =3D NULL; virObjectEventPtr event2 =3D NULL; int detail; @@ -16441,14 +16443,13 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, } } - - if (vm->current_snapshot) { - vm->current_snapshot->def->current =3D false; - if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, + current =3D vm->current_snapshot; + if (current) { + vm->current_snapshot =3D NULL; + if (qemuDomainSnapshotWriteMetadata(vm, current, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0) goto endjob; - vm->current_snapshot =3D NULL; /* XXX Should we restore vm->current_snapshot after this point * in the failure cases where we know there was no change? */ } @@ -16458,7 +16459,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, * * XXX Should domain snapshots track live xml rather * than inactive xml? */ - snap->def->current =3D true; + vm->current_snapshot =3D snap; if (snap->def->dom) { config =3D virDomainDefCopy(snap->def->dom, caps, driver->xmlopt, NULL, true); @@ -16729,14 +16730,15 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, cleanup: if (ret =3D=3D 0) { + vm->current_snapshot =3D snap; if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, - cfg->snapshotDir) < 0) + cfg->snapshotDir) < 0) { + vm->current_snapshot =3D NULL; ret =3D -1; - else - vm->current_snapshot =3D snap; + } } else if (snap) { - snap->def->current =3D false; + vm->current_snapshot =3D NULL; } if (ret =3D=3D 0 && config && vm->persistent && !(ret =3D virDomainSaveConfig(cfg->configDir, driver->caps, @@ -16864,19 +16866,18 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr sna= pshot, if (rem.err < 0) goto endjob; if (rem.current) { + vm->current_snapshot =3D snap; if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - snap->def->current =3D true; if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0)= { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), snap->def->name); - snap->def->current =3D false; + vm->current_snapshot =3D NULL; goto endjob; } } - vm->current_snapshot =3D snap; } } else if (snap->nchildren) { rep.cfg =3D cfg; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index e1ad9382e0..ca480c1b21 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -819,6 +819,7 @@ testParseDomainSnapshots(testDriverPtr privconn, int ret =3D -1; testDomainNamespaceDefPtr nsdata =3D domobj->def->namespaceData; xmlNodePtr *nodes =3D nsdata->snap_nodes; + bool cur; for (i =3D 0; i < nsdata->num_snap_nodes; i++) { virDomainSnapshotObjPtr snap; @@ -831,6 +832,7 @@ testParseDomainSnapshots(testDriverPtr privconn, def =3D virDomainSnapshotDefParseNode(ctxt->doc, node, privconn->caps, privconn->xmlopt, + &cur, VIR_DOMAIN_SNAPSHOT_PARSE_DISK= S | VIR_DOMAIN_SNAPSHOT_PARSE_INTE= RNAL | VIR_DOMAIN_SNAPSHOT_PARSE_REDE= FINE); @@ -842,7 +844,7 @@ testParseDomainSnapshots(testDriverPtr privconn, goto error; } - if (def->current) { + if (cur) { if (domobj->current_snapshot) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("more than one snapshot claims to be acti= ve")); @@ -6363,6 +6365,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, privconn->caps, privconn->xmlopt, + NULL, parse_flags))) goto cleanup; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index ac7e02eed6..2ca12a28e5 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5502,7 +5502,7 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom, VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT, NULL); if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, data->caps, - data->xmlopt, + data->xmlopt, NULL, VIR_DOMAIN_SNAPSHOT_PARSE_= DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_= REDEFINE))) goto cleanup; @@ -6948,7 +6948,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) } def =3D virDomainSnapshotDefParseString(defXml, data->caps, - data->xmlopt, + data->xmlopt, NULL, VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_REDEFI= NE); if (!def) { diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 1bf6daf9b0..eba366dd2c 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -2618,7 +2618,8 @@ vzDomainSnapshotCreateXML(virDomainPtr domain, goto cleanup; if (!(def =3D virDomainSnapshotDefParseString(xmlDesc, driver->caps, - driver->xmlopt, parse_flag= s))) + driver->xmlopt, NULL, + parse_flags))) goto cleanup; if (def->ndisks > 0) { diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xm= ltest.c index 9eb71780fc..9f7f98585f 100644 --- a/tests/domainsnapshotxml2xmltest.c +++ b/tests/domainsnapshotxml2xmltest.c @@ -80,6 +80,7 @@ testCompareXMLToXMLFiles(const char *inxml, virDomainSnapshotDefPtr def =3D NULL; unsigned int parseflags =3D VIR_DOMAIN_SNAPSHOT_PARSE_DISKS; unsigned int formatflags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE; + bool cur; if (internal) { parseflags |=3D VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL; @@ -96,9 +97,11 @@ testCompareXMLToXMLFiles(const char *inxml, goto cleanup; if (!(def =3D virDomainSnapshotDefParseString(inXmlData, driver.caps, - driver.xmlopt, + driver.xmlopt, &cur, parseflags))) goto cleanup; + if (cur) + formatflags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; if (!(actual =3D virDomainSnapshotDefFormat(uuid, def, driver.caps, driver.xmlopt, --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060496009741.7360342009645; Tue, 19 Mar 2019 22:41:36 -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 3A808C0B6146; Wed, 20 Mar 2019 05:41:34 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0E47B1A913; Wed, 20 Mar 2019 05:41:34 +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 CBE983FB15; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fP73017230 for ; Wed, 20 Mar 2019 01:41:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id 477A11779A; Wed, 20 Mar 2019 05:41:25 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 23DDA17795; Wed, 20 Mar 2019 05:41:14 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:55 -0500 Message-Id: <20190320054105.17689-7-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 06/16] snapshot: Track current snapshot in virDomainSnapshotObjList 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.32]); Wed, 20 Mar 2019 05:41:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" It is easier to track the current snapshot as part of the list of snapshots. In particular, doing so lets us guarantee that the current snapshot is cleared if that snapshot is removed from the list (rather than depending on the caller to do so, and risking a use-after-free problem). This requires the addition of several new accessor functions. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/domain_conf.h | 1 - src/conf/virdomainsnapshotobjlist.h | 10 +++-- src/conf/snapshot_conf.c | 4 +- src/conf/virdomainsnapshotobjlist.c | 63 ++++++++++++++++++++++++----- src/libvirt_private.syms | 4 ++ src/qemu/qemu_domain.c | 14 +++---- src/qemu/qemu_driver.c | 47 +++++++++------------ src/test/test_driver.c | 38 ++++++++--------- 8 files changed, 109 insertions(+), 72 deletions(-) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 538fb50b9e..e608440444 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2517,7 +2517,6 @@ struct _virDomainObj { virDomainDefPtr newDef; /* New definition to activate at shutdown */ virDomainSnapshotObjListPtr snapshots; - virDomainSnapshotObjPtr current_snapshot; bool hasManagedSave; diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index 2a1ee86586..e210849441 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -33,14 +33,12 @@ void virDomainSnapshotObjListFree(virDomainSnapshotObjL= istPtr snapshots); int virDomainSnapshotObjListParse(const char *xmlStr, const unsigned char *domain_uuid, virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr *current_snap, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, unsigned int flags); int virDomainSnapshotObjListFormat(virBufferPtr buf, const char *uuidstr, virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr current_snapsho= t, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, unsigned int flags); @@ -57,7 +55,13 @@ int virDomainSnapshotObjListNum(virDomainSnapshotObjList= Ptr snapshots, unsigned int flags); virDomainSnapshotObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjLi= stPtr snapshots, const char *name); -void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, +virDomainSnapshotObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjLi= stPtr snapshots); +const char *virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr sn= apshots); +bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, + const char *name); +void virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr snapshots, + virDomainSnapshotObjPtr snapshot); +bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotObjPtr snapshot); int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots, virHashIterator iter, diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index bf5fdc0647..c692d36bd1 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -969,9 +969,9 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, return -1; } if (other) { - if (other =3D=3D vm->current_snapshot) { + if (other =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { *update_current =3D true; - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); } /* Drop and rebuild the parent relationship, but keep all diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index be44bdde71..1eecb89a5d 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -40,6 +40,7 @@ struct _virDomainSnapshotObjList { virHashTable *objs; virDomainSnapshotObj metaroot; /* Special parent of all root snapshots= */ + virDomainSnapshotObjPtr current; /* The current snapshot, if any */ }; @@ -50,7 +51,6 @@ int virDomainSnapshotObjListParse(const char *xmlStr, const unsigned char *domain_uuid, virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr *current_snap, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, unsigned int flags) @@ -62,6 +62,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, int n; size_t i; int keepBlanksDefault =3D xmlKeepBlanksDefault(0); + virDomainSnapshotObjPtr snap; VIR_AUTOFREE(xmlNodePtr *) nodes =3D NULL; VIR_AUTOFREE(char *) current =3D NULL; @@ -71,7 +72,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, _("incorrect flags for bulk parse")); return -1; } - if (snapshots->metaroot.nchildren || *current_snap) { + if (snapshots->metaroot.nchildren || snapshots->current) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("bulk define of snapshots only possible with " "no existing snapshot")); @@ -106,7 +107,6 @@ virDomainSnapshotObjListParse(const char *xmlStr, for (i =3D 0; i < n; i++) { virDomainSnapshotDefPtr def; - virDomainSnapshotObjPtr snap; def =3D virDomainSnapshotDefParseNode(xml, nodes[i], caps, xmlopt,= NULL, flags); @@ -129,12 +129,13 @@ virDomainSnapshotObjListParse(const char *xmlStr, } if (current) { - if (!(*current_snap =3D virDomainSnapshotFindByName(snapshots, - current))) { + snap =3D virDomainSnapshotFindByName(snapshots, current); + if (!snap) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("no snapshot matching current=3D'%s'"), curre= nt); goto cleanup; } + virDomainSnapshotSetCurrent(snapshots, snap); } ret =3D 0; @@ -183,7 +184,6 @@ int virDomainSnapshotObjListFormat(virBufferPtr buf, const char *uuidstr, virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr current_snapshot, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, unsigned int flags) @@ -197,9 +197,8 @@ virDomainSnapshotObjListFormat(virBufferPtr buf, }; virBufferAddLit(buf, "def->name); + virBufferEscapeString(buf, " current=3D'%s'", + virDomainSnapshotGetCurrentName(snapshots)); virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); if (virDomainSnapshotForEach(snapshots, virDomainSnapshotFormatOne, @@ -437,10 +436,52 @@ virDomainSnapshotFindByName(virDomainSnapshotObjListP= tr snapshots, return name ? virHashLookup(snapshots->objs, name) : &snapshots->metar= oot; } -void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, + +/* Return the current snapshot, or NULL */ +virDomainSnapshotObjPtr +virDomainSnapshotGetCurrent(virDomainSnapshotObjListPtr snapshots) +{ + return snapshots->current; +} + + +/* Return the current snapshot's name, or NULL */ +const char * +virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr snapshots) +{ + if (snapshots->current) + return snapshots->current->def->name; + return NULL; +} + + +/* Return true if name matches the current snapshot */ +bool +virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, + const char *name) +{ + return snapshots->current && STREQ(snapshots->current->def->name, name= ); +} + + +/* Update the current snapshot, using NULL if no current remains */ +void +virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr snapshots, + virDomainSnapshotObjPtr snapshot) +{ + snapshots->current =3D snapshot; +} + + +/* Remove snapshot from the list; return true if it was current */ +bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotObjPtr snapshot) { + bool ret =3D snapshots->current =3D=3D snapshot; virHashRemoveEntry(snapshots->objs, snapshot->def->name); + if (ret) + snapshots->current =3D NULL; + return ret; } int @@ -507,6 +548,8 @@ virDomainSnapshotUpdateRelations(virDomainSnapshotObjLi= stPtr snapshots) snapshots->metaroot.nchildren =3D 0; snapshots->metaroot.first_child =3D NULL; virHashForEach(snapshots->objs, virDomainSnapshotSetRelations, &act); + if (act.err) + snapshots->current =3D NULL; return act.err; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 26f10bd47f..72c5cef528 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -990,6 +990,9 @@ virDomainListSnapshots; virDomainSnapshotAssignDef; virDomainSnapshotFindByName; virDomainSnapshotForEach; +virDomainSnapshotGetCurrent; +virDomainSnapshotGetCurrentName; +virDomainSnapshotIsCurrentName; virDomainSnapshotObjListFormat; virDomainSnapshotObjListFree; virDomainSnapshotObjListGetNames; @@ -997,6 +1000,7 @@ virDomainSnapshotObjListNew; virDomainSnapshotObjListNum; virDomainSnapshotObjListParse; virDomainSnapshotObjListRemove; +virDomainSnapshotSetCurrent; virDomainSnapshotUpdateRelations; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index f8387339f0..b1a84d3914 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8461,7 +8461,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; - if (vm->current_snapshot =3D=3D snapshot) + if (virDomainSnapshotGetCurrent(vm->snapshots) =3D=3D snapshot) flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; virUUIDFormat(vm->def->uuid, uuidstr); newxml =3D virDomainSnapshotDefFormat(uuidstr, snapshot->def, caps, xm= lopt, @@ -8614,8 +8614,8 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, vm->def->name, snap->def->name) < 0) goto cleanup; - if (snap =3D=3D vm->current_snapshot) { - vm->current_snapshot =3D NULL; + if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { + virDomainSnapshotSetCurrent(vm->snapshots, NULL); if (update_parent && snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); @@ -8623,13 +8623,13 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, VIR_WARN("missing parent snapshot matching name '%s'", snap->def->parent); } else { - vm->current_snapshot =3D parentsnap; + virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver= ->caps, driver->xmlopt, cfg->snapshotDir) < 0)= { VIR_WARN("failed to set parent snapshot '%s' as curren= t", snap->def->parent); - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); } } } @@ -8658,7 +8658,7 @@ int qemuDomainSnapshotDiscardAll(void *payload, virQEMUSnapRemovePtr curr =3D data; int err; - if (curr->vm->current_snapshot =3D=3D snap) + if (virDomainSnapshotGetCurrent(curr->vm->snapshots) =3D=3D snap) curr->current =3D true; err =3D qemuDomainSnapshotDiscard(curr->driver, curr->vm, snap, false, curr->metadata_only); @@ -8679,8 +8679,6 @@ qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr= driver, rem.err =3D 0; virDomainSnapshotForEach(vm->snapshots, qemuDomainSnapshotDiscardAll, &rem); - if (rem.current) - vm->current_snapshot =3D NULL; if (virDomainSnapshotUpdateRelations(vm->snapshots) < 0 && !rem.err) rem.err =3D -1; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7e0e76a31a..6c71382b93 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -482,9 +482,11 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, if (snap =3D=3D NULL) { virDomainSnapshotDefFree(def); } else if (cur) { + if (current) + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Too many snapshots claiming to be curren= t for domain %s"), + vm->def->name); current =3D snap; - if (!vm->current_snapshot) - vm->current_snapshot =3D snap; } VIR_FREE(fullpath); @@ -495,13 +497,7 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, _("Failed to fully read directory %s"), snapDir); - if (vm->current_snapshot !=3D current) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Too many snapshots claiming to be current for do= main %s"), - vm->def->name); - vm->current_snapshot =3D NULL; - } - + virDomainSnapshotSetCurrent(vm->snapshots, current); if (virDomainSnapshotUpdateRelations(vm->snapshots) < 0) virReportError(VIR_ERR_INTERNAL_ERROR, _("Snapshots have inconsistent relations for domain= %s"), @@ -15858,13 +15854,13 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, def =3D NULL; } - current =3D vm->current_snapshot; + current =3D virDomainSnapshotGetCurrent(vm->snapshots); if (current) { if (!redefine && VIR_STRDUP(snap->def->parent, current->def->name) < 0) goto endjob; if (update_current) { - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); if (qemuDomainSnapshotWriteMetadata(vm, current, driver->caps, driver->xmlo= pt, cfg->snapshotDir) < 0) @@ -15915,7 +15911,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { if (update_current) - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0) { @@ -15927,7 +15923,6 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, _("unable to save metadata for snapshot %s"), snap->def->name); virDomainSnapshotObjListRemove(vm->snapshots, snap); - vm->current_snapshot =3D NULL; } else { other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); @@ -16166,7 +16161,7 @@ qemuDomainHasCurrentSnapshot(virDomainPtr domain, if (virDomainHasCurrentSnapshotEnsureACL(domain->conn, vm->def) < 0) goto cleanup; - ret =3D (vm->current_snapshot !=3D NULL); + ret =3D (virDomainSnapshotGetCurrent(vm->snapshots) !=3D NULL); cleanup: virDomainObjEndAPI(&vm); @@ -16223,13 +16218,13 @@ qemuDomainSnapshotCurrent(virDomainPtr domain, if (virDomainSnapshotCurrentEnsureACL(domain->conn, vm->def) < 0) goto cleanup; - if (!vm->current_snapshot) { + if (!virDomainSnapshotGetCurrent(vm->snapshots)) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s", _("the domain does not have a current snapshot")); goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, vm->current_snapshot->def->n= ame); + snapshot =3D virGetDomainSnapshot(domain, virDomainSnapshotGetCurrentN= ame(vm->snapshots)); cleanup: virDomainObjEndAPI(&vm); @@ -16289,8 +16284,7 @@ qemuDomainSnapshotIsCurrent(virDomainSnapshotPtr sn= apshot, if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - ret =3D (vm->current_snapshot && - STREQ(virSnapName(snapshot), vm->current_snapshot->def->name)); + ret =3D virDomainSnapshotIsCurrentName(vm->snapshots, virSnapName(snap= shot)); cleanup: virDomainObjEndAPI(&vm); @@ -16443,14 +16437,14 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, } } - current =3D vm->current_snapshot; + current =3D virDomainSnapshotGetCurrent(vm->snapshots); if (current) { - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); if (qemuDomainSnapshotWriteMetadata(vm, current, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0) goto endjob; - /* XXX Should we restore vm->current_snapshot after this point + /* XXX Should we restore the current snapshot after this point * in the failure cases where we know there was no change? */ } @@ -16459,7 +16453,6 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, * * XXX Should domain snapshots track live xml rather * than inactive xml? */ - vm->current_snapshot =3D snap; if (snap->def->dom) { config =3D virDomainDefCopy(snap->def->dom, caps, driver->xmlopt, NULL, true); @@ -16730,15 +16723,15 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, cleanup: if (ret =3D=3D 0) { - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, cfg->snapshotDir) < 0) { - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); ret =3D -1; } } else if (snap) { - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); } if (ret =3D=3D 0 && config && vm->persistent && !(ret =3D virDomainSaveConfig(cfg->configDir, driver->caps, @@ -16866,7 +16859,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, if (rem.err < 0) goto endjob; if (rem.current) { - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, driver->xmlopt, @@ -16874,7 +16867,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), snap->def->name); - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); goto endjob; } } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index ca480c1b21..9cbef70f1c 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -845,13 +845,13 @@ testParseDomainSnapshots(testDriverPtr privconn, } if (cur) { - if (domobj->current_snapshot) { + if (virDomainSnapshotGetCurrent(domobj->snapshots)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("more than one snapshot claims to be acti= ve")); goto error; } - domobj->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(domobj->snapshots, snap); } } @@ -6151,7 +6151,7 @@ testDomainHasCurrentSnapshot(virDomainPtr domain, if (!(vm =3D testDomObjFromDomain(domain))) return -1; - ret =3D (vm->current_snapshot !=3D NULL); + ret =3D (virDomainSnapshotGetCurrent(vm->snapshots) !=3D NULL); virDomainObjEndAPI(&vm); return ret; @@ -6193,19 +6193,21 @@ testDomainSnapshotCurrent(virDomainPtr domain, { virDomainObjPtr vm; virDomainSnapshotPtr snapshot =3D NULL; + virDomainSnapshotObjPtr current; virCheckFlags(0, NULL); if (!(vm =3D testDomObjFromDomain(domain))) return NULL; - if (!vm->current_snapshot) { + current =3D virDomainSnapshotGetCurrent(vm->snapshots); + if (!current) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s", _("the domain does not have a current snapshot")); goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, vm->current_snapshot->def->n= ame); + snapshot =3D virGetDomainSnapshot(domain, current->def->name); cleanup: virDomainObjEndAPI(&vm); @@ -6253,8 +6255,7 @@ testDomainSnapshotIsCurrent(virDomainSnapshotPtr snap= shot, if (!(vm =3D testDomObjFromSnapshot(snapshot))) return -1; - ret =3D (vm->current_snapshot && - STREQ(virSnapName(snapshot), vm->current_snapshot->def->name)); + ret =3D virDomainSnapshotIsCurrentName(vm->snapshots, virSnapName(snap= shot)); virDomainObjEndAPI(&vm); return ret; @@ -6393,9 +6394,8 @@ testDomainSnapshotCreateXML(virDomainPtr domain, } if (!redefine) { - if (vm->current_snapshot && - (VIR_STRDUP(snap->def->parent, - vm->current_snapshot->def->name) < 0)) + if (VIR_STRDUP(snap->def->parent, + virDomainSnapshotGetCurrentName(vm->snapshots)) < 0) goto cleanup; if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) && @@ -6413,7 +6413,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (snapshot) { virDomainSnapshotObjPtr other; if (update_current) - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); snap->parent =3D other; @@ -6444,9 +6444,7 @@ testDomainSnapshotDiscardAll(void *payload, virDomainSnapshotObjPtr snap =3D payload; testSnapRemoveDataPtr curr =3D data; - if (curr->vm->current_snapshot =3D=3D snap) - curr->current =3D true; - virDomainSnapshotObjListRemove(curr->vm->snapshots, snap); + curr->current |=3D virDomainSnapshotObjListRemove(curr->vm->snapshots,= snap); return 0; } @@ -6511,7 +6509,7 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, testDomainSnapshotDiscardAll, &rem); if (rem.current) - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); } else if (snap->nchildren) { testSnapReparentData rep; rep.parent =3D snap->parent; @@ -6535,7 +6533,7 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, snap->first_child =3D NULL; } else { virDomainSnapshotDropParent(snap); - if (snap =3D=3D vm->current_snapshot) { + if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { if (snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent= ); @@ -6543,7 +6541,7 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, VIR_WARN("missing parent snapshot matching name '%s'", snap->def->parent); } - vm->current_snapshot =3D parentsnap; + virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); } virDomainSnapshotObjListRemove(vm->snapshots, snap); } @@ -6619,9 +6617,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, } } - - if (vm->current_snapshot) - vm->current_snapshot =3D NULL; + virDomainSnapshotSetCurrent(vm->snapshots, NULL); config =3D virDomainDefCopy(snap->def->dom, privconn->caps, privconn->xmlopt, NULL, true); @@ -6746,7 +6742,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, } } - vm->current_snapshot =3D snap; + virDomainSnapshotSetCurrent(vm->snapshots, snap); ret =3D 0; cleanup: if (event) { --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 155306050587312.1507606584114; Tue, 19 Mar 2019 22:41:45 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E3417C05D3E5; Wed, 20 Mar 2019 05:41:43 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B6F6418232; Wed, 20 Mar 2019 05:41:43 +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 7CA1E3FA4B; Wed, 20 Mar 2019 05:41:43 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fS2P017240 for ; Wed, 20 Mar 2019 01:41:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5A85717F8D; Wed, 20 Mar 2019 05:41:28 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id D2A651A913; Wed, 20 Mar 2019 05:41:25 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:56 -0500 Message-Id: <20190320054105.17689-8-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 07/16] snapshot: Add accessors for updating snapshot list relations 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.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 20 Mar 2019 05:41:44 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Rather than allowing a leaky abstraction where multiple drivers have to open-code operations that update the relations in a virDomainSnapshotObjList, it is better to add accessor functions so that updates to relations are maintained closer to the internals. The goal here is to avoid access to, nchildren, first_child, or sibling outside of the lowest level functions, making it easier to refactor later on. While many of the conversions are fairly straightforward, the MoveChildren refactoring can be a bit interesting to follow. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virdomainsnapshotobj.h | 5 ++++ src/conf/virdomainsnapshotobjlist.h | 2 ++ src/conf/virdomainsnapshotobj.c | 42 +++++++++++++++++++++++++++++ src/conf/virdomainsnapshotobjlist.c | 42 ++++++++++++++++++----------- src/libvirt_private.syms | 3 +++ src/qemu/qemu_driver.c | 19 +++---------- src/test/test_driver.c | 18 +++---------- 7 files changed, 85 insertions(+), 46 deletions(-) diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainsnapshotob= j.h index 957f1b2ea8..0981ea4c25 100644 --- a/src/conf/virdomainsnapshotobj.h +++ b/src/conf/virdomainsnapshotobj.h @@ -46,5 +46,10 @@ int virDomainSnapshotForEachDescendant(virDomainSnapshot= ObjPtr snapshot, virHashIterator iter, void *data); void virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot); +void virDomainSnapshotDropChildren(virDomainSnapshotObjPtr snapshot); +void virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from, + virDomainSnapshotObjPtr to); +void virDomainSnapshotSetParent(virDomainSnapshotObjPtr snapshot, + virDomainSnapshotObjPtr parent); #endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */ diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index e210849441..c13a0b4026 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -55,6 +55,7 @@ int virDomainSnapshotObjListNum(virDomainSnapshotObjListP= tr snapshots, unsigned int flags); virDomainSnapshotObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjLi= stPtr snapshots, const char *name); +int virDomainSnapshotObjListSize(virDomainSnapshotObjListPtr snapshots); virDomainSnapshotObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjLi= stPtr snapshots); const char *virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr sn= apshots); bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, @@ -63,6 +64,7 @@ void virDomainSnapshotSetCurrent(virDomainSnapshotObjList= Ptr snapshots, virDomainSnapshotObjPtr snapshot); bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotObjPtr snapshot); +void virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapsho= ts); int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots, virHashIterator iter, void *data); diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainsnapshotob= j.c index 7f92ac21d9..d6b216c7b2 100644 --- a/src/conf/virdomainsnapshotobj.c +++ b/src/conf/virdomainsnapshotobj.c @@ -121,3 +121,45 @@ virDomainSnapshotDropParent(virDomainSnapshotObjPtr sn= apshot) snapshot->parent =3D NULL; snapshot->sibling =3D NULL; } + + +/* Update @snapshot to no longer have children. */ +void +virDomainSnapshotDropChildren(virDomainSnapshotObjPtr snapshot) +{ + snapshot->nchildren =3D 0; + snapshot->first_child =3D NULL; +} + + +/* Add @snapshot to @parent's list of children. */ +void +virDomainSnapshotSetParent(virDomainSnapshotObjPtr snapshot, + virDomainSnapshotObjPtr parent) +{ + snapshot->parent =3D parent; + parent->nchildren++; + snapshot->sibling =3D parent->first_child; + parent->first_child =3D snapshot; +} + + +/* Take all children of @from and convert them into children of @to. */ +void +virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from, + virDomainSnapshotObjPtr to) +{ + virDomainSnapshotObjPtr child; + virDomainSnapshotObjPtr last; + + for (child =3D from->first_child; child; child =3D child->sibling) { + child->parent =3D to; + if (!child->sibling) + last =3D child; + } + to->nchildren +=3D from->nchildren; + last->sibling =3D to->first_child; + to->first_child =3D from->first_child; + from->nchildren =3D 0; + from->first_child =3D NULL; +} diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 1eecb89a5d..9538521ab3 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -72,7 +72,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, _("incorrect flags for bulk parse")); return -1; } - if (snapshots->metaroot.nchildren || snapshots->current) { + if (virDomainSnapshotObjListSize(snapshots)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("bulk define of snapshots only possible with " "no existing snapshot")); @@ -143,9 +143,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, if (ret < 0) { /* There were no snapshots before this call; so on error, just * blindly delete anything created before the failure. */ - virHashRemoveAll(snapshots->objs); - snapshots->metaroot.nchildren =3D 0; - snapshots->metaroot.first_child =3D NULL; + virDomainSnapshotObjListRemoveAll(snapshots); } xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); @@ -437,6 +435,14 @@ virDomainSnapshotFindByName(virDomainSnapshotObjListPt= r snapshots, } +/* Return the number of objects currently in the list */ +int +virDomainSnapshotObjListSize(virDomainSnapshotObjListPtr snapshots) +{ + return virHashSize(snapshots->objs); +} + + /* Return the current snapshot, or NULL */ virDomainSnapshotObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjListPtr snapshots) @@ -484,6 +490,15 @@ bool virDomainSnapshotObjListRemove(virDomainSnapshotO= bjListPtr snapshots, return ret; } +/* Remove all snapshots tracked in the list */ +void +virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapshots) +{ + virHashRemoveAll(snapshots->objs); + virDomainSnapshotDropChildren(&snapshots->metaroot); +} + + int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots, virHashIterator iter, @@ -511,28 +526,26 @@ virDomainSnapshotSetRelations(void *payload, virDomainSnapshotObjPtr obj =3D payload; struct snapshot_set_relation *curr =3D data; virDomainSnapshotObjPtr tmp; + virDomainSnapshotObjPtr parent; - obj->parent =3D virDomainSnapshotFindByName(curr->snapshots, - obj->def->parent); - if (!obj->parent) { + parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->pare= nt); + if (!parent) { curr->err =3D -1; - obj->parent =3D &curr->snapshots->metaroot; + parent =3D &curr->snapshots->metaroot; VIR_WARN("snapshot %s lacks parent", obj->def->name); } else { - tmp =3D obj->parent; + tmp =3D parent; while (tmp && tmp->def) { if (tmp =3D=3D obj) { curr->err =3D -1; - obj->parent =3D &curr->snapshots->metaroot; + parent =3D &curr->snapshots->metaroot; VIR_WARN("snapshot %s in circular chain", obj->def->name); break; } tmp =3D tmp->parent; } } - obj->parent->nchildren++; - obj->sibling =3D obj->parent->first_child; - obj->parent->first_child =3D obj; + virDomainSnapshotSetParent(obj, parent); return 0; } @@ -545,8 +558,7 @@ virDomainSnapshotUpdateRelations(virDomainSnapshotObjLi= stPtr snapshots) { struct snapshot_set_relation act =3D { snapshots, 0 }; - snapshots->metaroot.nchildren =3D 0; - snapshots->metaroot.first_child =3D NULL; + virDomainSnapshotDropChildren(&snapshots->metaroot); virHashForEach(snapshots->objs, virDomainSnapshotSetRelations, &act); if (act.err) snapshots->current =3D NULL; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 72c5cef528..ffc1724850 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -980,9 +980,12 @@ virDomainObjListRename; # conf/virdomainsnapshotobj.h +virDomainSnapshotDropChildren; virDomainSnapshotDropParent; virDomainSnapshotForEachChild; virDomainSnapshotForEachDescendant; +virDomainSnapshotMoveChildren; +virDomainSnapshotSetParent; # conf/virdomainsnapshotobjlist.h diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6c71382b93..eb3d112b69 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15926,10 +15926,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, } else { other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); - snap->parent =3D other; - other->nchildren++; - snap->sibling =3D other->first_child; - other->first_child =3D snap; + virDomainSnapshotSetParent(snap, other); } } else if (snap) { virDomainSnapshotObjListRemove(vm->snapshots, snap); @@ -16763,7 +16760,6 @@ struct _virQEMUSnapReparent { virCapsPtr caps; virDomainXMLOptionPtr xmlopt; int err; - virDomainSnapshotObjPtr last; }; @@ -16779,7 +16775,6 @@ qemuDomainSnapshotReparentChildren(void *payload, return 0; VIR_FREE(snap->def->parent); - snap->parent =3D rep->parent; if (rep->parent->def && VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { @@ -16787,9 +16782,6 @@ qemuDomainSnapshotReparentChildren(void *payload, return 0; } - if (!snap->sibling) - rep->last =3D snap; - rep->err =3D qemuDomainSnapshotWriteMetadata(rep->vm, snap, rep->caps, rep->xmlopt, rep->cfg->snapshotDir); @@ -16877,7 +16869,6 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, rep.parent =3D snap->parent; rep.vm =3D vm; rep.err =3D 0; - rep.last =3D NULL; rep.caps =3D driver->caps; rep.xmlopt =3D driver->xmlopt; virDomainSnapshotForEachChild(snap, @@ -16885,15 +16876,11 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr sna= pshot, &rep); if (rep.err < 0) goto endjob; - /* Can't modify siblings during ForEachChild, so do it now. */ - snap->parent->nchildren +=3D snap->nchildren; - rep.last->sibling =3D snap->parent->first_child; - snap->parent->first_child =3D snap->first_child; + virDomainSnapshotMoveChildren(snap, snap->parent); } if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - snap->nchildren =3D 0; - snap->first_child =3D NULL; + virDomainSnapshotDropChildren(snap); ret =3D 0; } else { ret =3D qemuDomainSnapshotDiscard(driver, vm, snap, true, metadata= _only); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 9cbef70f1c..d3b76bfdbd 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6416,10 +6416,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, virDomainSnapshotSetCurrent(vm->snapshots, snap); other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); - snap->parent =3D other; - other->nchildren++; - snap->sibling =3D other->first_child; - other->first_child =3D snap; + virDomainSnapshotSetParent(snap, other); } virDomainObjEndAPI(&vm); } @@ -6454,7 +6451,6 @@ struct _testSnapReparentData { virDomainSnapshotObjPtr parent; virDomainObjPtr vm; int err; - virDomainSnapshotObjPtr last; }; static int @@ -6469,7 +6465,6 @@ testDomainSnapshotReparentChildren(void *payload, return 0; VIR_FREE(snap->def->parent); - snap->parent =3D rep->parent; if (rep->parent->def && VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { @@ -6477,8 +6472,6 @@ testDomainSnapshotReparentChildren(void *payload, return 0; } - if (!snap->sibling) - rep->last =3D snap; return 0; } @@ -6515,22 +6508,17 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, rep.parent =3D snap->parent; rep.vm =3D vm; rep.err =3D 0; - rep.last =3D NULL; virDomainSnapshotForEachChild(snap, testDomainSnapshotReparentChildren, &rep); if (rep.err < 0) goto cleanup; - /* Can't modify siblings during ForEachChild, so do it now. */ - snap->parent->nchildren +=3D snap->nchildren; - rep.last->sibling =3D snap->parent->first_child; - snap->parent->first_child =3D snap->first_child; + virDomainSnapshotMoveChildren(snap, snap->parent); } if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - snap->nchildren =3D 0; - snap->first_child =3D NULL; + virDomainSnapshotDropChildren(snap); } else { virDomainSnapshotDropParent(snap); if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060495380418.6389324340564; Tue, 19 Mar 2019 22:41:35 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 71EDC83F40; Wed, 20 Mar 2019 05:41:33 +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 498F360CD3; Wed, 20 Mar 2019 05:41:33 +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 07EB4180338A; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fS7b017245 for ; Wed, 20 Mar 2019 01:41:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id DD14B1974C; Wed, 20 Mar 2019 05:41:28 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7F0C917795; Wed, 20 Mar 2019 05:41:28 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:57 -0500 Message-Id: <20190320054105.17689-9-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 08/16] snapshot: Access snapshot def directly when needed 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.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Content-Type: text/plain; charset="utf-8" An upcoming patch will rework virDomainSnapshotObjList to be generic for both snapshots and checkpoints; reduce the churn by adding a new accessor virDomainSnapshotObjGetDef() which returns the snapshot-specific definition even when the list is rewritten to operate only on a base class, then using it at sites that that are specific to snapshots. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virdomainsnapshotobj.h | 6 +++++ src/conf/snapshot_conf.c | 41 +++++++++++++++++------------ src/conf/virdomainsnapshotobjlist.c | 17 +++++++----- src/qemu/qemu_domain.c | 6 ++--- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainsnapshotob= j.h index 0981ea4c25..8f96bfded9 100644 --- a/src/conf/virdomainsnapshotobj.h +++ b/src/conf/virdomainsnapshotobj.h @@ -52,4 +52,10 @@ void virDomainSnapshotMoveChildren(virDomainSnapshotObjP= tr from, void virDomainSnapshotSetParent(virDomainSnapshotObjPtr snapshot, virDomainSnapshotObjPtr parent); +static inline virDomainSnapshotDefPtr +virDomainSnapshotObjGetDef(virDomainSnapshotObjPtr obj) +{ + return obj->def; +} + #endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */ diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index c692d36bd1..aec23f111c 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -456,8 +456,10 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDef= Ptr def, } if (other) { - if ((other->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || - other->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) !=3D + virDomainSnapshotDefPtr otherdef =3D virDomainSnapshotObjGetDef(ot= her); + + if ((otherdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || + otherdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) !=3D (def->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED)) { virReportError(VIR_ERR_INVALID_ARG, @@ -467,7 +469,7 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDefP= tr def, return -1; } - if ((other->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) != =3D + if ((otherdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) != =3D (def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT)) { virReportError(VIR_ERR_INVALID_ARG, _("cannot change between disk only and " @@ -476,15 +478,15 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDe= fPtr def, return -1; } - if (other->def->dom) { + if (otherdef->dom) { if (def->dom) { - if (!virDomainDefCheckABIStability(other->def->dom, + if (!virDomainDefCheckABIStability(otherdef->dom, def->dom, xmlopt)) return -1; } else { /* Transfer the domain def */ - def->dom =3D other->def->dom; - other->def->dom =3D NULL; + def->dom =3D otherdef->dom; + otherdef->dom =3D NULL; } } } @@ -909,7 +911,9 @@ virDomainSnapshotDefIsExternal(virDomainSnapshotDefPtr = def) bool virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap) { - return virDomainSnapshotDefIsExternal(snap->def); + virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(snap); + + return virDomainSnapshotDefIsExternal(def); } int @@ -923,6 +927,7 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, { virDomainSnapshotDefPtr def =3D *defptr; virDomainSnapshotObjPtr other; + virDomainSnapshotDefPtr otherdef; bool check_if_stolen; /* Prevent circular chains */ @@ -940,15 +945,16 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, def->parent, def->name); return -1; } - while (other->def->parent) { - if (STREQ(other->def->parent, def->name)) { + otherdef =3D virDomainSnapshotObjGetDef(other); + while (otherdef->parent) { + if (STREQ(otherdef->parent, def->name)) { virReportError(VIR_ERR_INVALID_ARG, _("parent %s would create cycle to %s"), - other->def->name, def->name); + otherdef->name, def->name); return -1; } other =3D virDomainSnapshotFindByName(vm->snapshots, - other->def->parent); + otherdef->parent); if (!other) { VIR_WARN("snapshots are inconsistent for %s", vm->def->name); @@ -958,12 +964,13 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, } other =3D virDomainSnapshotFindByName(vm->snapshots, def->name); - check_if_stolen =3D other && other->def->dom; + otherdef =3D other ? virDomainSnapshotObjGetDef(other) : NULL; + check_if_stolen =3D other && otherdef->dom; if (virDomainSnapshotRedefineValidate(def, domain->uuid, other, xmlopt, flags) < 0) { /* revert any stealing of the snapshot domain definition */ - if (check_if_stolen && def->dom && !other->def->dom) { - other->def->dom =3D def->dom; + if (check_if_stolen && def->dom && !otherdef->dom) { + otherdef->dom =3D def->dom; def->dom =3D NULL; } return -1; @@ -977,8 +984,8 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, /* Drop and rebuild the parent relationship, but keep all * child relations by reusing snap. */ virDomainSnapshotDropParent(other); - virDomainSnapshotDefFree(other->def); - other->def =3D def; + virDomainSnapshotDefFree(otherdef); + otherdef =3D def; *defptr =3D NULL; *snap =3D other; } diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 9538521ab3..ec670ff5c2 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -171,8 +171,9 @@ virDomainSnapshotFormatOne(void *payload, virDomainSnapshotObjPtr snap =3D payload; struct virDomainSnapshotFormatData *data =3D opaque; return virDomainSnapshotDefFormatInternal(data->buf, data->uuidstr, - snap->def, data->caps, - data->xmlopt, data->flags); + virDomainSnapshotObjGetDef(s= nap), + data->caps, data->xmlopt, + data->flags); } @@ -230,7 +231,7 @@ static void virDomainSnapshotObjFree(virDomainSnapshotO= bjPtr snapshot) VIR_DEBUG("obj=3D%p", snapshot); - virDomainSnapshotDefFree(snapshot->def); + virDomainSnapshotDefFree(virDomainSnapshotObjGetDef(snapshot)); VIR_FREE(snapshot); } @@ -316,15 +317,17 @@ static int virDomainSnapshotObjListCopyNames(void *pa= yload, return 0; if (data->flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) { + virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(obj); + if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE) && - obj->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF) + def->state =3D=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF) return 0; if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY) && - obj->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) + def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) return 0; if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE) && - obj->def->state !=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF && - obj->def->state !=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) + def->state !=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF && + def->state !=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b1a84d3914..e693a3b122 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8460,12 +8460,12 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, char uuidstr[VIR_UUID_STRING_BUFLEN]; unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; + virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(snapshot); if (virDomainSnapshotGetCurrent(vm->snapshots) =3D=3D snapshot) flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; virUUIDFormat(vm->def->uuid, uuidstr); - newxml =3D virDomainSnapshotDefFormat(uuidstr, snapshot->def, caps, xm= lopt, - flags); + newxml =3D virDomainSnapshotDefFormat(uuidstr, def, caps, xmlopt, flag= s); if (newxml =3D=3D NULL) return -1; @@ -8477,7 +8477,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, goto cleanup; } - if (virAsprintf(&snapFile, "%s/%s.xml", snapDir, snapshot->def->name) = < 0) + if (virAsprintf(&snapFile, "%s/%s.xml", snapDir, def->name) < 0) goto cleanup; ret =3D virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060509440917.1288613630159; Tue, 19 Mar 2019 22:41:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8EC1A307EA8C; Wed, 20 Mar 2019 05:41:47 +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 62FB069281; Wed, 20 Mar 2019 05:41:47 +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 29044180338D; Wed, 20 Mar 2019 05:41:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fT9W017250 for ; Wed, 20 Mar 2019 01:41:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6DD1D17797; Wed, 20 Mar 2019 05:41:29 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0D62417795; Wed, 20 Mar 2019 05:41:28 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:58 -0500 Message-Id: <20190320054105.17689-10-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 09/16] snapshot: Refactor list filtering 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.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Wed, 20 Mar 2019 05:41:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Separate the algorithm for which list members to vist (which is generic and can be shared with checkpoints, provided that checkpoints pick the same bit values for some of its flags) from the decision on which members to return (which is specific to snapshots). The typedef for the callback function feels a bit heavy here, but will make it easier to move the common portions in a later patch. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virdomainsnapshotobjlist.h | 4 ++ src/conf/virdomainsnapshotobjlist.c | 60 ++++++++++++++++++----------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index c13a0b4026..c7d4d265cb 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -27,6 +27,10 @@ # include "virdomainsnapshotobj.h" # include "virbuffer.h" +/* Filter that returns true if a given snapshot matches the filter flags */ +typedef bool (*virDomainSnapshotObjListFilter)(virDomainSnapshotObjPtr obj, + unsigned int flags); + virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void); void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots); diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index ec670ff5c2..cd3ea569e3 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -260,6 +260,38 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(vir= DomainSnapshotObjListPtr s } /* Snapshot Obj List functions */ +static bool +virDomainSnapshotFilter(virDomainSnapshotObjPtr obj, + unsigned int flags) +{ + virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(obj); + + /* Caller has already sanitized flags and performed filtering on + * DESCENDANTS and LEAVES. */ + if (flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) { + if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE) && + def->state =3D=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF) + return false; + if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY) && + def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) + return false; + if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE) && + def->state !=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF && + def->state !=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) + return false; + } + + if ((flags & VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL) && + virDomainSnapshotIsExternal(obj)) + return false; + if ((flags & VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL) && + !virDomainSnapshotIsExternal(obj)) + return false; + + return true; +} + + static void virDomainSnapshotObjListDataFree(void *payload, const void *name ATTRIBUTE_UNUSED) @@ -292,12 +324,14 @@ virDomainSnapshotObjListFree(virDomainSnapshotObjList= Ptr snapshots) VIR_FREE(snapshots); } + struct virDomainSnapshotNameData { char **const names; int maxnames; unsigned int flags; int count; bool error; + virDomainSnapshotObjListFilter filter; }; static int virDomainSnapshotObjListCopyNames(void *payload, @@ -316,26 +350,7 @@ static int virDomainSnapshotObjListCopyNames(void *pay= load, if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES) && !obj->nchild= ren) return 0; - if (data->flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) { - virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(obj); - - if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE) && - def->state =3D=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF) - return 0; - if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY) && - def->state =3D=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) - return 0; - if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE) && - def->state !=3D VIR_DOMAIN_SNAPSHOT_SHUTOFF && - def->state !=3D VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT) - return 0; - } - - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL) && - virDomainSnapshotIsExternal(obj)) - return 0; - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL) && - !virDomainSnapshotIsExternal(obj)) + if (data->filter(obj, data->flags)) return 0; if (data->names && data->count < data->maxnames && @@ -350,11 +365,12 @@ static int virDomainSnapshotObjListCopyNames(void *pa= yload, int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotObjPtr from, - char **const names, int maxnames, + char **const names, + int maxnames, unsigned int flags) { struct virDomainSnapshotNameData data =3D { names, maxnames, flags, 0, - false }; + false, virDomainSnapshotFilt= er }; size_t i; if (!from) { --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060512657660.6042407082952; Tue, 19 Mar 2019 22:41:52 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 039E6C04F4DF; Wed, 20 Mar 2019 05:41:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C30A25C48A; Wed, 20 Mar 2019 05:41:50 +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 853323F5CD; Wed, 20 Mar 2019 05:41:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fUBI017256 for ; Wed, 20 Mar 2019 01:41:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 33B211A913; Wed, 20 Mar 2019 05:41:30 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 958D41974C; Wed, 20 Mar 2019 05:41:29 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:40:59 -0500 Message-Id: <20190320054105.17689-11-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 10/16] snapshot: Factor out virDomainMomentDef class 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.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 20 Mar 2019 05:41:51 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Pull out the common parts of virDomainSnapshotDef that will be reused for virDomainCheckpointDef into a new base class. Adjust all callers that use the direct fields (some of it is churn that disappears when the next patch refactors virDomainSnapshotObj; oh well...). Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/moment_conf.h | 41 +++++++++ src/conf/snapshot_conf.h | 11 +-- src/conf/virconftypes.h | 3 + src/conf/Makefile.inc.am | 2 + src/conf/moment_conf.c | 40 +++++++++ src/conf/snapshot_conf.c | 128 ++++++++++++++-------------- src/conf/virdomainsnapshotobj.c | 2 +- src/conf/virdomainsnapshotobjlist.c | 21 ++--- src/esx/esx_driver.c | 16 ++-- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 18 ++-- src/qemu/qemu_driver.c | 50 +++++------ src/test/test_driver.c | 42 ++++----- src/vbox/vbox_common.c | 88 +++++++++---------- 14 files changed, 273 insertions(+), 191 deletions(-) create mode 100644 src/conf/moment_conf.h create mode 100644 src/conf/moment_conf.c diff --git a/src/conf/moment_conf.h b/src/conf/moment_conf.h new file mode 100644 index 0000000000..348cfe5a5c --- /dev/null +++ b/src/conf/moment_conf.h @@ -0,0 +1,41 @@ +/* + * moment_conf.h: domain snapshot/checkpoint base class + * + * Copyright (C) 2006-2019 Red Hat, Inc. + * Copyright (C) 2006-2008 Daniel P. Berrange + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#ifndef LIBVIRT_MOMENT_CONF_H +# define LIBVIRT_MOMENT_CONF_H + +# include "internal.h" +# include "virconftypes.h" + +/* Base class for a domain moment */ +struct _virDomainMomentDef { + /* Common portion of public XML. */ + char *name; + char *description; + char *parent; + long long creationTime; /* in seconds */ + + virDomainDefPtr dom; +}; + +void virDomainMomentDefClear(virDomainMomentDefPtr def); + +#endif /* LIBVIRT_MOMENT_CONF_H */ diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index b13a500af4..4b777e94dc 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -24,6 +24,7 @@ # include "internal.h" # include "domain_conf.h" +# include "moment_conf.h" /* Items related to snapshot state */ @@ -72,11 +73,9 @@ struct _virDomainSnapshotDiskDef { /* Stores the complete snapshot metadata */ struct _virDomainSnapshotDef { - /* Public XML. */ - char *name; - char *description; - char *parent; - long long creationTime; /* in seconds */ + virDomainMomentDef common; + + /* Additional public XML. */ int state; /* virDomainSnapshotState */ int memory; /* virDomainMemorySnapshot */ @@ -85,8 +84,6 @@ struct _virDomainSnapshotDef { size_t ndisks; /* should not exceed dom->ndisks */ virDomainSnapshotDiskDef *disks; - virDomainDefPtr dom; - virObjectPtr cookie; }; diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 3265c0468a..9b9ab314e7 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -217,6 +217,9 @@ typedef virDomainMemoryDef *virDomainMemoryDefPtr; typedef struct _virDomainMemtune virDomainMemtune; typedef virDomainMemtune *virDomainMemtunePtr; +typedef struct _virDomainMomentDef virDomainMomentDef; +typedef virDomainMomentDef *virDomainMomentDefPtr; + typedef struct _virDomainNVRAMDef virDomainNVRAMDef; typedef virDomainNVRAMDef *virDomainNVRAMDefPtr; diff --git a/src/conf/Makefile.inc.am b/src/conf/Makefile.inc.am index 9b4d80485b..d2ff8be8fd 100644 --- a/src/conf/Makefile.inc.am +++ b/src/conf/Makefile.inc.am @@ -22,6 +22,8 @@ DOMAIN_CONF_SOURCES =3D \ conf/domain_nwfilter.h \ conf/virsavecookie.c \ conf/virsavecookie.h \ + conf/moment_conf.c \ + conf/moment_conf.h \ conf/snapshot_conf.c \ conf/snapshot_conf.h \ conf/numa_conf.c \ diff --git a/src/conf/moment_conf.c b/src/conf/moment_conf.c new file mode 100644 index 0000000000..f9276a5d1e --- /dev/null +++ b/src/conf/moment_conf.c @@ -0,0 +1,40 @@ +/* + * moment_conf.c: domain snapshot/checkpoint base class + * + * Copyright (C) 2006-2019 Red Hat, Inc. + * Copyright (C) 2006-2008 Daniel P. Berrange + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "internal.h" +#include "moment_conf.h" +#include "domain_conf.h" +#include "virlog.h" +#include "viralloc.h" + +#define VIR_FROM_THIS VIR_FROM_DOMAIN_SNAPSHOT + +VIR_LOG_INIT("conf.moment_conf"); + +void virDomainMomentDefClear(virDomainMomentDefPtr def) +{ + VIR_FREE(def->name); + VIR_FREE(def->description); + VIR_FREE(def->parent); + virDomainDefFree(def->dom); +} diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index aec23f111c..b80b199ce4 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -87,14 +87,11 @@ void virDomainSnapshotDefFree(virDomainSnapshotDefPtr d= ef) if (!def) return; - VIR_FREE(def->name); - VIR_FREE(def->description); - VIR_FREE(def->parent); + virDomainMomentDefClear(&def->common); VIR_FREE(def->file); for (i =3D 0; i < def->ndisks; i++) virDomainSnapshotDiskDefClear(&def->disks[i]); VIR_FREE(def->disks); - virDomainDefFree(def->dom); virObjectUnref(def->cookie); VIR_FREE(def); } @@ -213,28 +210,28 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, gettimeofday(&tv, NULL); - def->name =3D virXPathString("string(./name)", ctxt); - if (def->name =3D=3D NULL) { + def->common.name =3D virXPathString("string(./name)", ctxt); + if (def->common.name =3D=3D NULL) { if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE) { virReportError(VIR_ERR_XML_ERROR, "%s", _("a redefined snapshot must have a name")); goto cleanup; } - if (virAsprintf(&def->name, "%lld", (long long)tv.tv_sec) < 0) + if (virAsprintf(&def->common.name, "%lld", (long long)tv.tv_sec) <= 0) goto cleanup; } - def->description =3D virXPathString("string(./description)", ctxt); + def->common.description =3D virXPathString("string(./description)", ct= xt); if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE) { if (virXPathLongLong("string(./creationTime)", ctxt, - &def->creationTime) < 0) { + &def->common.creationTime) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing creationTime from existing snapshot"= )); goto cleanup; } - def->parent =3D virXPathString("string(./parent/name)", ctxt); + def->common.parent =3D virXPathString("string(./parent/name)", ctx= t); state =3D virXPathString("string(./state)", ctxt); if (state =3D=3D NULL) { @@ -270,15 +267,15 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, _("missing domain in snapshot")); goto cleanup; } - def->dom =3D virDomainDefParseNode(ctxt->node->doc, domainNode, - caps, xmlopt, NULL, domainfla= gs); - if (!def->dom) + def->common.dom =3D virDomainDefParseNode(ctxt->node->doc, dom= ainNode, + caps, xmlopt, NULL, do= mainflags); + if (!def->common.dom) goto cleanup; } else { VIR_WARN("parsing older snapshot that lacks domain"); } } else { - def->creationTime =3D tv.tv_sec; + def->common.creationTime =3D tv.tv_sec; } memorySnapshot =3D virXPathString("string(./memory/@snapshot)", ctxt); @@ -424,7 +421,7 @@ virDomainSnapshotDefParseString(const char *xmlStr, /* Perform sanity checking on a redefined snapshot definition. If - * @other is non-NULL, this may include swapping def->dom from other + * @other is non-NULL, this may include swapping def->common.dom from other * into def. */ int virDomainSnapshotRedefineValidate(virDomainSnapshotDefPtr def, @@ -442,16 +439,17 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDe= fPtr def, virReportError(VIR_ERR_INVALID_ARG, _("disk-only flag for snapshot %s requires " "disk-snapshot state"), - def->name); + def->common.name); return -1; } - if (def->dom && memcmp(def->dom->uuid, domain_uuid, VIR_UUID_BUFLEN)) { + if (def->common.dom && memcmp(def->common.dom->uuid, domain_uuid, + VIR_UUID_BUFLEN)) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(domain_uuid, uuidstr); virReportError(VIR_ERR_INVALID_ARG, _("definition for snapshot %s must use uuid %s"), - def->name, uuidstr); + def->common.name, uuidstr); return -1; } @@ -465,7 +463,7 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDefP= tr def, virReportError(VIR_ERR_INVALID_ARG, _("cannot change between online and offline " "snapshot state in snapshot %s"), - def->name); + def->common.name); return -1; } @@ -474,24 +472,24 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDe= fPtr def, virReportError(VIR_ERR_INVALID_ARG, _("cannot change between disk only and " "full system in snapshot %s"), - def->name); + def->common.name); return -1; } - if (otherdef->dom) { - if (def->dom) { - if (!virDomainDefCheckABIStability(otherdef->dom, - def->dom, xmlopt)) + if (otherdef->common.dom) { + if (def->common.dom) { + if (!virDomainDefCheckABIStability(otherdef->common.dom, + def->common.dom, xmlopt= )) return -1; } else { /* Transfer the domain def */ - def->dom =3D otherdef->dom; - otherdef->dom =3D NULL; + def->common.dom =3D otherdef->common.dom; + otherdef->common.dom =3D NULL; } } } - if (def->dom) { + if (def->common.dom) { if (external) { align_location =3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL; align_match =3D false; @@ -538,7 +536,7 @@ virDomainSnapshotDefAssignExternalNames(virDomainSnapsh= otDefPtr def) return -1; } - if (!(origpath =3D virDomainDiskGetSource(def->dom->disks[i]))) { + if (!(origpath =3D virDomainDiskGetSource(def->common.dom->disks[i= ]))) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("cannot generate external snapshot name " "for disk '%s' without source"), @@ -562,7 +560,7 @@ virDomainSnapshotDefAssignExternalNames(virDomainSnapsh= otDefPtr def) if ((tmp =3D strrchr(tmppath, '.')) && !strchr(tmp, '/')) *tmp =3D '\0'; - if (virAsprintf(&disk->src->path, "%s.%s", tmppath, def->name) < 0= ) { + if (virAsprintf(&disk->src->path, "%s.%s", tmppath, def->common.na= me) < 0) { VIR_FREE(tmppath); return -1; } @@ -595,7 +593,7 @@ virDomainSnapshotCompareDiskIndex(const void *a, const = void *b) return diska->idx - diskb->idx; } -/* Align def->disks to def->domain. Sort the list of def->disks, +/* Align def->disks to def->common.dom. Sort the list of def->disks, * filling in any missing disks or snapshot state defaults given by * the domain, with a fallback to a passed in default. Convert paths * to disk targets for uniformity. Issue an error and return -1 if @@ -612,31 +610,31 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr d= ef, size_t i; int ndisks; - if (!def->dom) { + if (!def->common.dom) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing domain in snapshot")); goto cleanup; } - if (def->ndisks > def->dom->ndisks) { + if (def->ndisks > def->common.dom->ndisks) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("too many disk snapshot requests for domain")); goto cleanup; } /* Unlikely to have a guest without disks but technically possible. */ - if (!def->dom->ndisks) { + if (!def->common.dom->ndisks) { ret =3D 0; goto cleanup; } - if (!(map =3D virBitmapNew(def->dom->ndisks))) + if (!(map =3D virBitmapNew(def->common.dom->ndisks))) goto cleanup; /* Double check requested disks. */ for (i =3D 0; i < def->ndisks; i++) { virDomainSnapshotDiskDefPtr disk =3D &def->disks[i]; - int idx =3D virDomainDiskIndexByName(def->dom, disk->name, false); + int idx =3D virDomainDiskIndexByName(def->common.dom, disk->name, = false); int disk_snapshot; if (idx < 0) { @@ -654,7 +652,7 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def, ignore_value(virBitmapSetBit(map, idx)); disk->idx =3D idx; - disk_snapshot =3D def->dom->disks[idx]->snapshot; + disk_snapshot =3D def->common.dom->disks[idx]->snapshot; if (!disk->snapshot) { if (disk_snapshot && (!require_match || @@ -682,9 +680,9 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def, disk->src->path, disk->name); goto cleanup; } - if (STRNEQ(disk->name, def->dom->disks[idx]->dst)) { + if (STRNEQ(disk->name, def->common.dom->disks[idx]->dst)) { VIR_FREE(disk->name); - if (VIR_STRDUP(disk->name, def->dom->disks[idx]->dst) < 0) + if (VIR_STRDUP(disk->name, def->common.dom->disks[idx]->dst) <= 0) goto cleanup; } } @@ -692,10 +690,10 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr d= ef, /* Provide defaults for all remaining disks. */ ndisks =3D def->ndisks; if (VIR_EXPAND_N(def->disks, def->ndisks, - def->dom->ndisks - def->ndisks) < 0) + def->common.dom->ndisks - def->ndisks) < 0) goto cleanup; - for (i =3D 0; i < def->dom->ndisks; i++) { + for (i =3D 0; i < def->common.dom->ndisks; i++) { virDomainSnapshotDiskDefPtr disk; if (virBitmapIsBitSet(map, i)) @@ -703,15 +701,15 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr d= ef, disk =3D &def->disks[ndisks++]; if (!(disk->src =3D virStorageSourceNew())) goto cleanup; - if (VIR_STRDUP(disk->name, def->dom->disks[i]->dst) < 0) + if (VIR_STRDUP(disk->name, def->common.dom->disks[i]->dst) < 0) goto cleanup; disk->idx =3D i; /* Don't snapshot empty drives */ - if (virStorageSourceIsEmpty(def->dom->disks[i]->src)) + if (virStorageSourceIsEmpty(def->common.dom->disks[i]->src)) disk->snapshot =3D VIR_DOMAIN_SNAPSHOT_LOCATION_NONE; else - disk->snapshot =3D def->dom->disks[i]->snapshot; + disk->snapshot =3D def->common.dom->disks[i]->snapshot; disk->src->type =3D VIR_STORAGE_TYPE_FILE; if (!disk->snapshot) @@ -802,23 +800,23 @@ virDomainSnapshotDefFormatInternal(virBufferPtr buf, virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virBufferEscapeString(buf, "%s\n", def->name); - if (def->description) + virBufferEscapeString(buf, "%s\n", def->common.name); + if (def->common.description) virBufferEscapeString(buf, "%s\n", - def->description); + def->common.description); virBufferAsprintf(buf, "%s\n", virDomainSnapshotStateTypeToString(def->state)); - if (def->parent) { + if (def->common.parent) { virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virBufferEscapeString(buf, "%s\n", def->parent); + virBufferEscapeString(buf, "%s\n", def->common.parent= ); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); } virBufferAsprintf(buf, "%lld\n", - def->creationTime); + def->common.creationTime); if (def->memory) { virBufferAsprintf(buf, "\n"); } - if (def->dom) { - if (virDomainDefFormatInternal(def->dom, caps, domainflags, buf, + if (def->common.dom) { + if (virDomainDefFormatInternal(def->common.dom, caps, domainflags,= buf, xmlopt) < 0) goto error; } else if (uuidstr) { @@ -931,30 +929,30 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, bool check_if_stolen; /* Prevent circular chains */ - if (def->parent) { - if (STREQ(def->name, def->parent)) { + if (def->common.parent) { + if (STREQ(def->common.name, def->common.parent)) { virReportError(VIR_ERR_INVALID_ARG, _("cannot set snapshot %s as its own parent"), - def->name); + def->common.name); return -1; } - other =3D virDomainSnapshotFindByName(vm->snapshots, def->parent); + other =3D virDomainSnapshotFindByName(vm->snapshots, def->common.p= arent); if (!other) { virReportError(VIR_ERR_INVALID_ARG, _("parent %s for snapshot %s not found"), - def->parent, def->name); + def->common.parent, def->common.name); return -1; } otherdef =3D virDomainSnapshotObjGetDef(other); - while (otherdef->parent) { - if (STREQ(otherdef->parent, def->name)) { + while (otherdef->common.parent) { + if (STREQ(otherdef->common.parent, def->common.name)) { virReportError(VIR_ERR_INVALID_ARG, _("parent %s would create cycle to %s"), - otherdef->name, def->name); + otherdef->common.name, def->common.name); return -1; } other =3D virDomainSnapshotFindByName(vm->snapshots, - otherdef->parent); + otherdef->common.parent); if (!other) { VIR_WARN("snapshots are inconsistent for %s", vm->def->name); @@ -963,15 +961,15 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, } } - other =3D virDomainSnapshotFindByName(vm->snapshots, def->name); + other =3D virDomainSnapshotFindByName(vm->snapshots, def->common.name); otherdef =3D other ? virDomainSnapshotObjGetDef(other) : NULL; - check_if_stolen =3D other && otherdef->dom; + check_if_stolen =3D other && otherdef->common.dom; if (virDomainSnapshotRedefineValidate(def, domain->uuid, other, xmlopt, flags) < 0) { /* revert any stealing of the snapshot domain definition */ - if (check_if_stolen && def->dom && !otherdef->dom) { - otherdef->dom =3D def->dom; - def->dom =3D NULL; + if (check_if_stolen && def->common.dom && !otherdef->common.dom) { + otherdef->common.dom =3D def->common.dom; + def->common.dom =3D NULL; } return -1; } diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainsnapshotob= j.c index d6b216c7b2..0e3ee012fc 100644 --- a/src/conf/virdomainsnapshotobj.c +++ b/src/conf/virdomainsnapshotobj.c @@ -45,7 +45,7 @@ virDomainSnapshotForEachChild(virDomainSnapshotObjPtr sna= pshot, while (child) { virDomainSnapshotObjPtr next =3D child->sibling; - (iter)(child, child->def->name, data); + (iter)(child, child->def->common.name, data); child =3D next; } diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index cd3ea569e3..58f094fa02 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -240,10 +240,10 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(vi= rDomainSnapshotObjListPtr s { virDomainSnapshotObjPtr snap; - if (virHashLookup(snapshots->objs, def->name) !=3D NULL) { + if (virHashLookup(snapshots->objs, def->common.name) !=3D NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected domain snapshot %s already exists"), - def->name); + def->common.name); return NULL; } @@ -251,7 +251,7 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virD= omainSnapshotObjListPtr s return NULL; snap->def =3D def; - if (virHashAddEntry(snapshots->objs, snap->def->name, snap) < 0) { + if (virHashAddEntry(snapshots->objs, snap->def->common.name, snap) < 0= ) { VIR_FREE(snap); return NULL; } @@ -354,7 +354,7 @@ static int virDomainSnapshotObjListCopyNames(void *payl= oad, return 0; if (data->names && data->count < data->maxnames && - VIR_STRDUP(data->names[data->count], obj->def->name) < 0) { + VIR_STRDUP(data->names[data->count], obj->def->common.name) < 0) { data->error =3D true; return 0; } @@ -475,7 +475,7 @@ const char * virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr snapshots) { if (snapshots->current) - return snapshots->current->def->name; + return snapshots->current->def->common.name; return NULL; } @@ -485,7 +485,8 @@ bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, const char *name) { - return snapshots->current && STREQ(snapshots->current->def->name, name= ); + return snapshots->current && STREQ(snapshots->current->def->common.nam= e, + name); } @@ -503,7 +504,7 @@ bool virDomainSnapshotObjListRemove(virDomainSnapshotOb= jListPtr snapshots, virDomainSnapshotObjPtr snapshot) { bool ret =3D snapshots->current =3D=3D snapshot; - virHashRemoveEntry(snapshots->objs, snapshot->def->name); + virHashRemoveEntry(snapshots->objs, snapshot->def->common.name); if (ret) snapshots->current =3D NULL; return ret; @@ -547,18 +548,18 @@ virDomainSnapshotSetRelations(void *payload, virDomainSnapshotObjPtr tmp; virDomainSnapshotObjPtr parent; - parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->pare= nt); + parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->comm= on.parent); if (!parent) { curr->err =3D -1; parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s lacks parent", obj->def->name); + VIR_WARN("snapshot %s lacks parent", obj->def->common.name); } else { tmp =3D parent; while (tmp && tmp->def) { if (tmp =3D=3D obj) { curr->err =3D -1; parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s in circular chain", obj->def->name); + VIR_WARN("snapshot %s in circular chain", obj->def->common= .name); break; } tmp =3D tmp->parent; diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 1c6a2dcb71..5cf881ae35 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4118,7 +4118,7 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const= char *xmlDesc, priv->parsedUri->autoAnswer) < 0 || esxVI_LookupRootSnapshotTreeList(priv->primary, domain->uuid, &rootSnapshotList) < 0 || - esxVI_GetSnapshotTreeByName(rootSnapshotList, def->name, + esxVI_GetSnapshotTreeByName(rootSnapshotList, def->common.name, &snapshotTree, NULL, esxVI_Occurrence_OptionalItem) < 0) { goto cleanup; @@ -4126,12 +4126,12 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, con= st char *xmlDesc, if (snapshotTree) { virReportError(VIR_ERR_OPERATION_INVALID, - _("Snapshot '%s' already exists"), def->name); + _("Snapshot '%s' already exists"), def->common.name= ); goto cleanup; } if (esxVI_CreateSnapshot_Task(priv->primary, virtualMachine->obj, - def->name, def->description, + def->common.name, def->common.descriptio= n, diskOnly ? esxVI_Boolean_False : esxVI_B= oolean_True, quiesce ? esxVI_Boolean_True : esxVI_Boo= lean_False, &task) < 0 || @@ -4148,7 +4148,7 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const= char *xmlDesc, goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, def->name); + snapshot =3D virGetDomainSnapshot(domain, def->common.name); cleanup: virDomainSnapshotDefFree(def); @@ -4189,12 +4189,12 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sn= apshot, goto cleanup; } - def.name =3D virSnapName(snapshot); - def.description =3D snapshotTree->description; - def.parent =3D snapshotTreeParent ? snapshotTreeParent->name : NULL; + def.common.name =3D virSnapName(snapshot); + def.common.description =3D snapshotTree->description; + def.common.parent =3D snapshotTreeParent ? snapshotTreeParent->name : = NULL; if (esxVI_DateTime_ConvertToCalendarTime(snapshotTree->createTime, - &def.creationTime) < 0) { + &def.common.creationTime) < 0= ) { goto cleanup; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index bc02362495..000da64d0e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10859,7 +10859,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, goto error; if (snapshot) - virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); + virCommandAddArgList(cmd, "-loadvm", snapshot->def->common.name, N= ULL); if (def->namespaceData) { qemuDomainCmdlineDefPtr qemucmd; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e693a3b122..8e02f05c3c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8477,7 +8477,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, goto cleanup; } - if (virAsprintf(&snapFile, "%s/%s.xml", snapDir, def->name) < 0) + if (virAsprintf(&snapFile, "%s/%s.xml", snapDir, def->common.name) < 0) goto cleanup; ret =3D virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); @@ -8573,11 +8573,11 @@ qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr dri= ver, /* Prefer action on the disks in use at the time the snapshot was * created; but fall back to current definition if dealing with a * snapshot created prior to libvirt 0.9.5. */ - virDomainDefPtr def =3D snap->def->dom; + virDomainDefPtr def =3D snap->def->common.dom; if (!def) def =3D vm->def; - return qemuDomainSnapshotForEachQcow2Raw(driver, def, snap->def->name, + return qemuDomainSnapshotForEachQcow2Raw(driver, def, snap->def->commo= n.name, op, try_all, def->ndisks); } @@ -8605,30 +8605,30 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, priv =3D vm->privateData; qemuDomainObjEnterMonitor(driver, vm); /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); + qemuMonitorDeleteSnapshot(priv->mon, snap->def->common.name); ignore_value(qemuDomainObjExitMonitor(driver, vm)); } } if (virAsprintf(&snapFile, "%s/%s/%s.xml", cfg->snapshotDir, - vm->def->name, snap->def->name) < 0) + vm->def->name, snap->def->common.name) < 0) goto cleanup; if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); - if (update_parent && snap->def->parent) { + if (update_parent && snap->def->common.parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->parent); + snap->def->common.par= ent); if (!parentsnap) { VIR_WARN("missing parent snapshot matching name '%s'", - snap->def->parent); + snap->def->common.parent); } else { virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver= ->caps, driver->xmlopt, cfg->snapshotDir) < 0)= { VIR_WARN("failed to set parent snapshot '%s' as curren= t", - snap->def->parent); + snap->def->common.parent); virDomainSnapshotSetCurrent(vm->snapshots, NULL); } } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index eb3d112b69..ece9c9329e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14547,7 +14547,7 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDri= verPtr driver, * create them correctly. */ for (i =3D 0; i < snap->def->ndisks && !reuse; i++) { snapdisk =3D &(snap->def->disks[i]); - defdisk =3D snap->def->dom->disks[snapdisk->idx]; + defdisk =3D snap->def->common.dom->disks[snapdisk->idx]; if (snapdisk->snapshot !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) continue; @@ -14663,7 +14663,7 @@ qemuDomainSnapshotCreateActiveInternal(virQEMUDrive= rPtr driver, goto cleanup; } - ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->name); + ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->common.name); if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -1; if (ret < 0) @@ -15726,19 +15726,19 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, /* reject snapshot names containing slashes or starting with dot as * snapshot definitions are saved in files named by the snapshot name = */ if (!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { - if (strchr(def->name, '/')) { + if (strchr(def->common.name, '/')) { virReportError(VIR_ERR_XML_DETAIL, _("invalid snapshot name '%s': " "name can't contain '/'"), - def->name); + def->common.name); goto cleanup; } - if (def->name[0] =3D=3D '.') { + if (def->common.name[0] =3D=3D '.') { virReportError(VIR_ERR_XML_DETAIL, _("invalid snapshot name '%s': " "name can't start with '.'"), - def->name); + def->common.name); goto cleanup; } } @@ -15809,9 +15809,9 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, * conversion in and back out of xml. */ if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, true, true)) || - !(def->dom =3D virDomainDefParseString(xml, caps, driver->xmlo= pt, NULL, - VIR_DOMAIN_DEF_PARSE_INAC= TIVE | - VIR_DOMAIN_DEF_PARSE_SKIP= _VALIDATE))) + !(def->common.dom =3D virDomainDefParseString(xml, caps, drive= r->xmlopt, NULL, + VIR_DOMAIN_DEF_PAR= SE_INACTIVE | + VIR_DOMAIN_DEF_PAR= SE_SKIP_VALIDATE))) goto endjob; if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) { @@ -15857,7 +15857,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, current =3D virDomainSnapshotGetCurrent(vm->snapshots); if (current) { if (!redefine && - VIR_STRDUP(snap->def->parent, current->def->name) < 0) + VIR_STRDUP(snap->def->common.parent, current->def->common.name= ) < 0) goto endjob; if (update_current) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); @@ -15906,7 +15906,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, * do; we've successfully taken the snapshot, and we are now running * on it, so we have to go forward the best we can */ - snapshot =3D virGetDomainSnapshot(domain, snap->def->name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { @@ -15921,11 +15921,11 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, snapshot =3D NULL; virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to save metadata for snapshot %s"), - snap->def->name); + snap->def->common.name); virDomainSnapshotObjListRemove(vm->snapshots, snap); } else { other =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->parent); + snap->def->common.parent); virDomainSnapshotSetParent(snap, other); } } else if (snap) { @@ -16135,7 +16135,7 @@ qemuDomainSnapshotLookupByName(virDomainPtr domain, if (!(snap =3D qemuSnapObjFromName(vm, name))) goto cleanup; - snapshot =3D virGetDomainSnapshot(domain, snap->def->name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); cleanup: virDomainObjEndAPI(&vm); @@ -16185,14 +16185,14 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr = snapshot, if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - if (!snap->def->parent) { + if (!snap->def->common.parent) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("snapshot '%s' does not have a parent"), - snap->def->name); + snap->def->common.name); goto cleanup; } - parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->commo= n.parent); cleanup: virDomainObjEndAPI(&vm); @@ -16417,10 +16417,10 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, } if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) { - if (!snap->def->dom) { + if (!snap->def->common.dom) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, _("snapshot '%s' lacks domain '%s' rollback inf= o"), - snap->def->name, vm->def->name); + snap->def->common.name, vm->def->name); goto endjob; } if (virDomainObjIsActive(vm) && @@ -16450,8 +16450,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, * * XXX Should domain snapshots track live xml rather * than inactive xml? */ - if (snap->def->dom) { - config =3D virDomainDefCopy(snap->def->dom, caps, + if (snap->def->common.dom) { + config =3D virDomainDefCopy(snap->def->common.dom, caps, driver->xmlopt, NULL, true); if (!config) goto endjob; @@ -16557,7 +16557,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_START) < 0) goto endjob; - rc =3D qemuMonitorLoadSnapshot(priv->mon, snap->def->name); + rc =3D qemuMonitorLoadSnapshot(priv->mon, snap->def->common.na= me); if (qemuDomainObjExitMonitor(driver, vm) < 0) goto endjob; if (rc < 0) { @@ -16774,10 +16774,10 @@ qemuDomainSnapshotReparentChildren(void *payload, if (rep->err < 0) return 0; - VIR_FREE(snap->def->parent); + VIR_FREE(snap->def->common.parent); if (rep->parent->def && - VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { + VIR_STRDUP(snap->def->common.parent, rep->parent->def->common.name= ) < 0) { rep->err =3D -1; return 0; } @@ -16858,7 +16858,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, cfg->snapshotDir) < 0)= { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), - snap->def->name); + snap->def->common.name); virDomainSnapshotSetCurrent(vm->snapshots, NULL); goto endjob; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d3b76bfdbd..0caed1de19 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6132,7 +6132,7 @@ testDomainSnapshotLookupByName(virDomainPtr domain, if (!(snap =3D testSnapObjFromName(vm, name))) goto cleanup; - snapshot =3D virGetDomainSnapshot(domain, snap->def->name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); cleanup: virDomainObjEndAPI(&vm); @@ -6173,14 +6173,14 @@ testDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, if (!(snap =3D testSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - if (!snap->def->parent) { + if (!snap->def->common.parent) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("snapshot '%s' does not have a parent"), - snap->def->name); + snap->def->common.name); goto cleanup; } - parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->commo= n.parent); cleanup: virDomainObjEndAPI(&vm); @@ -6207,7 +6207,7 @@ testDomainSnapshotCurrent(virDomainPtr domain, goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, current->def->name); + snapshot =3D virGetDomainSnapshot(domain, current->def->common.name); cleanup: virDomainObjEndAPI(&vm); @@ -6376,11 +6376,11 @@ testDomainSnapshotCreateXML(virDomainPtr domain, &update_current, flags) < 0) goto cleanup; } else { - if (!(def->dom =3D virDomainDefCopy(vm->def, - privconn->caps, - privconn->xmlopt, - NULL, - true))) + if (!(def->common.dom =3D virDomainDefCopy(vm->def, + privconn->caps, + privconn->xmlopt, + NULL, + true))) goto cleanup; if (testDomainSnapshotAlignDisks(vm, def, flags) < 0) @@ -6394,7 +6394,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, } if (!redefine) { - if (VIR_STRDUP(snap->def->parent, + if (VIR_STRDUP(snap->def->common.parent, virDomainSnapshotGetCurrentName(vm->snapshots)) < 0) goto cleanup; @@ -6407,7 +6407,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, } } - snapshot =3D virGetDomainSnapshot(domain, snap->def->name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); cleanup: if (vm) { if (snapshot) { @@ -6415,7 +6415,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (update_current) virDomainSnapshotSetCurrent(vm->snapshots, snap); other =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->parent); + snap->def->common.parent); virDomainSnapshotSetParent(snap, other); } virDomainObjEndAPI(&vm); @@ -6464,10 +6464,10 @@ testDomainSnapshotReparentChildren(void *payload, if (rep->err < 0) return 0; - VIR_FREE(snap->def->parent); + VIR_FREE(snap->def->common.parent); if (rep->parent->def && - VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { + VIR_STRDUP(snap->def->common.parent, rep->parent->def->common.name= ) < 0) { rep->err =3D -1; return 0; } @@ -6522,12 +6522,12 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, } else { virDomainSnapshotDropParent(snap); if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { - if (snap->def->parent) { + if (snap->def->common.parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->parent= ); + snap->def->common= .parent); if (!parentsnap) VIR_WARN("missing parent snapshot matching name '%s'", - snap->def->parent); + snap->def->common.parent); } virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); } @@ -6588,10 +6588,10 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, } if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) { - if (!snap->def->dom) { + if (!snap->def->common.dom) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, _("snapshot '%s' lacks domain '%s' rollback inf= o"), - snap->def->name, vm->def->name); + snap->def->common.name, vm->def->name); goto cleanup; } if (virDomainObjIsActive(vm) && @@ -6607,7 +6607,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, virDomainSnapshotSetCurrent(vm->snapshots, NULL); - config =3D virDomainDefCopy(snap->def->dom, privconn->caps, + config =3D virDomainDefCopy(snap->def->common.dom, privconn->caps, privconn->xmlopt, NULL, true); if (!config) goto cleanup; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 2ca12a28e5..fb8fc3a10c 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -4814,7 +4814,7 @@ vboxSnapshotRedefine(virDomainPtr dom, * read-only disks are in the redefined snapshot's media registry (the= disks need to * be open to query their uuid). */ - for (it =3D 0; it < def->dom->ndisks; it++) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { int diskInMediaRegistry =3D 0; IMedium *readOnlyMedium =3D NULL; PRUnichar *locationUtf =3D NULL; @@ -4828,7 +4828,7 @@ vboxSnapshotRedefine(virDomainPtr dom, VBOX_IID_INITIALIZE(&iid); VBOX_IID_INITIALIZE(&parentiid); diskInMediaRegistry =3D virVBoxSnapshotConfDiskIsInMediaRegistry(s= napshotMachineDesc, - def->dom->disks[it= ]->src->path); + def->common.dom->d= isks[it]->src->path); if (diskInMediaRegistry =3D=3D -1) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to know if disk is in media registry"= )); @@ -4838,7 +4838,7 @@ vboxSnapshotRedefine(virDomainPtr dom, continue; /*The read only disk is not in the media registry*/ - VBOX_UTF8_TO_UTF16(def->dom->disks[it]->src->path, &locationUtf); + VBOX_UTF8_TO_UTF16(def->common.dom->disks[it]->src->path, &locatio= nUtf); rc =3D gVBoxAPI.UIVirtualBox.OpenMedium(data->vboxObj, locationUtf, DeviceType_HardDisk, @@ -4911,7 +4911,7 @@ vboxSnapshotRedefine(virDomainPtr dom, readOnlyDisk->format =3D format; readOnlyDisk->uuid =3D uuid; - if (VIR_STRDUP(readOnlyDisk->location, def->dom->disks[it]->src->p= ath) < 0) { + if (VIR_STRDUP(readOnlyDisk->location, def->common.dom->disks[it]-= >src->path) < 0) { VIR_FREE(readOnlyDisk); goto cleanup; } @@ -5016,12 +5016,12 @@ vboxSnapshotRedefine(virDomainPtr dom, goto cleanup; VIR_DEBUG("New snapshot UUID: %s", newSnapshotPtr->uuid); - if (VIR_STRDUP(newSnapshotPtr->name, def->name) < 0) + if (VIR_STRDUP(newSnapshotPtr->name, def->common.name) < 0) goto cleanup; - newSnapshotPtr->timeStamp =3D virTimeStringThen(def->creationTime * 10= 00); + newSnapshotPtr->timeStamp =3D virTimeStringThen(def->common.creationTi= me * 1000); - if (VIR_STRDUP(newSnapshotPtr->description, def->description) < 0) + if (VIR_STRDUP(newSnapshotPtr->description, def->common.description) <= 0) goto cleanup; if (VIR_STRDUP(newSnapshotPtr->hardware, snapshotMachineDesc->hardware= ) < 0) @@ -5031,12 +5031,12 @@ vboxSnapshotRedefine(virDomainPtr dom, goto cleanup; /*We get the parent disk uuid from the parent disk location to correct= ly fill the storage controller.*/ - for (it =3D 0; it < def->dom->ndisks; it++) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { char *location =3D NULL; const char *uuidReplacing =3D NULL; char *tmp =3D NULL; - location =3D def->dom->disks[it]->src->path; + location =3D def->common.dom->disks[it]->src->path; if (!location) goto cleanup; /*Replacing the uuid*/ @@ -5064,7 +5064,7 @@ vboxSnapshotRedefine(virDomainPtr dom, VIR_FREE(tmp); } - if (virVBoxSnapshotConfAddSnapshotToXmlMachine(newSnapshotPtr, snapsho= tMachineDesc, def->parent) < 0) { + if (virVBoxSnapshotConfAddSnapshotToXmlMachine(newSnapshotPtr, snapsho= tMachineDesc, def->common.parent) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to add the snapshot to the machine descri= ption")); goto cleanup; @@ -5084,10 +5084,10 @@ vboxSnapshotRedefine(virDomainPtr dom, * Open the snapshot's read-write disk's full ancestry to allow openin= g the * read-write disk itself. */ - for (it =3D 0; it < def->dom->ndisks; it++) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { char *location =3D NULL; - location =3D def->dom->disks[it]->src->path; + location =3D def->common.dom->disks[it]->src->path; if (!location) goto cleanup; @@ -5231,7 +5231,7 @@ vboxSnapshotRedefine(virDomainPtr dom, } } else { /*Create a "fake" disk to avoid corrupting children snapshot disks= .*/ - for (it =3D 0; it < def->dom->ndisks; it++) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { IMedium *medium =3D NULL; PRUnichar *locationUtf16 =3D NULL; char *parentUuid =3D NULL; @@ -5247,7 +5247,7 @@ vboxSnapshotRedefine(virDomainPtr dom, VBOX_IID_INITIALIZE(&iid); VBOX_IID_INITIALIZE(&parentiid); - VBOX_UTF8_TO_UTF16(def->dom->disks[it]->src->path, &locationUt= f16); + VBOX_UTF8_TO_UTF16(def->common.dom->disks[it]->src->path, &loc= ationUtf16); rc =3D gVBoxAPI.UIVirtualBox.OpenMedium(data->vboxObj, locationUtf16, DeviceType_HardDisk, @@ -5396,8 +5396,8 @@ vboxSnapshotRedefine(virDomainPtr dom, * All the snapshot structure manipulation is done, we close the disks= we have * previously opened. */ - for (it =3D 0; it < def->dom->ndisks; it++) { - char *location =3D def->dom->disks[it]->src->path; + for (it =3D 0; it < def->common.dom->ndisks; it++) { + char *location =3D def->common.dom->disks[it]->src->path; if (!location) goto cleanup; @@ -5516,7 +5516,7 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom, if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE) { if (vboxSnapshotRedefine(dom, def, isCurrent) < 0) goto cleanup; - ret =3D virGetDomainSnapshot(dom, def->name); + ret =3D virGetDomainSnapshot(dom, def->common.name); goto cleanup; } } @@ -5543,14 +5543,14 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom, goto cleanup; } - VBOX_UTF8_TO_UTF16(def->name, &name); + VBOX_UTF8_TO_UTF16(def->common.name, &name); if (!name) { virReportOOMError(); goto cleanup; } - if (def->description) { - VBOX_UTF8_TO_UTF16(def->description, &description); + if (def->common.description) { + VBOX_UTF8_TO_UTF16(def->common.description, &description); if (!description) { virReportOOMError(); goto cleanup; @@ -5580,7 +5580,7 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom, goto cleanup; } - ret =3D virGetDomainSnapshot(dom, def->name); + ret =3D virGetDomainSnapshot(dom, def->common.name); cleanup: VBOX_RELEASE(progress); @@ -5984,7 +5984,7 @@ vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr = def, vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; size_t i =3D 0, diskCount =3D 0, sdCount =3D 0; int ret =3D -1; - virDomainDefPtr defdom =3D def->dom; + virDomainDefPtr defdom =3D def->common.dom; if (!data->vboxObj) return ret; @@ -6223,10 +6223,10 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomain= SnapshotPtr snapshot, if (!(snap =3D vboxDomainSnapshotGet(data, dom, machine, virSnapName(s= napshot)))) goto cleanup; - if (VIR_ALLOC(def) < 0 || !(def->dom =3D virDomainDefNew())) + if (VIR_ALLOC(def) < 0 || !(def->common.dom =3D virDomainDefNew())) goto cleanup; - defdom =3D def->dom; - if (VIR_STRDUP(def->name, virSnapName(snapshot)) < 0) + defdom =3D def->common.dom; + if (VIR_STRDUP(def->common.name, virSnapName(snapshot)) < 0) goto cleanup; if (gVBoxAPI.vboxSnapshotRedefine) { @@ -6274,7 +6274,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (str16) { VBOX_UTF16_TO_UTF8(str16, &str8); VBOX_UTF16_FREE(str16); - if (VIR_STRDUP(def->description, str8) < 0) { + if (VIR_STRDUP(def->common.description, str8) < 0) { VBOX_UTF8_FREE(str8); goto cleanup; } @@ -6289,7 +6289,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, goto cleanup; } /* timestamp is in milliseconds while creationTime in seconds */ - def->creationTime =3D timestamp / 1000; + def->common.creationTime =3D timestamp / 1000; rc =3D gVBoxAPI.UISnapshot.GetParent(snap, &parent); if (NS_FAILED(rc)) { @@ -6308,7 +6308,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, } VBOX_UTF16_TO_UTF8(str16, &str8); VBOX_UTF16_FREE(str16); - if (VIR_STRDUP(def->parent, str8) < 0) { + if (VIR_STRDUP(def->common.parent, str8) < 0) { VBOX_UTF8_FREE(str8); goto cleanup; } @@ -6990,7 +6990,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) goto cleanup; } - isCurrent =3D virVBoxSnapshotConfIsCurrentSnapshot(snapshotMachineDesc= , def->name); + isCurrent =3D virVBoxSnapshotConfIsCurrentSnapshot(snapshotMachineDesc= , def->common.name); if (isCurrent < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to know if the snapshot is the current sn= apshot")); @@ -7002,8 +7002,8 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) * disks. The first thing to do is to manipulate VirtualBox API to= create * differential read-write disks if the parent snapshot is not nul= l. */ - if (def->parent !=3D NULL) { - for (it =3D 0; it < def->dom->ndisks; it++) { + if (def->common.parent !=3D NULL) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { virVBoxSnapshotConfHardDiskPtr readOnly =3D NULL; IMedium *medium =3D NULL; PRUnichar *locationUtf16 =3D NULL; @@ -7023,7 +7023,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) VBOX_IID_INITIALIZE(&iid); VBOX_IID_INITIALIZE(&parentiid); readOnly =3D virVBoxSnapshotConfHardDiskPtrByLocation(snap= shotMachineDesc, - def->dom->disks[it]->src-= >path); + def->common.dom->disks[it= ]->src->path); if (!readOnly) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot get hard disk by location")); @@ -7061,7 +7061,7 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnapsho= tPtr snapshot) VBOX_UTF8_TO_UTF16("VDI", &formatUtf16); if (virAsprintf(&newLocationUtf8, "%sfakedisk-%s-%d.vdi", - machineLocationPath, def->parent, it) < 0) + machineLocationPath, def->common.parent, i= t) < 0) goto cleanup; VBOX_UTF8_TO_UTF16(newLocationUtf8, &newLocation); rc =3D gVBoxAPI.UIVirtualBox.CreateHardDisk(data->vboxObj, @@ -7159,15 +7159,15 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnaps= hotPtr snapshot) } } } else { - for (it =3D 0; it < def->dom->ndisks; it++) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { const char *uuidRO =3D NULL; char *tmp =3D NULL; uuidRO =3D virVBoxSnapshotConfHardDiskUuidByLocation(snaps= hotMachineDesc, - def->dom->disks[it]-= >src->path); + def->common.dom->dis= ks[it]->src->path); if (!uuidRO) { virReportError(VIR_ERR_INTERNAL_ERROR, _("No such disk in media registry %s"), - def->dom->disks[it]->src->path); + def->common.dom->disks[it]->src->path); goto cleanup; } @@ -7212,14 +7212,14 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnaps= hotPtr snapshot) } } /*If the parent snapshot is not NULL, we remove the-read only disks fr= om the media registry*/ - if (def->parent !=3D NULL) { - for (it =3D 0; it < def->dom->ndisks; it++) { + if (def->common.parent !=3D NULL) { + for (it =3D 0; it < def->common.dom->ndisks; it++) { const char *uuidRO =3D virVBoxSnapshotConfHardDiskUuidByLocation(snapshotMachineD= esc, - def->dom->disks[= it]->src->path); + def->common.dom-= >disks[it]->src->path); if (!uuidRO) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unable to find UUID for location %s"), d= ef->dom->disks[it]->src->path); + _("Unable to find UUID for location %s"), d= ef->common.dom->disks[it]->src->path); goto cleanup; } if (virVBoxSnapshotConfRemoveHardDisk(snapshotMachineDesc->med= iaRegistry, uuidRO) < 0) { @@ -7284,16 +7284,16 @@ vboxDomainSnapshotDeleteMetadataOnly(virDomainSnaps= hotPtr snapshot) } /*removing the snapshot*/ - if (virVBoxSnapshotConfRemoveSnapshot(snapshotMachineDesc, def->name) = < 0) { + if (virVBoxSnapshotConfRemoveSnapshot(snapshotMachineDesc, def->common= .name) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unable to remove snapshot %s"), def->name); + _("Unable to remove snapshot %s"), def->common.name= ); goto cleanup; } if (isCurrent) { VIR_FREE(snapshotMachineDesc->currentSnapshot); - if (def->parent !=3D NULL) { - virVBoxSnapshotConfSnapshotPtr snap =3D virVBoxSnapshotConfSna= pshotByName(snapshotMachineDesc->snapshot, def->parent); + if (def->common.parent !=3D NULL) { + virVBoxSnapshotConfSnapshotPtr snap =3D virVBoxSnapshotConfSna= pshotByName(snapshotMachineDesc->snapshot, def->common.parent); if (!snap) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to get the snapshot to remove")); --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060499622637.8736790654924; Tue, 19 Mar 2019 22:41:39 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8FDBE87627; Wed, 20 Mar 2019 05:41:37 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6710318C7F; Wed, 20 Mar 2019 05:41:37 +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 2E2023FAF5; Wed, 20 Mar 2019 05:41:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fUbT017261 for ; Wed, 20 Mar 2019 01:41:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id D7A3C17F8D; Wed, 20 Mar 2019 05:41:30 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5860F1A913; Wed, 20 Mar 2019 05:41:30 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:00 -0500 Message-Id: <20190320054105.17689-12-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 11/16] snapshot: Switch type of virDomainSnapshotObj.def 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.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 20 Mar 2019 05:41:38 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Another step towards making the object list reusable for both snapshots and checkpoints: the list code only ever needs items that are in the common virDomainMomentDef base type. This undoes a lot of the churn in accessing common members added the earlier patch. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virdomainsnapshotobj.h | 4 +- src/conf/virdomainsnapshotobj.c | 2 +- src/conf/virdomainsnapshotobjlist.c | 19 +++-- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 16 ++--- src/qemu/qemu_driver.c | 107 +++++++++++++++------------- src/test/test_driver.c | 52 +++++++------- 7 files changed, 105 insertions(+), 97 deletions(-) diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainsnapshotob= j.h index 8f96bfded9..ed2884e976 100644 --- a/src/conf/virdomainsnapshotobj.h +++ b/src/conf/virdomainsnapshotobj.h @@ -28,7 +28,7 @@ # include "virhash.h" struct _virDomainSnapshotObj { - virDomainSnapshotDefPtr def; /* non-NULL except for metaroot */ + virDomainMomentDefPtr def; /* non-NULL except for metaroot */ virDomainSnapshotObjPtr parent; /* non-NULL except for metaroot, before virDomainSnapshotUpdateRelations, or @@ -55,7 +55,7 @@ void virDomainSnapshotSetParent(virDomainSnapshotObjPtr s= napshot, static inline virDomainSnapshotDefPtr virDomainSnapshotObjGetDef(virDomainSnapshotObjPtr obj) { - return obj->def; + return (virDomainSnapshotDefPtr) obj->def; } #endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */ diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainsnapshotob= j.c index 0e3ee012fc..d6b216c7b2 100644 --- a/src/conf/virdomainsnapshotobj.c +++ b/src/conf/virdomainsnapshotobj.c @@ -45,7 +45,7 @@ virDomainSnapshotForEachChild(virDomainSnapshotObjPtr sna= pshot, while (child) { virDomainSnapshotObjPtr next =3D child->sibling; - (iter)(child, child->def->common.name, data); + (iter)(child, child->def->name, data); child =3D next; } diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 58f094fa02..a55448c887 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -249,9 +249,9 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virD= omainSnapshotObjListPtr s if (!(snap =3D virDomainSnapshotObjNew())) return NULL; - snap->def =3D def; + snap->def =3D &def->common; - if (virHashAddEntry(snapshots->objs, snap->def->common.name, snap) < 0= ) { + if (virHashAddEntry(snapshots->objs, snap->def->name, snap) < 0) { VIR_FREE(snap); return NULL; } @@ -354,7 +354,7 @@ static int virDomainSnapshotObjListCopyNames(void *payl= oad, return 0; if (data->names && data->count < data->maxnames && - VIR_STRDUP(data->names[data->count], obj->def->common.name) < 0) { + VIR_STRDUP(data->names[data->count], obj->def->name) < 0) { data->error =3D true; return 0; } @@ -475,7 +475,7 @@ const char * virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr snapshots) { if (snapshots->current) - return snapshots->current->def->common.name; + return snapshots->current->def->name; return NULL; } @@ -485,8 +485,7 @@ bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, const char *name) { - return snapshots->current && STREQ(snapshots->current->def->common.nam= e, - name); + return snapshots->current && STREQ(snapshots->current->def->name, name= ); } @@ -504,7 +503,7 @@ bool virDomainSnapshotObjListRemove(virDomainSnapshotOb= jListPtr snapshots, virDomainSnapshotObjPtr snapshot) { bool ret =3D snapshots->current =3D=3D snapshot; - virHashRemoveEntry(snapshots->objs, snapshot->def->common.name); + virHashRemoveEntry(snapshots->objs, snapshot->def->name); if (ret) snapshots->current =3D NULL; return ret; @@ -548,18 +547,18 @@ virDomainSnapshotSetRelations(void *payload, virDomainSnapshotObjPtr tmp; virDomainSnapshotObjPtr parent; - parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->comm= on.parent); + parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->pare= nt); if (!parent) { curr->err =3D -1; parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s lacks parent", obj->def->common.name); + VIR_WARN("snapshot %s lacks parent", obj->def->name); } else { tmp =3D parent; while (tmp && tmp->def) { if (tmp =3D=3D obj) { curr->err =3D -1; parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s in circular chain", obj->def->common= .name); + VIR_WARN("snapshot %s in circular chain", obj->def->name); break; } tmp =3D tmp->parent; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 000da64d0e..bc02362495 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10859,7 +10859,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, goto error; if (snapshot) - virCommandAddArgList(cmd, "-loadvm", snapshot->def->common.name, N= ULL); + virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); if (def->namespaceData) { qemuDomainCmdlineDefPtr qemucmd; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8e02f05c3c..3219ac5e48 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8573,11 +8573,11 @@ qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr dri= ver, /* Prefer action on the disks in use at the time the snapshot was * created; but fall back to current definition if dealing with a * snapshot created prior to libvirt 0.9.5. */ - virDomainDefPtr def =3D snap->def->common.dom; + virDomainDefPtr def =3D snap->def->dom; if (!def) def =3D vm->def; - return qemuDomainSnapshotForEachQcow2Raw(driver, def, snap->def->commo= n.name, + return qemuDomainSnapshotForEachQcow2Raw(driver, def, snap->def->name, op, try_all, def->ndisks); } @@ -8605,30 +8605,30 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, priv =3D vm->privateData; qemuDomainObjEnterMonitor(driver, vm); /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(priv->mon, snap->def->common.name); + qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); ignore_value(qemuDomainObjExitMonitor(driver, vm)); } } if (virAsprintf(&snapFile, "%s/%s/%s.xml", cfg->snapshotDir, - vm->def->name, snap->def->common.name) < 0) + vm->def->name, snap->def->name) < 0) goto cleanup; if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); - if (update_parent && snap->def->common.parent) { + if (update_parent && snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->common.par= ent); + snap->def->parent); if (!parentsnap) { VIR_WARN("missing parent snapshot matching name '%s'", - snap->def->common.parent); + snap->def->parent); } else { virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver= ->caps, driver->xmlopt, cfg->snapshotDir) < 0)= { VIR_WARN("failed to set parent snapshot '%s' as curren= t", - snap->def->common.parent); + snap->def->parent); virDomainSnapshotSetCurrent(vm->snapshots, NULL); } } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ece9c9329e..9ad7be5718 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14535,19 +14535,20 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUD= riverPtr driver, virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); int ret =3D -1; virBuffer buf =3D VIR_BUFFER_INITIALIZER; + virDomainSnapshotDefPtr snapdef =3D virDomainSnapshotObjGetDef(snap); if (!(qemuImgPath =3D qemuFindQemuImgBinary(driver))) goto cleanup; - if (!(created =3D virBitmapNew(snap->def->ndisks))) + if (!(created =3D virBitmapNew(snapdef->ndisks))) goto cleanup; /* If reuse is true, then qemuDomainSnapshotPrepare already * ensured that the new files exist, and it was up to the user to * create them correctly. */ - for (i =3D 0; i < snap->def->ndisks && !reuse; i++) { - snapdisk =3D &(snap->def->disks[i]); - defdisk =3D snap->def->common.dom->disks[snapdisk->idx]; + for (i =3D 0; i < snapdef->ndisks && !reuse; i++) { + snapdisk =3D &(snapdef->disks[i]); + defdisk =3D snapdef->common.dom->disks[snapdisk->idx]; if (snapdisk->snapshot !=3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) continue; @@ -14585,8 +14586,8 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDri= verPtr driver, } /* update disk definitions */ - for (i =3D 0; i < snap->def->ndisks; i++) { - snapdisk =3D &(snap->def->disks[i]); + for (i =3D 0; i < snapdef->ndisks; i++) { + snapdisk =3D &(snapdef->disks[i]); defdisk =3D vm->def->disks[snapdisk->idx]; if (snapdisk->snapshot =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNA= L) { @@ -14612,7 +14613,7 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDri= verPtr driver, if (ret < 0 && created) { ssize_t bit =3D -1; while ((bit =3D virBitmapNextSetBit(created, bit)) >=3D 0) { - snapdisk =3D &(snap->def->disks[bit]); + snapdisk =3D &(snapdef->disks[bit]); if (unlink(snapdisk->src->path) < 0) VIR_WARN("Failed to remove snapshot image '%s'", snapdisk->src->path); @@ -14635,6 +14636,7 @@ qemuDomainSnapshotCreateActiveInternal(virQEMUDrive= rPtr driver, qemuDomainObjPrivatePtr priv =3D vm->privateData; virObjectEventPtr event =3D NULL; bool resume =3D false; + virDomainSnapshotDefPtr snapdef =3D virDomainSnapshotObjGetDef(snap); int ret =3D -1; if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0)) @@ -14663,13 +14665,13 @@ qemuDomainSnapshotCreateActiveInternal(virQEMUDri= verPtr driver, goto cleanup; } - ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->common.name); + ret =3D qemuMonitorCreateSnapshot(priv->mon, snap->def->name); if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -1; if (ret < 0) goto cleanup; - if (!(snap->def->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew(vm)= )) + if (!(snapdef->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew(vm))) goto cleanup; if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) { @@ -15181,19 +15183,20 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPt= r driver, qemuDomainSnapshotDiskDataPtr ret; qemuDomainSnapshotDiskDataPtr dd; char *backingStoreStr; + virDomainSnapshotDefPtr snapdef =3D virDomainSnapshotObjGetDef(snap); - if (VIR_ALLOC_N(ret, snap->def->ndisks) < 0) + if (VIR_ALLOC_N(ret, snapdef->ndisks) < 0) return NULL; - for (i =3D 0; i < snap->def->ndisks; i++) { - if (snap->def->disks[i].snapshot =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATI= ON_NONE) + for (i =3D 0; i < snapdef->ndisks; i++) { + if (snapdef->disks[i].snapshot =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION= _NONE) continue; dd =3D ret + i; dd->disk =3D vm->def->disks[i]; - if (!(dd->src =3D virStorageSourceCopy(snap->def->disks[i].src, fa= lse))) + if (!(dd->src =3D virStorageSourceCopy(snapdef->disks[i].src, fals= e))) goto error; if (virStorageSourceInitChainElement(dd->src, dd->disk->src, false= ) < 0) @@ -15237,7 +15240,7 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr = driver, return ret; error: - qemuDomainSnapshotDiskDataFree(ret, snap->def->ndisks, driver, vm); + qemuDomainSnapshotDiskDataFree(ret, snapdef->ndisks, driver, vm); return NULL; } @@ -15344,6 +15347,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, virQEMUDriverConfigPtr cfg =3D NULL; qemuDomainSnapshotDiskDataPtr diskdata =3D NULL; virErrorPtr orig_err =3D NULL; + virDomainSnapshotDefPtr snapdef =3D virDomainSnapshotObjGetDef(snap); if (virDomainObjCheckActive(vm) < 0) return -1; @@ -15362,7 +15366,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, * now either VIR_DOMAIN_SNAPSHOT_LOCATION_NONE, or * VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL with a valid file name and * qcow2 format. */ - for (i =3D 0; i < snap->def->ndisks; i++) { + for (i =3D 0; i < snapdef->ndisks; i++) { if (!diskdata[i].src) continue; @@ -15385,7 +15389,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, if (qemuDomainObjExitMonitor(driver, vm) < 0) ret =3D -1; - for (i =3D 0; i < snap->def->ndisks; i++) { + for (i =3D 0; i < snapdef->ndisks; i++) { qemuDomainSnapshotDiskDataPtr dd =3D &diskdata[i]; if (!dd->src) @@ -15404,7 +15408,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, error: if (ret < 0) { orig_err =3D virSaveLastError(); - for (i =3D 0; i < snap->def->ndisks; i++) { + for (i =3D 0; i < snapdef->ndisks; i++) { if (!diskdata[i].src) continue; @@ -15421,7 +15425,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, * stopped using them*/ bool paused =3D virDomainObjGetState(vm, NULL) !=3D VIR_DOMAIN_RUN= NING; - for (i =3D 0; i < snap->def->ndisks; i++) { + for (i =3D 0; i < snapdef->ndisks; i++) { if (!diskdata[i].disk) continue; @@ -15442,7 +15446,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, } cleanup: - qemuDomainSnapshotDiskDataFree(diskdata, snap->def->ndisks, driver, vm= ); + qemuDomainSnapshotDiskDataFree(diskdata, snapdef->ndisks, driver, vm); virJSONValueFree(actions); virObjectUnref(cfg); @@ -15466,7 +15470,8 @@ qemuDomainSnapshotCreateActiveExternal(virQEMUDrive= rPtr driver, int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; char *xml =3D NULL; - bool memory =3D snap->def->memory =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_= EXTERNAL; + virDomainSnapshotDefPtr snapdef =3D virDomainSnapshotObjGetDef(snap); + bool memory =3D snapdef->memory =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_EX= TERNAL; bool memory_unlink =3D false; int thaw =3D 0; /* 1 if freeze succeeded, -1 if freeze failed */ bool pmsuspended =3D false; @@ -15557,16 +15562,16 @@ qemuDomainSnapshotCreateActiveExternal(virQEMUDri= verPtr driver, if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, true, true)) || - !(snap->def->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew= (vm))) + !(snapdef->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew(v= m))) goto cleanup; if (!(data =3D virQEMUSaveDataNew(xml, - (qemuDomainSaveCookiePtr) snap->de= f->cookie, + (qemuDomainSaveCookiePtr) snapdef-= >cookie, resume, compressed, driver->xmlopt= ))) goto cleanup; xml =3D NULL; - if ((ret =3D qemuDomainSaveMemory(driver, vm, snap->def->file, dat= a, + if ((ret =3D qemuDomainSaveMemory(driver, vm, snapdef->file, data, compressedpath, 0, QEMU_ASYNC_JOB_SNAPSHOT)) < 0) goto cleanup; @@ -15641,7 +15646,7 @@ qemuDomainSnapshotCreateActiveExternal(virQEMUDrive= rPtr driver, VIR_FREE(compressedpath); virObjectUnref(cfg); if (memory_unlink && ret < 0) - unlink(snap->def->file); + unlink(snapdef->file); return ret; } @@ -15857,7 +15862,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, current =3D virDomainSnapshotGetCurrent(vm->snapshots); if (current) { if (!redefine && - VIR_STRDUP(snap->def->common.parent, current->def->common.name= ) < 0) + VIR_STRDUP(snap->def->parent, current->def->name) < 0) goto endjob; if (update_current) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); @@ -15875,7 +15880,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, * snapshot name in at least one of the domain's disks? */ } else if (virDomainObjIsActive(vm)) { if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY || - snap->def->memory =3D=3D VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL= ) { + virDomainSnapshotObjGetDef(snap)->memory =3D=3D VIR_DOMAIN_SNA= PSHOT_LOCATION_EXTERNAL) { /* external full system or disk snapshot */ if (qemuDomainSnapshotCreateActiveExternal(driver, vm, snap, flags) < = 0) @@ -15906,7 +15911,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, * do; we've successfully taken the snapshot, and we are now running * on it, so we have to go forward the best we can */ - snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->name); endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { @@ -15921,11 +15926,11 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, snapshot =3D NULL; virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to save metadata for snapshot %s"), - snap->def->common.name); + snap->def->name); virDomainSnapshotObjListRemove(vm->snapshots, snap); } else { other =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->common.parent); + snap->def->parent); virDomainSnapshotSetParent(snap, other); } } else if (snap) { @@ -16135,7 +16140,7 @@ qemuDomainSnapshotLookupByName(virDomainPtr domain, if (!(snap =3D qemuSnapObjFromName(vm, name))) goto cleanup; - snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->name); cleanup: virDomainObjEndAPI(&vm); @@ -16185,14 +16190,14 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr = snapshot, if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - if (!snap->def->common.parent) { + if (!snap->def->parent) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("snapshot '%s' does not have a parent"), - snap->def->common.name); + snap->def->name); goto cleanup; } - parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->commo= n.parent); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); cleanup: virDomainObjEndAPI(&vm); @@ -16252,7 +16257,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr s= napshot, virUUIDFormat(virSnapDom(snapshot)->uuid, uuidstr); - xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, + xml =3D virDomainSnapshotDefFormat(uuidstr, virDomainSnapshotObjGetDef= (snap), driver->caps, driver->xmlopt, virDomainSnapshotFormatConvertXMLFlag= s(flags)); @@ -16340,6 +16345,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, int ret =3D -1; virDomainSnapshotObjPtr snap =3D NULL; virDomainSnapshotObjPtr current =3D NULL; + virDomainSnapshotDefPtr snapdef; virObjectEventPtr event =3D NULL; virObjectEventPtr event2 =3D NULL; int detail; @@ -16398,10 +16404,11 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, if (!(snap =3D qemuSnapObjFromSnapshot(vm, snapshot))) goto endjob; + snapdef =3D virDomainSnapshotObjGetDef(snap); if (!vm->persistent && - snap->def->state !=3D VIR_DOMAIN_SNAPSHOT_RUNNING && - snap->def->state !=3D VIR_DOMAIN_SNAPSHOT_PAUSED && + snapdef->state !=3D VIR_DOMAIN_SNAPSHOT_RUNNING && + snapdef->state !=3D VIR_DOMAIN_SNAPSHOT_PAUSED && (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) =3D=3D 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", @@ -16417,15 +16424,15 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, } if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) { - if (!snap->def->common.dom) { + if (!snap->def->dom) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, _("snapshot '%s' lacks domain '%s' rollback inf= o"), - snap->def->common.name, vm->def->name); + snap->def->name, vm->def->name); goto endjob; } if (virDomainObjIsActive(vm) && - !(snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || - snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) && + !(snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || + snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) && (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED))) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, "%s", @@ -16450,16 +16457,16 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr s= napshot, * * XXX Should domain snapshots track live xml rather * than inactive xml? */ - if (snap->def->common.dom) { - config =3D virDomainDefCopy(snap->def->common.dom, caps, + if (snap->def->dom) { + config =3D virDomainDefCopy(snap->def->dom, caps, driver->xmlopt, NULL, true); if (!config) goto endjob; } - cookie =3D (qemuDomainSaveCookiePtr) snap->def->cookie; + cookie =3D (qemuDomainSaveCookiePtr) snapdef->cookie; - switch ((virDomainSnapshotState) snap->def->state) { + switch ((virDomainSnapshotState) snapdef->state) { case VIR_DOMAIN_SNAPSHOT_RUNNING: case VIR_DOMAIN_SNAPSHOT_PAUSED: @@ -16557,7 +16564,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_START) < 0) goto endjob; - rc =3D qemuMonitorLoadSnapshot(priv->mon, snap->def->common.na= me); + rc =3D qemuMonitorLoadSnapshot(priv->mon, snap->def->name); if (qemuDomainObjExitMonitor(driver, vm) < 0) goto endjob; if (rc < 0) { @@ -16600,7 +16607,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, /* Touch up domain state. */ if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) && - (snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED || + (snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED || (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED))) { /* Transitions 3, 6, 9 */ virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, @@ -16709,7 +16716,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid target domain state '%s'. Refusing " "snapshot reversion"), - virDomainSnapshotStateTypeToString(snap->def->state= )); + virDomainSnapshotStateTypeToString(snapdef->state)); goto endjob; } @@ -16774,10 +16781,10 @@ qemuDomainSnapshotReparentChildren(void *payload, if (rep->err < 0) return 0; - VIR_FREE(snap->def->common.parent); + VIR_FREE(snap->def->parent); if (rep->parent->def && - VIR_STRDUP(snap->def->common.parent, rep->parent->def->common.name= ) < 0) { + VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { rep->err =3D -1; return 0; } @@ -16858,7 +16865,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, cfg->snapshotDir) < 0)= { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), - snap->def->common.name); + snap->def->name); virDomainSnapshotSetCurrent(vm->snapshots, NULL); goto endjob; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 0caed1de19..eac6160532 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6132,7 +6132,7 @@ testDomainSnapshotLookupByName(virDomainPtr domain, if (!(snap =3D testSnapObjFromName(vm, name))) goto cleanup; - snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->name); cleanup: virDomainObjEndAPI(&vm); @@ -6173,14 +6173,14 @@ testDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, if (!(snap =3D testSnapObjFromSnapshot(vm, snapshot))) goto cleanup; - if (!snap->def->common.parent) { + if (!snap->def->parent) { virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, _("snapshot '%s' does not have a parent"), - snap->def->common.name); + snap->def->name); goto cleanup; } - parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->commo= n.parent); + parent =3D virGetDomainSnapshot(virSnapDom(snapshot), snap->def->paren= t); cleanup: virDomainObjEndAPI(&vm); @@ -6207,7 +6207,7 @@ testDomainSnapshotCurrent(virDomainPtr domain, goto cleanup; } - snapshot =3D virGetDomainSnapshot(domain, current->def->common.name); + snapshot =3D virGetDomainSnapshot(domain, current->def->name); cleanup: virDomainObjEndAPI(&vm); @@ -6234,8 +6234,8 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, virUUIDFormat(virSnapDom(snapshot)->uuid, uuidstr); - xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps, - privconn->xmlopt, + xml =3D virDomainSnapshotDefFormat(uuidstr, virDomainSnapshotObjGetDef= (snap), + privconn->caps, privconn->xmlopt, virDomainSnapshotFormatConvertXMLFlag= s(flags)); cleanup: @@ -6394,7 +6394,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, } if (!redefine) { - if (VIR_STRDUP(snap->def->common.parent, + if (VIR_STRDUP(snap->def->parent, virDomainSnapshotGetCurrentName(vm->snapshots)) < 0) goto cleanup; @@ -6407,7 +6407,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, } } - snapshot =3D virGetDomainSnapshot(domain, snap->def->common.name); + snapshot =3D virGetDomainSnapshot(domain, snap->def->name); cleanup: if (vm) { if (snapshot) { @@ -6415,7 +6415,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (update_current) virDomainSnapshotSetCurrent(vm->snapshots, snap); other =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->common.parent); + snap->def->parent); virDomainSnapshotSetParent(snap, other); } virDomainObjEndAPI(&vm); @@ -6464,10 +6464,10 @@ testDomainSnapshotReparentChildren(void *payload, if (rep->err < 0) return 0; - VIR_FREE(snap->def->common.parent); + VIR_FREE(snap->def->parent); if (rep->parent->def && - VIR_STRDUP(snap->def->common.parent, rep->parent->def->common.name= ) < 0) { + VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) { rep->err =3D -1; return 0; } @@ -6522,12 +6522,12 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, } else { virDomainSnapshotDropParent(snap); if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { - if (snap->def->common.parent) { + if (snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, - snap->def->common= .parent); + snap->def->parent= ); if (!parentsnap) VIR_WARN("missing parent snapshot matching name '%s'", - snap->def->common.parent); + snap->def->parent); } virDomainSnapshotSetCurrent(vm->snapshots, parentsnap); } @@ -6550,6 +6550,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, virObjectEventPtr event =3D NULL; virObjectEventPtr event2 =3D NULL; virDomainDefPtr config =3D NULL; + virDomainSnapshotDefPtr snapdef; int ret =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | @@ -6575,10 +6576,11 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (!(snap =3D testSnapObjFromSnapshot(vm, snapshot))) goto cleanup; + snapdef =3D virDomainSnapshotObjGetDef(snap); if (!vm->persistent && - snap->def->state !=3D VIR_DOMAIN_SNAPSHOT_RUNNING && - snap->def->state !=3D VIR_DOMAIN_SNAPSHOT_PAUSED && + snapdef->state !=3D VIR_DOMAIN_SNAPSHOT_RUNNING && + snapdef->state !=3D VIR_DOMAIN_SNAPSHOT_PAUSED && (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) =3D=3D 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", @@ -6588,15 +6590,15 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, } if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) { - if (!snap->def->common.dom) { + if (!snap->def->dom) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, _("snapshot '%s' lacks domain '%s' rollback inf= o"), - snap->def->common.name, vm->def->name); + snap->def->name, vm->def->name); goto cleanup; } if (virDomainObjIsActive(vm) && - !(snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || - snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) && + !(snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || + snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) && (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED))) { virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, "%s", @@ -6607,13 +6609,13 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virDomainSnapshotSetCurrent(vm->snapshots, NULL); - config =3D virDomainDefCopy(snap->def->common.dom, privconn->caps, + config =3D virDomainDefCopy(snap->def->dom, privconn->caps, privconn->xmlopt, NULL, true); if (!config) goto cleanup; - if (snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || - snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) { + if (snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_RUNNING || + snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED) { /* Transitions 2, 3, 5, 6, 8, 9 */ bool was_running =3D false; bool was_stopped =3D false; @@ -6672,7 +6674,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, /* Touch up domain state. */ if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING) && - (snap->def->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED || + (snapdef->state =3D=3D VIR_DOMAIN_SNAPSHOT_PAUSED || (flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED))) { /* Transitions 3, 6, 9 */ virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060515994969.6915353931108; Tue, 19 Mar 2019 22:41:55 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3FE2230BC642; Wed, 20 Mar 2019 05:41:54 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 12BDE5D787; Wed, 20 Mar 2019 05:41:54 +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 C6FF03D387; Wed, 20 Mar 2019 05:41:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fVPG017269 for ; Wed, 20 Mar 2019 01:41:31 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9E0CF17797; Wed, 20 Mar 2019 05:41:31 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0881417795; Wed, 20 Mar 2019 05:41:30 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:01 -0500 Message-Id: <20190320054105.17689-13-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 12/16] snapshot: Rename virDomainSnapshotObjPtr 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.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Wed, 20 Mar 2019 05:41:54 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Now that the core of SnapshotObj is agnostic to snapshots and can be shared with upcoming checkpoint code, it is time to rename the struct and the functions specific to list operations. A later patch will shuffle which file holds the common code. This is a fairly mechanical patch. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/snapshot_conf.h | 6 +- src/conf/virconftypes.h | 6 +- src/conf/virdomainsnapshotobj.h | 38 +++++------ src/conf/virdomainsnapshotobjlist.h | 26 ++++---- src/qemu/qemu_command.h | 2 +- src/qemu/qemu_domain.h | 6 +- src/qemu/qemu_process.h | 4 +- src/conf/snapshot_conf.c | 10 +-- src/conf/virdomainsnapshotobj.c | 96 +++++++++++++------------- src/conf/virdomainsnapshotobjlist.c | 100 ++++++++++++++-------------- src/libvirt_private.syms | 12 ++-- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 12 ++-- src/qemu/qemu_driver.c | 82 +++++++++++------------ src/qemu/qemu_process.c | 4 +- src/test/test_driver.c | 58 ++++++++-------- src/vz/vz_driver.c | 34 +++++----- src/vz/vz_sdk.c | 4 +- 18 files changed, 251 insertions(+), 251 deletions(-) diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index 4b777e94dc..20487454c9 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -154,19 +154,19 @@ int virDomainSnapshotAlignDisks(virDomainSnapshotDefP= tr snapshot, VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION) bool virDomainSnapshotDefIsExternal(virDomainSnapshotDefPtr def); -bool virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap); +bool virDomainSnapshotIsExternal(virDomainMomentObjPtr snap); int virDomainSnapshotRedefinePrep(virDomainPtr domain, virDomainObjPtr vm, virDomainSnapshotDefPtr *def, - virDomainSnapshotObjPtr *snap, + virDomainMomentObjPtr *snap, virDomainXMLOptionPtr xmlopt, bool *update_current, unsigned int flags); int virDomainSnapshotRedefineValidate(virDomainSnapshotDefPtr def, const unsigned char *domain_uuid, - virDomainSnapshotObjPtr other, + virDomainMomentObjPtr other, virDomainXMLOptionPtr xmlopt, unsigned int flags); diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 9b9ab314e7..574815cf04 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -220,6 +220,9 @@ typedef virDomainMemtune *virDomainMemtunePtr; typedef struct _virDomainMomentDef virDomainMomentDef; typedef virDomainMomentDef *virDomainMomentDefPtr; +typedef struct _virDomainMomentObj virDomainMomentObj; +typedef virDomainMomentObj *virDomainMomentObjPtr; + typedef struct _virDomainNVRAMDef virDomainNVRAMDef; typedef virDomainNVRAMDef *virDomainNVRAMDefPtr; @@ -280,9 +283,6 @@ typedef virDomainSmartcardDef *virDomainSmartcardDefPtr; typedef struct _virDomainSnapshotDef virDomainSnapshotDef; typedef virDomainSnapshotDef *virDomainSnapshotDefPtr; -typedef struct _virDomainSnapshotObj virDomainSnapshotObj; -typedef virDomainSnapshotObj *virDomainSnapshotObjPtr; - typedef struct _virDomainSnapshotObjList virDomainSnapshotObjList; typedef virDomainSnapshotObjList *virDomainSnapshotObjListPtr; diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainsnapshotob= j.h index ed2884e976..86c5f6860b 100644 --- a/src/conf/virdomainsnapshotobj.h +++ b/src/conf/virdomainsnapshotobj.h @@ -27,33 +27,33 @@ # include "virconftypes.h" # include "virhash.h" -struct _virDomainSnapshotObj { +struct _virDomainMomentObj { virDomainMomentDefPtr def; /* non-NULL except for metaroot */ - virDomainSnapshotObjPtr parent; /* non-NULL except for metaroot, before - virDomainSnapshotUpdateRelations, or - after virDomainSnapshotDropParent */ - virDomainSnapshotObjPtr sibling; /* NULL if last child of parent */ + virDomainMomentObjPtr parent; /* non-NULL except for metaroot, before + virDomainSnapshotUpdateRelations, or + after virDomainMomentDropParent */ + virDomainMomentObjPtr sibling; /* NULL if last child of parent */ size_t nchildren; - virDomainSnapshotObjPtr first_child; /* NULL if no children */ + virDomainMomentObjPtr first_child; /* NULL if no children */ }; -int virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot, - virHashIterator iter, - void *data); -int virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot, - virHashIterator iter, - void *data); -void virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot); -void virDomainSnapshotDropChildren(virDomainSnapshotObjPtr snapshot); -void virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from, - virDomainSnapshotObjPtr to); -void virDomainSnapshotSetParent(virDomainSnapshotObjPtr snapshot, - virDomainSnapshotObjPtr parent); +int virDomainMomentForEachChild(virDomainMomentObjPtr moment, + virHashIterator iter, + void *data); +int virDomainMomentForEachDescendant(virDomainMomentObjPtr moment, + virHashIterator iter, + void *data); +void virDomainMomentDropParent(virDomainMomentObjPtr moment); +void virDomainMomentDropChildren(virDomainMomentObjPtr moment); +void virDomainMomentMoveChildren(virDomainMomentObjPtr from, + virDomainMomentObjPtr to); +void virDomainMomentSetParent(virDomainMomentObjPtr moment, + virDomainMomentObjPtr parent); static inline virDomainSnapshotDefPtr -virDomainSnapshotObjGetDef(virDomainSnapshotObjPtr obj) +virDomainSnapshotObjGetDef(virDomainMomentObjPtr obj) { return (virDomainSnapshotDefPtr) obj->def; } diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index c7d4d265cb..1af367639d 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -27,9 +27,9 @@ # include "virdomainsnapshotobj.h" # include "virbuffer.h" -/* Filter that returns true if a given snapshot matches the filter flags */ -typedef bool (*virDomainSnapshotObjListFilter)(virDomainSnapshotObjPtr obj, - unsigned int flags); +/* Filter that returns true if a given moment matches the filter flags */ +typedef bool (*virDomainMomentObjListFilter)(virDomainMomentObjPtr obj, + unsigned int flags); virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void); void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots); @@ -47,27 +47,27 @@ int virDomainSnapshotObjListFormat(virBufferPtr buf, virDomainXMLOptionPtr xmlopt, unsigned int flags); -virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjLis= tPtr snapshots, - virDomainSnapshotDefPtr= def); +virDomainMomentObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListP= tr snapshots, + virDomainSnapshotDefPtr d= ef); int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, char **const names, int maxnames, unsigned int flags); int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, unsigned int flags); -virDomainSnapshotObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjLi= stPtr snapshots, - const char *name); +virDomainMomentObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjList= Ptr snapshots, + const char *name); int virDomainSnapshotObjListSize(virDomainSnapshotObjListPtr snapshots); -virDomainSnapshotObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjLi= stPtr snapshots); +virDomainMomentObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjList= Ptr snapshots); const char *virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr sn= apshots); bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, const char *name); void virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr snapshot); + virDomainMomentObjPtr snapshot); bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr snapshot); + virDomainMomentObjPtr snapshot); void virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapsho= ts); int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots, virHashIterator iter, @@ -75,7 +75,7 @@ int virDomainSnapshotForEach(virDomainSnapshotObjListPtr = snapshots, int virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots= ); int virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, virDomainPtr dom, virDomainSnapshotPtr **snaps, unsigned int flags); diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 077484094d..77578155e6 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -47,7 +47,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr drive= r, virSecurityManagerPtr secManager, virDomainObjPtr vm, const char *migrateURI, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, bool standalone, bool enableFips, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index fb361515ba..ca24de15e5 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -681,20 +681,20 @@ int qemuDomainLogAppendMessage(virQEMUDriverPtr drive= r, const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver); int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, const char *snapshotDir); int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, const char *op, bool try_all); int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, bool update_current, bool metadata_only); diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 3367cd3fe5..d20bd5306e 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -92,7 +92,7 @@ int qemuProcessStart(virConnectPtr conn, const char *migrateFrom, int stdin_fd, const char *stdin_path, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, unsigned int flags); @@ -125,7 +125,7 @@ int qemuProcessLaunch(virConnectPtr conn, virDomainObjPtr vm, qemuDomainAsyncJob asyncJob, qemuProcessIncomingDefPtr incoming, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, unsigned int flags); diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index b80b199ce4..938b69cf60 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -426,7 +426,7 @@ virDomainSnapshotDefParseString(const char *xmlStr, int virDomainSnapshotRedefineValidate(virDomainSnapshotDefPtr def, const unsigned char *domain_uuid, - virDomainSnapshotObjPtr other, + virDomainMomentObjPtr other, virDomainXMLOptionPtr xmlopt, unsigned int flags) { @@ -907,7 +907,7 @@ virDomainSnapshotDefIsExternal(virDomainSnapshotDefPtr = def) } bool -virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap) +virDomainSnapshotIsExternal(virDomainMomentObjPtr snap) { virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(snap); @@ -918,13 +918,13 @@ int virDomainSnapshotRedefinePrep(virDomainPtr domain, virDomainObjPtr vm, virDomainSnapshotDefPtr *defptr, - virDomainSnapshotObjPtr *snap, + virDomainMomentObjPtr *snap, virDomainXMLOptionPtr xmlopt, bool *update_current, unsigned int flags) { virDomainSnapshotDefPtr def =3D *defptr; - virDomainSnapshotObjPtr other; + virDomainMomentObjPtr other; virDomainSnapshotDefPtr otherdef; bool check_if_stolen; @@ -981,7 +981,7 @@ virDomainSnapshotRedefinePrep(virDomainPtr domain, /* Drop and rebuild the parent relationship, but keep all * child relations by reusing snap. */ - virDomainSnapshotDropParent(other); + virDomainMomentDropParent(other); virDomainSnapshotDefFree(otherdef); otherdef =3D def; *defptr =3D NULL; diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainsnapshotob= j.c index d6b216c7b2..877a0a9079 100644 --- a/src/conf/virdomainsnapshotobj.c +++ b/src/conf/virdomainsnapshotobj.c @@ -33,80 +33,80 @@ VIR_LOG_INIT("conf.virdomainsnapshotobj"); -/* Run iter(data) on all direct children of snapshot, while ignoring all - * other entries in snapshots. Return the number of children +/* Run iter(data) on all direct children of moment, while ignoring all + * other entries in moments. Return the number of children * visited. No particular ordering is guaranteed. */ int -virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot, - virHashIterator iter, - void *data) +virDomainMomentForEachChild(virDomainMomentObjPtr moment, + virHashIterator iter, + void *data) { - virDomainSnapshotObjPtr child =3D snapshot->first_child; + virDomainMomentObjPtr child =3D moment->first_child; while (child) { - virDomainSnapshotObjPtr next =3D child->sibling; + virDomainMomentObjPtr next =3D child->sibling; (iter)(child, child->def->name, data); child =3D next; } - return snapshot->nchildren; + return moment->nchildren; } -struct snapshot_act_on_descendant { +struct moment_act_on_descendant { int number; virHashIterator iter; void *data; }; static int -virDomainSnapshotActOnDescendant(void *payload, - const void *name, - void *data) +virDomainMomentActOnDescendant(void *payload, + const void *name, + void *data) { - virDomainSnapshotObjPtr obj =3D payload; - struct snapshot_act_on_descendant *curr =3D data; + virDomainMomentObjPtr obj =3D payload; + struct moment_act_on_descendant *curr =3D data; (curr->iter)(payload, name, curr->data); - curr->number +=3D 1 + virDomainSnapshotForEachDescendant(obj, + curr->number +=3D 1 + virDomainMomentForEachDescendant(obj, curr->iter, curr->data); return 0; } -/* Run iter(data) on all descendants of snapshot, while ignoring all - * other entries in snapshots. Return the number of descendants +/* Run iter(data) on all descendants of moment, while ignoring all + * other entries in moments. Return the number of descendants * visited. The visit is guaranteed to be topological, but no * particular order between siblings is guaranteed. */ int -virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot, - virHashIterator iter, - void *data) +virDomainMomentForEachDescendant(virDomainMomentObjPtr moment, + virHashIterator iter, + void *data) { - struct snapshot_act_on_descendant act; + struct moment_act_on_descendant act; act.number =3D 0; act.iter =3D iter; act.data =3D data; - virDomainSnapshotForEachChild(snapshot, - virDomainSnapshotActOnDescendant, &act); + virDomainMomentForEachChild(moment, + virDomainMomentActOnDescendant, &act); return act.number; } -/* Prepare to reparent or delete snapshot, by removing it from its +/* Prepare to reparent or delete moment, by removing it from its * current listed parent. Note that when bulk removing all children * of a parent, it is faster to just 0 the count rather than calling * this function on each child. */ void -virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot) +virDomainMomentDropParent(virDomainMomentObjPtr moment) { - virDomainSnapshotObjPtr prev =3D NULL; - virDomainSnapshotObjPtr curr =3D NULL; + virDomainMomentObjPtr prev =3D NULL; + virDomainMomentObjPtr curr =3D NULL; - snapshot->parent->nchildren--; - curr =3D snapshot->parent->first_child; - while (curr !=3D snapshot) { + moment->parent->nchildren--; + curr =3D moment->parent->first_child; + while (curr !=3D moment) { if (!curr) { VIR_WARN("inconsistent snapshot relations"); return; @@ -115,42 +115,42 @@ virDomainSnapshotDropParent(virDomainSnapshotObjPtr s= napshot) curr =3D curr->sibling; } if (prev) - prev->sibling =3D snapshot->sibling; + prev->sibling =3D moment->sibling; else - snapshot->parent->first_child =3D snapshot->sibling; - snapshot->parent =3D NULL; - snapshot->sibling =3D NULL; + moment->parent->first_child =3D moment->sibling; + moment->parent =3D NULL; + moment->sibling =3D NULL; } -/* Update @snapshot to no longer have children. */ +/* Update @moment to no longer have children. */ void -virDomainSnapshotDropChildren(virDomainSnapshotObjPtr snapshot) +virDomainMomentDropChildren(virDomainMomentObjPtr moment) { - snapshot->nchildren =3D 0; - snapshot->first_child =3D NULL; + moment->nchildren =3D 0; + moment->first_child =3D NULL; } -/* Add @snapshot to @parent's list of children. */ +/* Add @moment to @parent's list of children. */ void -virDomainSnapshotSetParent(virDomainSnapshotObjPtr snapshot, - virDomainSnapshotObjPtr parent) +virDomainMomentSetParent(virDomainMomentObjPtr moment, + virDomainMomentObjPtr parent) { - snapshot->parent =3D parent; + moment->parent =3D parent; parent->nchildren++; - snapshot->sibling =3D parent->first_child; - parent->first_child =3D snapshot; + moment->sibling =3D parent->first_child; + parent->first_child =3D moment; } /* Take all children of @from and convert them into children of @to. */ void -virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from, - virDomainSnapshotObjPtr to) +virDomainMomentMoveChildren(virDomainMomentObjPtr from, + virDomainMomentObjPtr to) { - virDomainSnapshotObjPtr child; - virDomainSnapshotObjPtr last; + virDomainMomentObjPtr child; + virDomainMomentObjPtr last; for (child =3D from->first_child; child; child =3D child->sibling) { child->parent =3D to; diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index a55448c887..8ecb131176 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -35,12 +35,12 @@ VIR_LOG_INIT("conf.virdomainsnapshotobjlist"); struct _virDomainSnapshotObjList { - /* name string -> virDomainSnapshotObj mapping + /* name string -> virDomainMomentObj mapping * for O(1), lockless lookup-by-name */ virHashTable *objs; - virDomainSnapshotObj metaroot; /* Special parent of all root snapshots= */ - virDomainSnapshotObjPtr current; /* The current snapshot, if any */ + virDomainMomentObj metaroot; /* Special parent of all root snapshots */ + virDomainMomentObjPtr current; /* The current snapshot, if any */ }; @@ -62,7 +62,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, int n; size_t i; int keepBlanksDefault =3D xmlKeepBlanksDefault(0); - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; VIR_AUTOFREE(xmlNodePtr *) nodes =3D NULL; VIR_AUTOFREE(char *) current =3D NULL; @@ -168,7 +168,7 @@ virDomainSnapshotFormatOne(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; struct virDomainSnapshotFormatData *data =3D opaque; return virDomainSnapshotDefFormatInternal(data->buf, data->uuidstr, virDomainSnapshotObjGetDef(s= nap), @@ -212,9 +212,9 @@ virDomainSnapshotObjListFormat(virBufferPtr buf, /* Snapshot Obj functions */ -static virDomainSnapshotObjPtr virDomainSnapshotObjNew(void) +static virDomainMomentObjPtr virDomainMomentObjNew(void) { - virDomainSnapshotObjPtr snapshot; + virDomainMomentObjPtr snapshot; if (VIR_ALLOC(snapshot) < 0) return NULL; @@ -224,7 +224,7 @@ static virDomainSnapshotObjPtr virDomainSnapshotObjNew(= void) return snapshot; } -static void virDomainSnapshotObjFree(virDomainSnapshotObjPtr snapshot) +static void virDomainMomentObjFree(virDomainMomentObjPtr snapshot) { if (!snapshot) return; @@ -235,10 +235,10 @@ static void virDomainSnapshotObjFree(virDomainSnapsho= tObjPtr snapshot) VIR_FREE(snapshot); } -virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjLis= tPtr snapshots, - virDomainSnapshotDefPtr= def) +virDomainMomentObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListP= tr snapshots, + virDomainSnapshotDefPtr d= ef) { - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; if (virHashLookup(snapshots->objs, def->common.name) !=3D NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -247,7 +247,7 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virD= omainSnapshotObjListPtr s return NULL; } - if (!(snap =3D virDomainSnapshotObjNew())) + if (!(snap =3D virDomainMomentObjNew())) return NULL; snap->def =3D &def->common; @@ -261,7 +261,7 @@ virDomainSnapshotObjPtr virDomainSnapshotAssignDef(virD= omainSnapshotObjListPtr s /* Snapshot Obj List functions */ static bool -virDomainSnapshotFilter(virDomainSnapshotObjPtr obj, +virDomainSnapshotFilter(virDomainMomentObjPtr obj, unsigned int flags) { virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(obj); @@ -296,9 +296,9 @@ static void virDomainSnapshotObjListDataFree(void *payload, const void *name ATTRIBUTE_UNUSED) { - virDomainSnapshotObjPtr obj =3D payload; + virDomainMomentObjPtr obj =3D payload; - virDomainSnapshotObjFree(obj); + virDomainMomentObjFree(obj); } virDomainSnapshotObjListPtr @@ -325,21 +325,21 @@ virDomainSnapshotObjListFree(virDomainSnapshotObjList= Ptr snapshots) } -struct virDomainSnapshotNameData { +struct virDomainMomentNameData { char **const names; int maxnames; unsigned int flags; int count; bool error; - virDomainSnapshotObjListFilter filter; + virDomainMomentObjListFilter filter; }; -static int virDomainSnapshotObjListCopyNames(void *payload, - const void *name ATTRIBUTE_UN= USED, - void *opaque) +static int virDomainMomentObjListCopyNames(void *payload, + const void *name ATTRIBUTE_UNUS= ED, + void *opaque) { - virDomainSnapshotObjPtr obj =3D payload; - struct virDomainSnapshotNameData *data =3D opaque; + virDomainMomentObjPtr obj =3D payload; + struct virDomainMomentNameData *data =3D opaque; if (data->error) return 0; @@ -364,13 +364,13 @@ static int virDomainSnapshotObjListCopyNames(void *pa= yload, int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, char **const names, int maxnames, unsigned int flags) { - struct virDomainSnapshotNameData data =3D { names, maxnames, flags, 0, - false, virDomainSnapshotFilt= er }; + struct virDomainMomentNameData data =3D { names, maxnames, flags, 0, + false, virDomainSnapshotFilter= }; size_t i; if (!from) { @@ -414,17 +414,17 @@ virDomainSnapshotObjListGetNames(virDomainSnapshotObj= ListPtr snapshots, * simpler full hashtable visit or counter will do. */ if (from->def || (names && (flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL))) - virDomainSnapshotForEachDescendant(from, - virDomainSnapshotObjListCop= yNames, - &data); + virDomainMomentForEachDescendant(from, + virDomainMomentObjListCopyNam= es, + &data); else if (names || data.flags) - virHashForEach(snapshots->objs, virDomainSnapshotObjListCopyNa= mes, + virHashForEach(snapshots->objs, virDomainMomentObjListCopyName= s, &data); else data.count =3D virHashSize(snapshots->objs); } else if (names || data.flags) { - virDomainSnapshotForEachChild(from, - virDomainSnapshotObjListCopyNames, &= data); + virDomainMomentForEachChild(from, + virDomainMomentObjListCopyNames, &data= ); } else { data.count =3D from->nchildren; } @@ -440,13 +440,13 @@ virDomainSnapshotObjListGetNames(virDomainSnapshotObj= ListPtr snapshots, int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, unsigned int flags) { return virDomainSnapshotObjListGetNames(snapshots, from, NULL, 0, flag= s); } -virDomainSnapshotObjPtr +virDomainMomentObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjListPtr snapshots, const char *name) { @@ -463,7 +463,7 @@ virDomainSnapshotObjListSize(virDomainSnapshotObjListPt= r snapshots) /* Return the current snapshot, or NULL */ -virDomainSnapshotObjPtr +virDomainMomentObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjListPtr snapshots) { return snapshots->current; @@ -492,7 +492,7 @@ virDomainSnapshotIsCurrentName(virDomainSnapshotObjList= Ptr snapshots, /* Update the current snapshot, using NULL if no current remains */ void virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr snapshot) + virDomainMomentObjPtr snapshot) { snapshots->current =3D snapshot; } @@ -500,7 +500,7 @@ virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr= snapshots, /* Remove snapshot from the list; return true if it was current */ bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr snapshot) + virDomainMomentObjPtr snapshot) { bool ret =3D snapshots->current =3D=3D snapshot; virHashRemoveEntry(snapshots->objs, snapshot->def->name); @@ -514,7 +514,7 @@ void virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapshots) { virHashRemoveAll(snapshots->objs); - virDomainSnapshotDropChildren(&snapshots->metaroot); + virDomainMomentDropChildren(&snapshots->metaroot); } @@ -533,19 +533,19 @@ virDomainSnapshotForEach(virDomainSnapshotObjListPtr = snapshots, * wire up the hierarchical relations for the given snapshot. The error * indicator gets set if a parent is missing or a requested parent would * cause a circular parent chain. */ -struct snapshot_set_relation { +struct moment_set_relation { virDomainSnapshotObjListPtr snapshots; int err; }; static int -virDomainSnapshotSetRelations(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *data) +virDomainMomentSetRelations(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data) { - virDomainSnapshotObjPtr obj =3D payload; - struct snapshot_set_relation *curr =3D data; - virDomainSnapshotObjPtr tmp; - virDomainSnapshotObjPtr parent; + virDomainMomentObjPtr obj =3D payload; + struct moment_set_relation *curr =3D data; + virDomainMomentObjPtr tmp; + virDomainMomentObjPtr parent; parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->pare= nt); if (!parent) { @@ -564,7 +564,7 @@ virDomainSnapshotSetRelations(void *payload, tmp =3D tmp->parent; } } - virDomainSnapshotSetParent(obj, parent); + virDomainMomentSetParent(obj, parent); return 0; } @@ -575,10 +575,10 @@ virDomainSnapshotSetRelations(void *payload, int virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots) { - struct snapshot_set_relation act =3D { snapshots, 0 }; + struct moment_set_relation act =3D { snapshots, 0 }; - virDomainSnapshotDropChildren(&snapshots->metaroot); - virHashForEach(snapshots->objs, virDomainSnapshotSetRelations, &act); + virDomainMomentDropChildren(&snapshots->metaroot); + virHashForEach(snapshots->objs, virDomainMomentSetRelations, &act); if (act.err) snapshots->current =3D NULL; return act.err; @@ -587,7 +587,7 @@ virDomainSnapshotUpdateRelations(virDomainSnapshotObjLi= stPtr snapshots) int virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots, - virDomainSnapshotObjPtr from, + virDomainMomentObjPtr from, virDomainPtr dom, virDomainSnapshotPtr **snaps, unsigned int flags) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ffc1724850..02f383fdba 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -980,12 +980,12 @@ virDomainObjListRename; # conf/virdomainsnapshotobj.h -virDomainSnapshotDropChildren; -virDomainSnapshotDropParent; -virDomainSnapshotForEachChild; -virDomainSnapshotForEachDescendant; -virDomainSnapshotMoveChildren; -virDomainSnapshotSetParent; +virDomainMomentDropChildren; +virDomainMomentDropParent; +virDomainMomentForEachChild; +virDomainMomentForEachDescendant; +virDomainMomentMoveChildren; +virDomainMomentSetParent; # conf/virdomainsnapshotobjlist.h diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index bc02362495..f81d20e5f7 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10632,7 +10632,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, virSecurityManagerPtr secManager, virDomainObjPtr vm, const char *migrateURI, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, bool standalone, bool enableFips, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 3219ac5e48..d4ed772280 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8448,7 +8448,7 @@ qemuFindQemuImgBinary(virQEMUDriverPtr driver) int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, const char *snapshotDir) @@ -8566,7 +8566,7 @@ qemuDomainSnapshotForEachQcow2Raw(virQEMUDriverPtr dr= iver, int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, const char *op, bool try_all) { @@ -8585,14 +8585,14 @@ qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr dri= ver, int qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, bool update_parent, bool metadata_only) { char *snapFile =3D NULL; int ret =3D -1; qemuDomainObjPrivatePtr priv; - virDomainSnapshotObjPtr parentsnap =3D NULL; + virDomainMomentObjPtr parentsnap =3D NULL; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); if (!metadata_only) { @@ -8638,7 +8638,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, if (unlink(snapFile) < 0) VIR_WARN("Failed to unlink %s", snapFile); if (update_parent) - virDomainSnapshotDropParent(snap); + virDomainMomentDropParent(snap); virDomainSnapshotObjListRemove(vm->snapshots, snap); ret =3D 0; @@ -8654,7 +8654,7 @@ int qemuDomainSnapshotDiscardAll(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; virQEMUSnapRemovePtr curr =3D data; int err; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9ad7be5718..9c2245b095 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -198,11 +198,11 @@ qemuDomObjFromSnapshot(virDomainSnapshotPtr snapshot) /* Looks up snapshot object from VM and name */ -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr qemuSnapObjFromName(virDomainObjPtr vm, const char *name) { - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; snap =3D virDomainSnapshotFindByName(vm->snapshots, name); if (!snap) virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, @@ -214,7 +214,7 @@ qemuSnapObjFromName(virDomainObjPtr vm, /* Looks up snapshot object from VM and snapshotPtr */ -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr qemuSnapObjFromSnapshot(virDomainObjPtr vm, virDomainSnapshotPtr snapshot) { @@ -417,8 +417,8 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, char *xmlStr; char *fullpath; virDomainSnapshotDefPtr def =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; - virDomainSnapshotObjPtr current =3D NULL; + virDomainMomentObjPtr snap =3D NULL; + virDomainMomentObjPtr current =3D NULL; bool cur; unsigned int flags =3D (VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE | VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | @@ -2140,7 +2140,7 @@ qemuDomainSnapshotCountExternal(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; int *count =3D data; if (virDomainSnapshotIsExternal(snap)) @@ -14513,7 +14513,7 @@ qemuDomainSnapshotFSThaw(virQEMUDriverPtr driver AT= TRIBUTE_UNUSED, static int qemuDomainSnapshotCreateInactiveInternal(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap) + virDomainMomentObjPtr snap) { return qemuDomainSnapshotForEachQcow2(driver, vm, snap, "-c", false); } @@ -14523,7 +14523,7 @@ qemuDomainSnapshotCreateInactiveInternal(virQEMUDri= verPtr driver, static int qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, bool reuse) { size_t i; @@ -14630,7 +14630,7 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDri= verPtr driver, static int qemuDomainSnapshotCreateActiveInternal(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, unsigned int flags) { qemuDomainObjPrivatePtr priv =3D vm->privateData; @@ -15176,7 +15176,7 @@ qemuDomainSnapshotDiskDataFree(qemuDomainSnapshotDi= skDataPtr data, static qemuDomainSnapshotDiskDataPtr qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, bool reuse) { size_t i; @@ -15333,7 +15333,7 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDri= verPtr driver, static int qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, unsigned int flags, qemuDomainAsyncJob asyncJob) { @@ -15462,7 +15462,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, static int qemuDomainSnapshotCreateActiveExternal(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap, + virDomainMomentObjPtr snap, unsigned int flags) { virObjectEventPtr event; @@ -15660,14 +15660,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, virQEMUDriverPtr driver =3D domain->conn->privateData; virDomainObjPtr vm =3D NULL; char *xml =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr snapshot =3D NULL; virDomainSnapshotDefPtr def =3D NULL; - virDomainSnapshotObjPtr current =3D NULL; + virDomainMomentObjPtr current =3D NULL; bool update_current =3D true; bool redefine =3D flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE; unsigned int parse_flags =3D VIR_DOMAIN_SNAPSHOT_PARSE_DISKS; - virDomainSnapshotObjPtr other =3D NULL; + virDomainMomentObjPtr other =3D NULL; int align_location =3D VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL; bool align_match =3D true; virQEMUDriverConfigPtr cfg =3D NULL; @@ -15931,7 +15931,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, } else { other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); - virDomainSnapshotSetParent(snap, other); + virDomainMomentSetParent(snap, other); } } else if (snap) { virDomainSnapshotObjListRemove(vm->snapshots, snap); @@ -16035,7 +16035,7 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapsh= otPtr snapshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -16065,7 +16065,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr = snapshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -16095,7 +16095,7 @@ qemuDomainSnapshotListAllChildren(virDomainSnapshot= Ptr snapshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -16126,7 +16126,7 @@ qemuDomainSnapshotLookupByName(virDomainPtr domain, unsigned int flags) { virDomainObjPtr vm; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr snapshot =3D NULL; virCheckFlags(0, NULL); @@ -16176,7 +16176,7 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr sn= apshot, unsigned int flags) { virDomainObjPtr vm; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr parent =3D NULL; virCheckFlags(0, NULL); @@ -16241,7 +16241,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr s= napshot, virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; char *xml =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; virCheckFlags(VIR_DOMAIN_SNAPSHOT_XML_SECURE, NULL); @@ -16273,7 +16273,7 @@ qemuDomainSnapshotIsCurrent(virDomainSnapshotPtr sn= apshot, { virDomainObjPtr vm =3D NULL; int ret =3D -1; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virCheckFlags(0, -1); @@ -16300,7 +16300,7 @@ qemuDomainSnapshotHasMetadata(virDomainSnapshotPtr = snapshot, { virDomainObjPtr vm =3D NULL; int ret =3D -1; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virCheckFlags(0, -1); @@ -16328,7 +16328,7 @@ qemuDomainSnapshotHasMetadata(virDomainSnapshotPtr = snapshot, static int qemuDomainSnapshotRevertInactive(virQEMUDriverPtr driver, virDomainObjPtr vm, - virDomainSnapshotObjPtr snap) + virDomainMomentObjPtr snap) { /* Try all disks, but report failure if we skipped any. */ int ret =3D qemuDomainSnapshotForEachQcow2(driver, vm, snap, "-a", tru= e); @@ -16343,8 +16343,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; int ret =3D -1; - virDomainSnapshotObjPtr snap =3D NULL; - virDomainSnapshotObjPtr current =3D NULL; + virDomainMomentObjPtr snap =3D NULL; + virDomainMomentObjPtr current =3D NULL; virDomainSnapshotDefPtr snapdef; virObjectEventPtr event =3D NULL; virObjectEventPtr event2 =3D NULL; @@ -16762,7 +16762,7 @@ typedef struct _virQEMUSnapReparent virQEMUSnapRepa= rent; typedef virQEMUSnapReparent *virQEMUSnapReparentPtr; struct _virQEMUSnapReparent { virQEMUDriverConfigPtr cfg; - virDomainSnapshotObjPtr parent; + virDomainMomentObjPtr parent; virDomainObjPtr vm; virCapsPtr caps; virDomainXMLOptionPtr xmlopt; @@ -16775,7 +16775,7 @@ qemuDomainSnapshotReparentChildren(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; virQEMUSnapReparentPtr rep =3D data; if (rep->err < 0) @@ -16803,7 +16803,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, virQEMUDriverPtr driver =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; int ret =3D -1; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virQEMUSnapRemove rem; virQEMUSnapReparent rep; bool metadata_only =3D !!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_= ONLY); @@ -16834,9 +16834,9 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, external++; if (flags & (VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN | VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY)) - virDomainSnapshotForEachDescendant(snap, - qemuDomainSnapshotCountExte= rnal, - &external); + virDomainMomentForEachDescendant(snap, + qemuDomainSnapshotCountExtern= al, + &external); if (external) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("deletion of %d external disk snapshots not " @@ -16852,9 +16852,9 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, rem.metadata_only =3D metadata_only; rem.err =3D 0; rem.current =3D false; - virDomainSnapshotForEachDescendant(snap, - qemuDomainSnapshotDiscardAll, - &rem); + virDomainMomentForEachDescendant(snap, + qemuDomainSnapshotDiscardAll, + &rem); if (rem.err < 0) goto endjob; if (rem.current) { @@ -16878,16 +16878,16 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr sna= pshot, rep.err =3D 0; rep.caps =3D driver->caps; rep.xmlopt =3D driver->xmlopt; - virDomainSnapshotForEachChild(snap, - qemuDomainSnapshotReparentChildren, - &rep); + virDomainMomentForEachChild(snap, + qemuDomainSnapshotReparentChildren, + &rep); if (rep.err < 0) goto endjob; - virDomainSnapshotMoveChildren(snap, snap->parent); + virDomainMomentMoveChildren(snap, snap->parent); } if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - virDomainSnapshotDropChildren(snap); + virDomainMomentDropChildren(snap); ret =3D 0; } else { ret =3D qemuDomainSnapshotDiscard(driver, vm, snap, true, metadata= _only); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d878079eab..dc7317b723 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6469,7 +6469,7 @@ qemuProcessLaunch(virConnectPtr conn, virDomainObjPtr vm, qemuDomainAsyncJob asyncJob, qemuProcessIncomingDefPtr incoming, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, unsigned int flags) { @@ -6882,7 +6882,7 @@ qemuProcessStart(virConnectPtr conn, const char *migrateFrom, int migrateFd, const char *migratePath, - virDomainSnapshotObjPtr snapshot, + virDomainMomentObjPtr snapshot, virNetDevVPortProfileOp vmop, unsigned int flags) { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index eac6160532..5aaaf0ab19 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -822,7 +822,7 @@ testParseDomainSnapshots(testDriverPtr privconn, bool cur; for (i =3D 0; i < nsdata->num_snap_nodes; i++) { - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotDefPtr def; xmlNodePtr node =3D testParseXMLDocFromFile(nodes[i], file, "domainsnapshot"); @@ -5946,11 +5946,11 @@ testDomainManagedSaveRemove(virDomainPtr dom, unsig= ned int flags) * Snapshot APIs */ -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr testSnapObjFromName(virDomainObjPtr vm, const char *name) { - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; snap =3D virDomainSnapshotFindByName(vm->snapshots, name); if (!snap) virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, @@ -5959,7 +5959,7 @@ testSnapObjFromName(virDomainObjPtr vm, return snap; } -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr testSnapObjFromSnapshot(virDomainObjPtr vm, virDomainSnapshotPtr snapshot) { @@ -6042,7 +6042,7 @@ testDomainSnapshotListChildrenNames(virDomainSnapshot= Ptr snapshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -6068,7 +6068,7 @@ testDomainSnapshotNumChildren(virDomainSnapshotPtr sn= apshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -6094,7 +6094,7 @@ testDomainSnapshotListAllChildren(virDomainSnapshotPt= r snapshot, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; int n =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | @@ -6121,7 +6121,7 @@ testDomainSnapshotLookupByName(virDomainPtr domain, unsigned int flags) { virDomainObjPtr vm; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr snapshot =3D NULL; virCheckFlags(0, NULL); @@ -6162,7 +6162,7 @@ testDomainSnapshotGetParent(virDomainSnapshotPtr snap= shot, unsigned int flags) { virDomainObjPtr vm; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr parent =3D NULL; virCheckFlags(0, NULL); @@ -6193,7 +6193,7 @@ testDomainSnapshotCurrent(virDomainPtr domain, { virDomainObjPtr vm; virDomainSnapshotPtr snapshot =3D NULL; - virDomainSnapshotObjPtr current; + virDomainMomentObjPtr current; virCheckFlags(0, NULL); @@ -6220,7 +6220,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, { virDomainObjPtr vm =3D NULL; char *xml =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; testDriverPtr privconn =3D virSnapDom(snapshot)->conn->privateData; @@ -6322,7 +6322,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, testDriverPtr privconn =3D domain->conn->privateData; virDomainObjPtr vm =3D NULL; virDomainSnapshotDefPtr def =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virDomainSnapshotPtr snapshot =3D NULL; virObjectEventPtr event =3D NULL; bool update_current =3D true; @@ -6411,12 +6411,12 @@ testDomainSnapshotCreateXML(virDomainPtr domain, cleanup: if (vm) { if (snapshot) { - virDomainSnapshotObjPtr other; + virDomainMomentObjPtr other; if (update_current) virDomainSnapshotSetCurrent(vm->snapshots, snap); other =3D virDomainSnapshotFindByName(vm->snapshots, snap->def->parent); - virDomainSnapshotSetParent(snap, other); + virDomainMomentSetParent(snap, other); } virDomainObjEndAPI(&vm); } @@ -6438,7 +6438,7 @@ testDomainSnapshotDiscardAll(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; testSnapRemoveDataPtr curr =3D data; curr->current |=3D virDomainSnapshotObjListRemove(curr->vm->snapshots,= snap); @@ -6448,7 +6448,7 @@ testDomainSnapshotDiscardAll(void *payload, typedef struct _testSnapReparentData testSnapReparentData; typedef testSnapReparentData *testSnapReparentDataPtr; struct _testSnapReparentData { - virDomainSnapshotObjPtr parent; + virDomainMomentObjPtr parent; virDomainObjPtr vm; int err; }; @@ -6458,7 +6458,7 @@ testDomainSnapshotReparentChildren(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snap =3D payload; + virDomainMomentObjPtr snap =3D payload; testSnapReparentDataPtr rep =3D data; if (rep->err < 0) @@ -6480,8 +6480,8 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, unsigned int flags) { virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; - virDomainSnapshotObjPtr parentsnap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; + virDomainMomentObjPtr parentsnap =3D NULL; int ret =3D -1; virCheckFlags(VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN | @@ -6498,9 +6498,9 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snapsho= t, testSnapRemoveData rem; rem.vm =3D vm; rem.current =3D false; - virDomainSnapshotForEachDescendant(snap, - testDomainSnapshotDiscardAll, - &rem); + virDomainMomentForEachDescendant(snap, + testDomainSnapshotDiscardAll, + &rem); if (rem.current) virDomainSnapshotSetCurrent(vm->snapshots, snap); } else if (snap->nchildren) { @@ -6508,19 +6508,19 @@ testDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, rep.parent =3D snap->parent; rep.vm =3D vm; rep.err =3D 0; - virDomainSnapshotForEachChild(snap, - testDomainSnapshotReparentChildren, - &rep); + virDomainMomentForEachChild(snap, + testDomainSnapshotReparentChildren, + &rep); if (rep.err < 0) goto cleanup; - virDomainSnapshotMoveChildren(snap, snap->parent); + virDomainMomentMoveChildren(snap, snap->parent); } if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { - virDomainSnapshotDropChildren(snap); + virDomainMomentDropChildren(snap); } else { - virDomainSnapshotDropParent(snap); + virDomainMomentDropParent(snap); if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { if (snap->def->parent) { parentsnap =3D virDomainSnapshotFindByName(vm->snapshots, @@ -6546,7 +6546,7 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snaps= hot, { testDriverPtr privconn =3D virSnapDom(snapshot)->conn->privateData; virDomainObjPtr vm =3D NULL; - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; virObjectEventPtr event =3D NULL; virObjectEventPtr event2 =3D NULL; virDomainDefPtr config =3D NULL; diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index eba366dd2c..06f94f5beb 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -2132,10 +2132,10 @@ static int vzDomainSetMemory(virDomainPtr domain, u= nsigned long memory) return ret; } -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr vzSnapObjFromName(virDomainSnapshotObjListPtr snapshots, const char *name) { - virDomainSnapshotObjPtr snap =3D NULL; + virDomainMomentObjPtr snap =3D NULL; snap =3D virDomainSnapshotFindByName(snapshots, name); if (!snap) virReportError(VIR_ERR_NO_DOMAIN_SNAPSHOT, @@ -2144,7 +2144,7 @@ vzSnapObjFromName(virDomainSnapshotObjListPtr snapsho= ts, const char *name) return snap; } -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr vzSnapObjFromSnapshot(virDomainSnapshotObjListPtr snapshots, virDomainSnapshotPtr snapshot) { @@ -2156,8 +2156,8 @@ vzCurrentSnapshotIterator(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { - virDomainSnapshotObjPtr snapshot =3D payload; - virDomainSnapshotObjPtr *current =3D data; + virDomainMomentObjPtr snapshot =3D payload; + virDomainMomentObjPtr *current =3D data; if (snapshot->def->current) *current =3D snapshot; @@ -2165,10 +2165,10 @@ vzCurrentSnapshotIterator(void *payload, return 0; } -static virDomainSnapshotObjPtr +static virDomainMomentObjPtr vzFindCurrentSnapshot(virDomainSnapshotObjListPtr snapshots) { - virDomainSnapshotObjPtr current =3D NULL; + virDomainMomentObjPtr current =3D NULL; virDomainSnapshotForEach(snapshots, vzCurrentSnapshotIterator, ¤= t); return current; @@ -2268,7 +2268,7 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snaps= hot, unsigned int flags) { virDomainObjPtr dom; char *xml =3D NULL; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainSnapshotObjListPtr snapshots =3D NULL; vzConnPtr privconn =3D virSnapDom(snapshot)->conn->privateData; @@ -2304,7 +2304,7 @@ static int vzDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int fl= ags) { virDomainObjPtr dom; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotObjListPtr snapshots =3D NULL; int n =3D -1; @@ -2339,7 +2339,7 @@ vzDomainSnapshotListChildrenNames(virDomainSnapshotPt= r snapshot, unsigned int flags) { virDomainObjPtr dom; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotObjListPtr snapshots =3D NULL; int n =3D -1; @@ -2373,7 +2373,7 @@ vzDomainSnapshotListAllChildren(virDomainSnapshotPtr = snapshot, unsigned int flags) { virDomainObjPtr dom; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotObjListPtr snapshots =3D NULL; int n =3D -1; @@ -2407,7 +2407,7 @@ vzDomainSnapshotLookupByName(virDomainPtr domain, unsigned int flags) { virDomainObjPtr dom; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotPtr snapshot =3D NULL; virDomainSnapshotObjListPtr snapshots =3D NULL; @@ -2465,7 +2465,7 @@ static virDomainSnapshotPtr vzDomainSnapshotGetParent(virDomainSnapshotPtr snapshot, unsigned int flag= s) { virDomainObjPtr dom; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotPtr parent =3D NULL; virDomainSnapshotObjListPtr snapshots =3D NULL; @@ -2505,7 +2505,7 @@ vzDomainSnapshotCurrent(virDomainPtr domain, unsigned= int flags) virDomainObjPtr dom; virDomainSnapshotPtr snapshot =3D NULL; virDomainSnapshotObjListPtr snapshots =3D NULL; - virDomainSnapshotObjPtr current; + virDomainMomentObjPtr current; virCheckFlags(0, NULL); @@ -2539,7 +2539,7 @@ vzDomainSnapshotIsCurrent(virDomainSnapshotPtr snapsh= ot, unsigned int flags) virDomainObjPtr dom; int ret =3D -1; virDomainSnapshotObjListPtr snapshots =3D NULL; - virDomainSnapshotObjPtr current; + virDomainMomentObjPtr current; virCheckFlags(0, -1); @@ -2568,7 +2568,7 @@ vzDomainSnapshotHasMetadata(virDomainSnapshotPtr snap= shot, { virDomainObjPtr dom; int ret =3D -1; - virDomainSnapshotObjPtr snap; + virDomainMomentObjPtr snap; virDomainSnapshotObjListPtr snapshots =3D NULL; virCheckFlags(0, -1); @@ -2606,7 +2606,7 @@ vzDomainSnapshotCreateXML(virDomainPtr domain, vzDriverPtr driver =3D privconn->driver; unsigned int parse_flags =3D VIR_DOMAIN_SNAPSHOT_PARSE_DISKS; virDomainSnapshotObjListPtr snapshots =3D NULL; - virDomainSnapshotObjPtr current; + virDomainMomentObjPtr current; bool job =3D false; virCheckFlags(0, NULL); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index b9fd03c0d2..f5a59115d2 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -4655,8 +4655,8 @@ prlsdkParseSnapshotTree(const char *treexml) xmlNodePtr root; xmlNodePtr *nodes =3D NULL; virDomainSnapshotDefPtr def =3D NULL; - virDomainSnapshotObjPtr snapshot; - virDomainSnapshotObjPtr current =3D NULL; + virDomainMomentObjPtr snapshot; + virDomainMomentObjPtr current =3D NULL; virDomainSnapshotObjListPtr snapshots =3D NULL; char *xmlstr =3D NULL; int n; --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060498694566.9790176710407; Tue, 19 Mar 2019 22:41:38 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0E38E3084028; Wed, 20 Mar 2019 05:41:37 +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 D9EDA18E59; Wed, 20 Mar 2019 05:41:36 +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 94D91181A000; Wed, 20 Mar 2019 05:41:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fWjK017285 for ; Wed, 20 Mar 2019 01:41:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3093C1974C; Wed, 20 Mar 2019 05:41:32 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id C201417795; Wed, 20 Mar 2019 05:41:31 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:02 -0500 Message-Id: <20190320054105.17689-14-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 13/16] snapshot: Rename file for virDomainMomentObj 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.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Wed, 20 Mar 2019 05:41:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Now that we have made virDomainMomentObj sufficiently generic to support both snapshots and checkpoints, it is time to rename the file that it lives in. The split between a generic object and a list of the generic objects doesn't buy us as much, so it will be easier to stick all the moment list code in one file, with more code moving in the next patch. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- ...snapshotobj.h =3D> virdomainmomentobjlist.h} | 26 ++++++++++--------- src/conf/virdomainsnapshotobjlist.h | 7 ++++- src/conf/Makefile.inc.am | 4 +-- ...snapshotobj.c =3D> virdomainmomentobjlist.c} | 12 ++++----- src/libvirt_private.syms | 18 ++++++------- 5 files changed, 37 insertions(+), 30 deletions(-) rename src/conf/{virdomainsnapshotobj.h =3D> virdomainmomentobjlist.h} (72= %) rename src/conf/{virdomainsnapshotobj.c =3D> virdomainmomentobjlist.c} (95= %) diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainmomentobjl= ist.h similarity index 72% rename from src/conf/virdomainsnapshotobj.h rename to src/conf/virdomainmomentobjlist.h index 86c5f6860b..dceb55fca2 100644 --- a/src/conf/virdomainsnapshotobj.h +++ b/src/conf/virdomainmomentobjlist.h @@ -1,5 +1,5 @@ /* - * virdomainsnapshotobj.h: handle snapshot objects + * virdomainmomentobjlist.h: handle a tree of moment objects * (derived from snapshot_conf.h) * * Copyright (C) 2006-2019 Red Hat, Inc. @@ -20,25 +20,33 @@ * . */ -#ifndef LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H -# define LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H +#ifndef LIBVIRT_VIRDOMAINMOMENTOBJLIST_H +# define LIBVIRT_VIRDOMAINMOMENTOBJLIST_H # include "internal.h" # include "virconftypes.h" # include "virhash.h" +/* Struct that allows tracing hierarchical relationships between + * multiple virDomainMoment objects. The opaque type + * virDomainMomentObjList then maintains both a hash of these structs + * (for quick lookup by name) and a metaroot (which is the parent of + * all user-visible roots), so that all other objects always have a + * valid parent object; the tree structure is currently maintained via + * a linked list. */ struct _virDomainMomentObj { + /* Public field */ virDomainMomentDefPtr def; /* non-NULL except for metaroot */ + /* Private fields, use accessors instead */ virDomainMomentObjPtr parent; /* non-NULL except for metaroot, before - virDomainSnapshotUpdateRelations, or + virDomainMomentUpdateRelations, or after virDomainMomentDropParent */ virDomainMomentObjPtr sibling; /* NULL if last child of parent */ size_t nchildren; virDomainMomentObjPtr first_child; /* NULL if no children */ }; - int virDomainMomentForEachChild(virDomainMomentObjPtr moment, virHashIterator iter, void *data); @@ -52,10 +60,4 @@ void virDomainMomentMoveChildren(virDomainMomentObjPtr f= rom, void virDomainMomentSetParent(virDomainMomentObjPtr moment, virDomainMomentObjPtr parent); -static inline virDomainSnapshotDefPtr -virDomainSnapshotObjGetDef(virDomainMomentObjPtr obj) -{ - return (virDomainSnapshotDefPtr) obj->def; -} - -#endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */ +#endif /* LIBVIRT_VIRDOMAINMOMENTOBJLIST_H */ diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index 1af367639d..c36b498751 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -24,7 +24,7 @@ # define LIBVIRT_VIRDOMAINSNAPSHOTOBJLIST_H # include "internal.h" -# include "virdomainsnapshotobj.h" +# include "virdomainmomentobjlist.h" # include "virbuffer.h" /* Filter that returns true if a given moment matches the filter flags */ @@ -80,4 +80,9 @@ int virDomainListSnapshots(virDomainSnapshotObjListPtr sn= apshots, virDomainSnapshotPtr **snaps, unsigned int flags); +static inline virDomainSnapshotDefPtr +virDomainSnapshotObjGetDef(virDomainMomentObjPtr obj) +{ + return (virDomainSnapshotDefPtr) obj->def; +} #endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJLIST_H */ diff --git a/src/conf/Makefile.inc.am b/src/conf/Makefile.inc.am index d2ff8be8fd..6eb64db9de 100644 --- a/src/conf/Makefile.inc.am +++ b/src/conf/Makefile.inc.am @@ -31,8 +31,8 @@ DOMAIN_CONF_SOURCES =3D \ conf/virconftypes.h \ conf/virdomainobjlist.c \ conf/virdomainobjlist.h \ - conf/virdomainsnapshotobj.c \ - conf/virdomainsnapshotobj.h \ + conf/virdomainmomentobjlist.c \ + conf/virdomainmomentobjlist.h \ conf/virdomainsnapshotobjlist.c \ conf/virdomainsnapshotobjlist.h \ $(NULL) diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainmomentobjl= ist.c similarity index 95% rename from src/conf/virdomainsnapshotobj.c rename to src/conf/virdomainmomentobjlist.c index 877a0a9079..766d7fe2e4 100644 --- a/src/conf/virdomainsnapshotobj.c +++ b/src/conf/virdomainmomentobjlist.c @@ -1,5 +1,5 @@ /* - * virdomainsnapshotobj.c: handle snapshot objects + * virdomainmomentobjlist.c: handle snapshot/checkpoint objects * (derived from snapshot_conf.c) * * Copyright (C) 2006-2019 Red Hat, Inc. @@ -23,15 +23,15 @@ #include #include "internal.h" -#include "virdomainsnapshotobj.h" -#include "snapshot_conf.h" -#include "virdomainsnapshotobjlist.h" +#include "virdomainmomentobjlist.h" #include "virlog.h" #include "virerror.h" +#include "virstring.h" +#include "moment_conf.h" -#define VIR_FROM_THIS VIR_FROM_DOMAIN_SNAPSHOT +#define VIR_FROM_THIS VIR_FROM_DOMAIN -VIR_LOG_INIT("conf.virdomainsnapshotobj"); +VIR_LOG_INIT("conf.virdomainmomentobjlist"); /* Run iter(data) on all direct children of moment, while ignoring all * other entries in moments. Return the number of children diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 02f383fdba..10cdfad4fd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -960,6 +960,15 @@ virChrdevFree; virChrdevOpen; +# conf/virdomainmomentobjlist.h +virDomainMomentDropChildren; +virDomainMomentDropParent; +virDomainMomentForEachChild; +virDomainMomentForEachDescendant; +virDomainMomentMoveChildren; +virDomainMomentSetParent; + + # conf/virdomainobjlist.h virDomainObjListAdd; virDomainObjListCollect; @@ -979,15 +988,6 @@ virDomainObjListRemoveLocked; virDomainObjListRename; -# conf/virdomainsnapshotobj.h -virDomainMomentDropChildren; -virDomainMomentDropParent; -virDomainMomentForEachChild; -virDomainMomentForEachDescendant; -virDomainMomentMoveChildren; -virDomainMomentSetParent; - - # conf/virdomainsnapshotobjlist.h virDomainListSnapshots; virDomainSnapshotAssignDef; --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060502936539.3091580905308; Tue, 19 Mar 2019 22:41:42 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0864EF74C0; Wed, 20 Mar 2019 05:41:41 +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 C692A5C316; Wed, 20 Mar 2019 05:41:40 +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 7F0B0181A009; Wed, 20 Mar 2019 05:41:40 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fWv9017293 for ; Wed, 20 Mar 2019 01:41:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id C65141A913; Wed, 20 Mar 2019 05:41:32 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 54FF51974C; Wed, 20 Mar 2019 05:41:32 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:03 -0500 Message-Id: <20190320054105.17689-15-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 14/16] snapshot: Move snapshot list code into generic file 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.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 20 Mar 2019 05:41:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Finish the code motion of generic moment list handling. Well, mostly - we need to convert to using virObject to get polymorphic cleanup functions (so for now there are still a few lingering ties specific to snapshots). In this case, I kept virDomainSnapshotObjList as a wrapper type around the new generic virDomainMomentObjList; the bulk of the algorithms move, but the old functions remain and forward to the generic helpers. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virconftypes.h | 3 + src/conf/virdomainmomentobjlist.h | 32 +++ src/conf/virdomainsnapshotobjlist.h | 6 - src/conf/virdomainmomentobjlist.c | 356 ++++++++++++++++++++++++++++ src/conf/virdomainsnapshotobjlist.c | 266 +++------------------ 5 files changed, 422 insertions(+), 241 deletions(-) diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 574815cf04..6a8267c422 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -223,6 +223,9 @@ typedef virDomainMomentDef *virDomainMomentDefPtr; typedef struct _virDomainMomentObj virDomainMomentObj; typedef virDomainMomentObj *virDomainMomentObjPtr; +typedef struct _virDomainMomentObjList virDomainMomentObjList; +typedef virDomainMomentObjList *virDomainMomentObjListPtr; + typedef struct _virDomainNVRAMDef virDomainNVRAMDef; typedef virDomainNVRAMDef *virDomainNVRAMDefPtr; diff --git a/src/conf/virdomainmomentobjlist.h b/src/conf/virdomainmomentob= jlist.h index dceb55fca2..4d765c552f 100644 --- a/src/conf/virdomainmomentobjlist.h +++ b/src/conf/virdomainmomentobjlist.h @@ -27,6 +27,10 @@ # include "virconftypes.h" # include "virhash.h" +/* Filter that returns true if a given moment matches the filter flags */ +typedef bool (*virDomainMomentObjListFilter)(virDomainMomentObjPtr obj, + unsigned int flags); + /* Struct that allows tracing hierarchical relationships between * multiple virDomainMoment objects. The opaque type * virDomainMomentObjList then maintains both a hash of these structs @@ -60,4 +64,32 @@ void virDomainMomentMoveChildren(virDomainMomentObjPtr f= rom, void virDomainMomentSetParent(virDomainMomentObjPtr moment, virDomainMomentObjPtr parent); +virDomainMomentObjListPtr virDomainMomentObjListNew(virDomainMomentObjList= Filter filter); +void virDomainMomentObjListFree(virDomainMomentObjListPtr moments); + +virDomainMomentObjPtr virDomainMomentAssignDef(virDomainMomentObjListPtr m= oments, + virDomainMomentDefPtr def); + +int virDomainMomentObjListGetNames(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr from, + char **const names, + int maxnames, + unsigned int flags); +virDomainMomentObjPtr virDomainMomentFindByName(virDomainMomentObjListPtr = moments, + const char *name); +int virDomainMomentObjListSize(virDomainMomentObjListPtr moments); +virDomainMomentObjPtr virDomainMomentGetCurrent(virDomainMomentObjListPtr = moments); +const char *virDomainMomentGetCurrentName(virDomainMomentObjListPtr moment= s); +bool virDomainMomentIsCurrentName(virDomainMomentObjListPtr moments, + const char *name); +void virDomainMomentSetCurrent(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr moment); +bool virDomainMomentObjListRemove(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr moment); +void virDomainMomentObjListRemoveAll(virDomainMomentObjListPtr moments); +int virDomainMomentForEach(virDomainMomentObjListPtr moments, + virHashIterator iter, + void *data); +int virDomainMomentUpdateRelations(virDomainMomentObjListPtr moments); + #endif /* LIBVIRT_VIRDOMAINMOMENTOBJLIST_H */ diff --git a/src/conf/virdomainsnapshotobjlist.h b/src/conf/virdomainsnapsh= otobjlist.h index c36b498751..9daecacfdc 100644 --- a/src/conf/virdomainsnapshotobjlist.h +++ b/src/conf/virdomainsnapshotobjlist.h @@ -27,10 +27,6 @@ # include "virdomainmomentobjlist.h" # include "virbuffer.h" -/* Filter that returns true if a given moment matches the filter flags */ -typedef bool (*virDomainMomentObjListFilter)(virDomainMomentObjPtr obj, - unsigned int flags); - virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void); void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots); @@ -59,7 +55,6 @@ int virDomainSnapshotObjListNum(virDomainSnapshotObjListP= tr snapshots, unsigned int flags); virDomainMomentObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjList= Ptr snapshots, const char *name); -int virDomainSnapshotObjListSize(virDomainSnapshotObjListPtr snapshots); virDomainMomentObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjList= Ptr snapshots); const char *virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr sn= apshots); bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, @@ -68,7 +63,6 @@ void virDomainSnapshotSetCurrent(virDomainSnapshotObjList= Ptr snapshots, virDomainMomentObjPtr snapshot); bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, virDomainMomentObjPtr snapshot); -void virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapsho= ts); int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots, virHashIterator iter, void *data); diff --git a/src/conf/virdomainmomentobjlist.c b/src/conf/virdomainmomentob= jlist.c index 766d7fe2e4..f987329a6b 100644 --- a/src/conf/virdomainmomentobjlist.c +++ b/src/conf/virdomainmomentobjlist.c @@ -29,10 +29,27 @@ #include "virstring.h" #include "moment_conf.h" +/* FIXME: using virObject would allow us to not need this */ +#include "snapshot_conf.h" +#include "virdomainsnapshotobjlist.h" + #define VIR_FROM_THIS VIR_FROM_DOMAIN VIR_LOG_INIT("conf.virdomainmomentobjlist"); +/* Opaque struct */ +struct _virDomainMomentObjList { + /* name string -> virDomainMomentObj mapping + * for O(1), lockless lookup-by-name */ + virHashTable *objs; + + virDomainMomentObj metaroot; /* Special parent of all root snapshots */ + virDomainMomentObjPtr current; /* The current snapshot, if any */ + + virDomainMomentObjListFilter filter; +}; + + /* Run iter(data) on all direct children of moment, while ignoring all * other entries in moments. Return the number of children * visited. No particular ordering is guaranteed. */ @@ -163,3 +180,342 @@ virDomainMomentMoveChildren(virDomainMomentObjPtr fro= m, from->nchildren =3D 0; from->first_child =3D NULL; } + + +static virDomainMomentObjPtr +virDomainMomentObjNew(void) +{ + virDomainMomentObjPtr snapshot; + + if (VIR_ALLOC(snapshot) < 0) + return NULL; + + VIR_DEBUG("obj=3D%p", snapshot); + + return snapshot; +} + +static void +virDomainMomentObjFree(virDomainMomentObjPtr snapshot) +{ + if (!snapshot) + return; + + VIR_DEBUG("obj=3D%p", snapshot); + + /* FIXME: Make this polymorphic by inheriting from virObject */ + virDomainSnapshotDefFree(virDomainSnapshotObjGetDef(snapshot)); + VIR_FREE(snapshot); +} + + +/* Add def to the list and return a matching object, or NULL on error */ +virDomainMomentObjPtr +virDomainMomentAssignDef(virDomainMomentObjListPtr moments, + virDomainMomentDefPtr def) +{ + virDomainMomentObjPtr moment; + + if (virHashLookup(moments->objs, def->name) !=3D NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected domain moment %s already exists"), + def->name); + return NULL; + } + + if (!(moment =3D virDomainMomentObjNew())) + return NULL; + moment->def =3D def; + + if (virHashAddEntry(moments->objs, moment->def->name, moment) < 0) { + VIR_FREE(moment); + return NULL; + } + + return moment; +} + + +static void +virDomainMomentObjListDataFree(void *payload, + const void *name ATTRIBUTE_UNUSED) +{ + virDomainMomentObjPtr obj =3D payload; + + virDomainMomentObjFree(obj); +} + + +virDomainMomentObjListPtr +virDomainMomentObjListNew(virDomainMomentObjListFilter filter) +{ + virDomainMomentObjListPtr moments; + + if (VIR_ALLOC(moments) < 0) + return NULL; + moments->objs =3D virHashCreate(50, virDomainMomentObjListDataFree); + if (!moments->objs) { + VIR_FREE(moments); + return NULL; + } + moments->filter =3D filter; + return moments; +} + +void +virDomainMomentObjListFree(virDomainMomentObjListPtr moments) +{ + if (!moments) + return; + virHashFree(moments->objs); + VIR_FREE(moments); +} + + +/* Struct and callback for collecting a list of names of moments that + * meet a particular filter. */ +struct virDomainMomentNameData { + char **const names; + int maxnames; + unsigned int flags; + int count; + bool error; + virDomainMomentObjListFilter filter; +}; + +static int virDomainMomentObjListCopyNames(void *payload, + const void *name ATTRIBUTE_UNUS= ED, + void *opaque) +{ + virDomainMomentObjPtr obj =3D payload; + struct virDomainMomentNameData *data =3D opaque; + + if (data->error) + return 0; + /* Caller already sanitized flags. Filtering on DESCENDANTS was + * done by choice of iteration in the caller. */ + if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) && obj->nchildren) + return 0; + if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES) && !obj->nchild= ren) + return 0; + + if (!data->filter(obj, data->flags)) + return 0; + + if (data->names && data->count < data->maxnames && + VIR_STRDUP(data->names[data->count], obj->def->name) < 0) { + data->error =3D true; + return 0; + } + data->count++; + return 0; +} + + +int +virDomainMomentObjListGetNames(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr from, + char **const names, + int maxnames, + unsigned int flags) +{ + struct virDomainMomentNameData data =3D { names, maxnames, flags, 0, + false, moments->filter }; + size_t i; + + if (!from) { + /* LIST_ROOTS and LIST_DESCENDANTS have the same bit value, + * but opposite semantics. Toggle here to get the correct + * traversal on the metaroot. */ + flags ^=3D VIR_DOMAIN_SNAPSHOT_LIST_ROOTS; + from =3D &moments->metaroot; + } + + /* We handle LIST_ROOT/LIST_DESCENDANTS and LIST_TOPOLOGICAL directly, + * mask those bits out to determine when we must use the filter callba= ck. */ + data.flags &=3D ~(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | + VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL); + + /* If this common code is being used, we assume that all snapshots + * have metadata, and thus can handle METADATA up front as an + * all-or-none filter. XXX This might not always be true, if we + * add the ability to track qcow2 internal snapshots without the + * use of metadata. */ + if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA) =3D=3D + VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA) + return 0; + data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA; + + if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) { + /* We could just always do a topological visit; but it is + * possible to optimize for less stack usage and time when a + * simpler full hashtable visit or counter will do. */ + if (from->def || (names && + (flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL))) + virDomainMomentForEachDescendant(from, + virDomainMomentObjListCopyNam= es, + &data); + else if (names || data.flags) + virHashForEach(moments->objs, virDomainMomentObjListCopyNames, + &data); + else + data.count =3D virHashSize(moments->objs); + } else if (names || data.flags) { + virDomainMomentForEachChild(from, + virDomainMomentObjListCopyNames, &data= ); + } else { + data.count =3D from->nchildren; + } + + if (data.error) { + for (i =3D 0; i < data.count; i++) + VIR_FREE(names[i]); + return -1; + } + + return data.count; +} + + +virDomainMomentObjPtr +virDomainMomentFindByName(virDomainMomentObjListPtr moments, + const char *name) +{ + return name ? virHashLookup(moments->objs, name) : &moments->metaroot; +} + + +/* Return the current moment, or NULL */ +virDomainMomentObjPtr +virDomainMomentGetCurrent(virDomainMomentObjListPtr moments) +{ + return moments->current; +} + + +/* Return the current moment's name, or NULL */ +const char * +virDomainMomentGetCurrentName(virDomainMomentObjListPtr moments) +{ + if (moments->current) + return moments->current->def->name; + return NULL; +} + + +/* Return true if name matches the current moment */ +bool +virDomainMomentIsCurrentName(virDomainMomentObjListPtr moments, + const char *name) +{ + return moments->current && STREQ(moments->current->def->name, name); +} + + +/* Update the current moment, using NULL if no current remains */ +void +virDomainMomentSetCurrent(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr moment) +{ + moments->current =3D moment; +} + + +/* Return the number of moments in the list */ +int +virDomainMomentObjListSize(virDomainMomentObjListPtr moments) +{ + return virHashSize(moments->objs); +} + + +/* Remove moment from the list; return true if it was current */ +bool +virDomainMomentObjListRemove(virDomainMomentObjListPtr moments, + virDomainMomentObjPtr moment) +{ + bool ret =3D moments->current =3D=3D moment; + + virHashRemoveEntry(moments->objs, moment->def->name); + if (ret) + moments->current =3D NULL; + return ret; +} + + +/* Remove all moments tracked in the list */ +void +virDomainMomentObjListRemoveAll(virDomainMomentObjListPtr moments) +{ + virHashRemoveAll(moments->objs); + virDomainMomentDropChildren(&moments->metaroot); +} + + +/* Call iter on each member of the list, in unspecified order */ +int +virDomainMomentForEach(virDomainMomentObjListPtr moments, + virHashIterator iter, + void *data) +{ + return virHashForEach(moments->objs, iter, data); +} + + +/* Struct and callback function used as a hash table callback; each call + * inspects the pre-existing moment->def->parent field, and adjusts + * the moment->parent field as well as the parent's child fields to + * wire up the hierarchical relations for the given snapshot. The error + * indicator gets set if a parent is missing or a requested parent would + * cause a circular parent chain. */ +struct moment_set_relation { + virDomainMomentObjListPtr moments; + int err; +}; +static int +virDomainMomentSetRelations(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *data) +{ + virDomainMomentObjPtr obj =3D payload; + struct moment_set_relation *curr =3D data; + virDomainMomentObjPtr tmp; + virDomainMomentObjPtr parent; + + parent =3D virDomainMomentFindByName(curr->moments, obj->def->parent); + if (!parent) { + curr->err =3D -1; + parent =3D &curr->moments->metaroot; + VIR_WARN("snapshot %s lacks parent", obj->def->name); + } else { + tmp =3D parent; + while (tmp && tmp->def) { + if (tmp =3D=3D obj) { + curr->err =3D -1; + parent =3D &curr->moments->metaroot; + VIR_WARN("snapshot %s in circular chain", obj->def->name); + break; + } + tmp =3D tmp->parent; + } + } + virDomainMomentSetParent(obj, parent); + return 0; +} + + +/* Populate parent link and child count of all snapshots, with all + * assigned defs having relations starting as 0/NULL. Return 0 on + * success, -1 if a parent is missing or if a circular relationship + * was requested. */ +int +virDomainMomentUpdateRelations(virDomainMomentObjListPtr moments) +{ + struct moment_set_relation act =3D { moments, 0 }; + + virDomainMomentDropChildren(&moments->metaroot); + virHashForEach(moments->objs, virDomainMomentSetRelations, &act); + if (act.err) + moments->current =3D NULL; + return act.err; +} diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 8ecb131176..31ed1c672d 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -35,12 +35,7 @@ VIR_LOG_INIT("conf.virdomainsnapshotobjlist"); struct _virDomainSnapshotObjList { - /* name string -> virDomainMomentObj mapping - * for O(1), lockless lookup-by-name */ - virHashTable *objs; - - virDomainMomentObj metaroot; /* Special parent of all root snapshots */ - virDomainMomentObjPtr current; /* The current snapshot, if any */ + virDomainMomentObjListPtr base; }; @@ -72,7 +67,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, _("incorrect flags for bulk parse")); return -1; } - if (virDomainSnapshotObjListSize(snapshots)) { + if (virDomainMomentObjListSize(snapshots->base)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("bulk define of snapshots only possible with " "no existing snapshot")); @@ -143,7 +138,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, if (ret < 0) { /* There were no snapshots before this call; so on error, just * blindly delete anything created before the failure. */ - virDomainSnapshotObjListRemoveAll(snapshots); + virDomainMomentObjListRemoveAll(snapshots->base); } xmlXPathFreeContext(ctxt); xmlFreeDoc(xml); @@ -211,55 +206,14 @@ virDomainSnapshotObjListFormat(virBufferPtr buf, } -/* Snapshot Obj functions */ -static virDomainMomentObjPtr virDomainMomentObjNew(void) +virDomainMomentObjPtr +virDomainSnapshotAssignDef(virDomainSnapshotObjListPtr snapshots, + virDomainSnapshotDefPtr def) { - virDomainMomentObjPtr snapshot; - - if (VIR_ALLOC(snapshot) < 0) - return NULL; - - VIR_DEBUG("obj=3D%p", snapshot); - - return snapshot; -} - -static void virDomainMomentObjFree(virDomainMomentObjPtr snapshot) -{ - if (!snapshot) - return; - - VIR_DEBUG("obj=3D%p", snapshot); - - virDomainSnapshotDefFree(virDomainSnapshotObjGetDef(snapshot)); - VIR_FREE(snapshot); + return virDomainMomentAssignDef(snapshots->base, &def->common); } -virDomainMomentObjPtr virDomainSnapshotAssignDef(virDomainSnapshotObjListP= tr snapshots, - virDomainSnapshotDefPtr d= ef) -{ - virDomainMomentObjPtr snap; - - if (virHashLookup(snapshots->objs, def->common.name) !=3D NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected domain snapshot %s already exists"), - def->common.name); - return NULL; - } - - if (!(snap =3D virDomainMomentObjNew())) - return NULL; - snap->def =3D &def->common; - - if (virHashAddEntry(snapshots->objs, snap->def->name, snap) < 0) { - VIR_FREE(snap); - return NULL; - } - - return snap; -} -/* Snapshot Obj List functions */ static bool virDomainSnapshotFilter(virDomainMomentObjPtr obj, unsigned int flags) @@ -292,76 +246,30 @@ virDomainSnapshotFilter(virDomainMomentObjPtr obj, } -static void -virDomainSnapshotObjListDataFree(void *payload, - const void *name ATTRIBUTE_UNUSED) -{ - virDomainMomentObjPtr obj =3D payload; - - virDomainMomentObjFree(obj); -} - virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void) { virDomainSnapshotObjListPtr snapshots; + if (VIR_ALLOC(snapshots) < 0) return NULL; - snapshots->objs =3D virHashCreate(50, virDomainSnapshotObjListDataFree= ); - if (!snapshots->objs) { + snapshots->base =3D virDomainMomentObjListNew(virDomainSnapshotFilter); + if (!snapshots->base) { VIR_FREE(snapshots); return NULL; } return snapshots; } + void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots) { - if (!snapshots) - return; - virHashFree(snapshots->objs); + virDomainMomentObjListFree(snapshots->base); VIR_FREE(snapshots); } -struct virDomainMomentNameData { - char **const names; - int maxnames; - unsigned int flags; - int count; - bool error; - virDomainMomentObjListFilter filter; -}; - -static int virDomainMomentObjListCopyNames(void *payload, - const void *name ATTRIBUTE_UNUS= ED, - void *opaque) -{ - virDomainMomentObjPtr obj =3D payload; - struct virDomainMomentNameData *data =3D opaque; - - if (data->error) - return 0; - /* Caller already sanitized flags. Filtering on DESCENDANTS was - * done by choice of iteration in the caller. */ - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) && obj->nchildren) - return 0; - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES) && !obj->nchild= ren) - return 0; - - if (data->filter(obj, data->flags)) - return 0; - - if (data->names && data->count < data->maxnames && - VIR_STRDUP(data->names[data->count], obj->def->name) < 0) { - data->error =3D true; - return 0; - } - data->count++; - return 0; -} - int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots, virDomainMomentObjPtr from, @@ -369,73 +277,29 @@ virDomainSnapshotObjListGetNames(virDomainSnapshotObj= ListPtr snapshots, int maxnames, unsigned int flags) { - struct virDomainMomentNameData data =3D { names, maxnames, flags, 0, - false, virDomainSnapshotFilter= }; - size_t i; - - if (!from) { - /* LIST_ROOTS and LIST_DESCENDANTS have the same bit value, - * but opposite semantics. Toggle here to get the correct - * traversal on the metaroot. */ - flags ^=3D VIR_DOMAIN_SNAPSHOT_LIST_ROOTS; - from =3D &snapshots->metaroot; - } - - /* We handle LIST_ROOT/LIST_DESCENDANTS and LIST_TOPOLOGICAL directly, - * mask those bits out to determine when we must use the filter callba= ck. */ - data.flags &=3D ~(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | - VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL); - /* If this common code is being used, we assume that all snapshots * have metadata, and thus can handle METADATA up front as an * all-or-none filter. XXX This might not always be true, if we * add the ability to track qcow2 internal snapshots without the * use of metadata. */ - if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA) =3D=3D + if ((flags & VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA) =3D=3D VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA) return 0; - data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA; + flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA; /* For ease of coding the visitor, it is easier to zero each group * where all of the bits are set. */ - if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES) =3D=3D + if ((flags & VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES) =3D=3D VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES) - data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES; - if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) =3D=3D + flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES; + if ((flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) =3D=3D VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) - data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS; - if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION) =3D=3D + flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS; + if ((flags & VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION) =3D=3D VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION) - data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION; - - if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) { - /* We could just always do a topological visit; but it is - * possible to optimize for less stack usage and time when a - * simpler full hashtable visit or counter will do. */ - if (from->def || (names && - (flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL))) - virDomainMomentForEachDescendant(from, - virDomainMomentObjListCopyNam= es, - &data); - else if (names || data.flags) - virHashForEach(snapshots->objs, virDomainMomentObjListCopyName= s, - &data); - else - data.count =3D virHashSize(snapshots->objs); - } else if (names || data.flags) { - virDomainMomentForEachChild(from, - virDomainMomentObjListCopyNames, &data= ); - } else { - data.count =3D from->nchildren; - } - - if (data.error) { - for (i =3D 0; i < data.count; i++) - VIR_FREE(names[i]); - return -1; - } - - return data.count; + flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION; + return virDomainMomentObjListGetNames(snapshots->base, from, names, + maxnames, flags); } int @@ -446,19 +310,12 @@ virDomainSnapshotObjListNum(virDomainSnapshotObjListP= tr snapshots, return virDomainSnapshotObjListGetNames(snapshots, from, NULL, 0, flag= s); } + virDomainMomentObjPtr virDomainSnapshotFindByName(virDomainSnapshotObjListPtr snapshots, const char *name) { - return name ? virHashLookup(snapshots->objs, name) : &snapshots->metar= oot; -} - - -/* Return the number of objects currently in the list */ -int -virDomainSnapshotObjListSize(virDomainSnapshotObjListPtr snapshots) -{ - return virHashSize(snapshots->objs); + return virDomainMomentFindByName(snapshots->base, name); } @@ -466,7 +323,7 @@ virDomainSnapshotObjListSize(virDomainSnapshotObjListPt= r snapshots) virDomainMomentObjPtr virDomainSnapshotGetCurrent(virDomainSnapshotObjListPtr snapshots) { - return snapshots->current; + return virDomainMomentGetCurrent(snapshots->base); } @@ -474,9 +331,7 @@ virDomainSnapshotGetCurrent(virDomainSnapshotObjListPtr= snapshots) const char * virDomainSnapshotGetCurrentName(virDomainSnapshotObjListPtr snapshots) { - if (snapshots->current) - return snapshots->current->def->name; - return NULL; + return virDomainMomentGetCurrentName(snapshots->base); } @@ -485,7 +340,7 @@ bool virDomainSnapshotIsCurrentName(virDomainSnapshotObjListPtr snapshots, const char *name) { - return snapshots->current && STREQ(snapshots->current->def->name, name= ); + return virDomainMomentIsCurrentName(snapshots->base, name); } @@ -494,7 +349,7 @@ void virDomainSnapshotSetCurrent(virDomainSnapshotObjListPtr snapshots, virDomainMomentObjPtr snapshot) { - snapshots->current =3D snapshot; + virDomainMomentSetCurrent(snapshots->base, snapshot); } @@ -502,19 +357,7 @@ virDomainSnapshotSetCurrent(virDomainSnapshotObjListPt= r snapshots, bool virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots, virDomainMomentObjPtr snapshot) { - bool ret =3D snapshots->current =3D=3D snapshot; - virHashRemoveEntry(snapshots->objs, snapshot->def->name); - if (ret) - snapshots->current =3D NULL; - return ret; -} - -/* Remove all snapshots tracked in the list */ -void -virDomainSnapshotObjListRemoveAll(virDomainSnapshotObjListPtr snapshots) -{ - virHashRemoveAll(snapshots->objs); - virDomainMomentDropChildren(&snapshots->metaroot); + return virDomainMomentObjListRemove(snapshots->base, snapshot); } @@ -523,51 +366,10 @@ virDomainSnapshotForEach(virDomainSnapshotObjListPtr = snapshots, virHashIterator iter, void *data) { - return virHashForEach(snapshots->objs, iter, data); + return virDomainMomentForEach(snapshots->base, iter, data); } -/* Struct and callback function used as a hash table callback; each call - * inspects the pre-existing snapshot->def->parent field, and adjusts - * the snapshot->parent field as well as the parent's child fields to - * wire up the hierarchical relations for the given snapshot. The error - * indicator gets set if a parent is missing or a requested parent would - * cause a circular parent chain. */ -struct moment_set_relation { - virDomainSnapshotObjListPtr snapshots; - int err; -}; -static int -virDomainMomentSetRelations(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *data) -{ - virDomainMomentObjPtr obj =3D payload; - struct moment_set_relation *curr =3D data; - virDomainMomentObjPtr tmp; - virDomainMomentObjPtr parent; - - parent =3D virDomainSnapshotFindByName(curr->snapshots, obj->def->pare= nt); - if (!parent) { - curr->err =3D -1; - parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s lacks parent", obj->def->name); - } else { - tmp =3D parent; - while (tmp && tmp->def) { - if (tmp =3D=3D obj) { - curr->err =3D -1; - parent =3D &curr->snapshots->metaroot; - VIR_WARN("snapshot %s in circular chain", obj->def->name); - break; - } - tmp =3D tmp->parent; - } - } - virDomainMomentSetParent(obj, parent); - return 0; -} - /* Populate parent link and child count of all snapshots, with all * assigned defs having relations starting as 0/NULL. Return 0 on * success, -1 if a parent is missing or if a circular relationship @@ -575,13 +377,7 @@ virDomainMomentSetRelations(void *payload, int virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots) { - struct moment_set_relation act =3D { snapshots, 0 }; - - virDomainMomentDropChildren(&snapshots->metaroot); - virHashForEach(snapshots->objs, virDomainMomentSetRelations, &act); - if (act.err) - snapshots->current =3D NULL; - return act.err; + return virDomainMomentUpdateRelations(snapshots->base); } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553060502140518.5592377329286; Tue, 19 Mar 2019 22:41:42 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 67CD936955; Wed, 20 Mar 2019 05:41:40 +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 40C8017DB5; Wed, 20 Mar 2019 05:41:40 +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 F2E9F181A00D; Wed, 20 Mar 2019 05:41:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fXIk017303 for ; Wed, 20 Mar 2019 01:41:33 -0400 Received: by smtp.corp.redhat.com (Postfix) id 54FD31A914; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id E966B1A913; Wed, 20 Mar 2019 05:41:32 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:04 -0500 Message-Id: <20190320054105.17689-16-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 15/16] snapshot: Tweaks to support new bulk dumpxml/import API 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.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 20 Mar 2019 05:41:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Change the return value of virDomainSnapshotObjLisParse() to return the number of snapshots imported, and allow a return of 0 (the original proposal of adding a flag to virDomainSnapshotCreateXML required returning an arbitrary non-NULL snapshot, but with a new API that returns a count, we are no longer constrained to a non-empty list). Document which flags are supported (namely, just SECURE) in virDomainSnapshotObjListFormat(). Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- src/conf/virdomainsnapshotobjlist.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 31ed1c672d..b7dc74b27f 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -39,8 +39,10 @@ struct _virDomainSnapshotObjList { }; -/* Parse a XML entry into snapshots, which must start empty. - * Any sub-elements of a must match domain_uuid. +/* Parse a XML entry into snapshots, which must start + * empty. Any sub-elements of a must match + * domain_uuid. @flags is virDomainSnapshotParseFlags. Return the + * number of snapshots parsed, or -1 on error. */ int virDomainSnapshotObjListParse(const char *xmlStr, @@ -94,11 +96,6 @@ virDomainSnapshotObjListParse(const char *xmlStr, if ((n =3D virXPathNodeSet("./domainsnapshot", ctxt, &nodes)) < 0) goto cleanup; - if (!n) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("expected at least one child")); - goto cleanup; - } for (i =3D 0; i < n; i++) { virDomainSnapshotDefPtr def; @@ -133,7 +130,7 @@ virDomainSnapshotObjListParse(const char *xmlStr, virDomainSnapshotSetCurrent(snapshots, snap); } - ret =3D 0; + ret =3D n; cleanup: if (ret < 0) { /* There were no snapshots before this call; so on error, just @@ -172,8 +169,9 @@ virDomainSnapshotFormatOne(void *payload, } -/* Format the XML for all snapshots in the list into buf. On error, - * clear the buffer and return -1. */ +/* Format the XML for all snapshots in the list into buf. @flags is + * virDomainSnapshotFormatFlags. On error, clear the buffer and return + * -1. */ int virDomainSnapshotObjListFormat(virBufferPtr buf, const char *uuidstr, @@ -190,6 +188,7 @@ virDomainSnapshotObjListFormat(virBufferPtr buf, .flags =3D flags, }; + virCheckFlags(VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE, -1); virBufferAddLit(buf, " Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1553060507027187.0775878902101; Tue, 19 Mar 2019 22:41:47 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7CC66C05D3F5; Wed, 20 Mar 2019 05:41:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 535781823B; Wed, 20 Mar 2019 05:41:45 +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 10E683FA4D; Wed, 20 Mar 2019 05:41:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2K5fXCq017311 for ; Wed, 20 Mar 2019 01:41:33 -0400 Received: by smtp.corp.redhat.com (Postfix) id D80D717795; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7902D1974C; Wed, 20 Mar 2019 05:41:33 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 00:41:05 -0500 Message-Id: <20190320054105.17689-17-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 16/16] backup: Introduce virDomainCheckpointPtr 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.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 20 Mar 2019 05:41:45 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Prepare for introducing a bunch of new public APIs related to backup checkpoints by first introducing a new internal type and errors associated with that type. Checkpoints are modeled heavily after virDomainSnapshotPtr (both represent a point in time of the guest), although a snapshot exists with the intent of rolling back to that state, while a checkpoint exists to make it possible to create an incremental backup at a later time. Thus, it shares the common virDomainMoment base class created in the previous patches. Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- include/libvirt/virterror.h | 6 +++++- src/util/virerror.c | 12 ++++++++++- include/libvirt/libvirt.h | 6 +++++- src/datatypes.h | 43 +++++++++++++++++++++++++++++++++++++ src/datatypes.c | 22 +++++++++++++++++++ src/libvirt_private.syms | 2 ++ 6 files changed, 88 insertions(+), 3 deletions(-) diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h index 3c19ff5e2e..bccf3c731e 100644 --- a/include/libvirt/virterror.h +++ b/include/libvirt/virterror.h @@ -4,7 +4,7 @@ * Description: Provides the interfaces of the libvirt library to handle * errors raised while using the library. * - * Copyright (C) 2006-2016 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -132,6 +132,7 @@ typedef enum { VIR_FROM_LIBSSH =3D 66, /* Error from libssh connection transpor= t */ VIR_FROM_RESCTRL =3D 67, /* Error from resource control */ VIR_FROM_FIREWALLD =3D 68, /* Error from firewalld */ + VIR_FROM_DOMAIN_CHECKPOINT =3D 69,/* Error from domain checkpoint */ # ifdef VIR_ENUM_SENTINELS VIR_ERR_DOMAIN_LAST @@ -322,6 +323,9 @@ typedef enum { VIR_ERR_DEVICE_MISSING =3D 99, /* fail to find the desired devi= ce */ VIR_ERR_INVALID_NWFILTER_BINDING =3D 100, /* invalid nwfilter binding= */ VIR_ERR_NO_NWFILTER_BINDING =3D 101, /* no nwfilter binding */ + VIR_ERR_INVALID_DOMAIN_CHECKPOINT =3D 102, /* invalid domain checkpoin= t */ + VIR_ERR_NO_DOMAIN_CHECKPOINT =3D 103, /* domain checkpoint not found */ + VIR_ERR_NO_DOMAIN_BACKUP =3D 104, /* domain backup job id not foun= d */ # ifdef VIR_ENUM_SENTINELS VIR_ERR_NUMBER_LAST diff --git a/src/util/virerror.c b/src/util/virerror.c index 91a513160f..05e535d859 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -1,7 +1,7 @@ /* * virerror.c: error handling and reporting code for libvirt * - * Copyright (C) 2006, 2008-2016 Red Hat, Inc. + * Copyright (C) 2006-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -139,6 +139,7 @@ VIR_ENUM_IMPL(virErrorDomain, VIR_ERR_DOMAIN_LAST, "Libssh transport layer", "Resource control", "FirewallD", + "Domain Checkpoint", ); @@ -1214,6 +1215,15 @@ const virErrorMsgTuple virErrorMsgStrings[VIR_ERR_NU= MBER_LAST] =3D { [VIR_ERR_NO_NWFILTER_BINDING] =3D { N_("Network filter binding not found"), N_("Network filter binding not found: %s") }, + [VIR_ERR_INVALID_DOMAIN_CHECKPOINT] =3D { + N_("Invalid domain checkpoint"), + N_("Invalid domain checkpoint: %s") }, + [VIR_ERR_NO_DOMAIN_CHECKPOINT] =3D { + N_("Domain checkpoint not found"), + N_("Domain checkpoint not found: %s") }, + [VIR_ERR_NO_DOMAIN_BACKUP] =3D { + N_("Domain backup job id not found"), + N_("Domain backup job id not found: %s") }, }; diff --git a/include/libvirt/libvirt.h b/include/libvirt/libvirt.h index 20e5d276a7..13de151cb6 100644 --- a/include/libvirt/libvirt.h +++ b/include/libvirt/libvirt.h @@ -4,7 +4,7 @@ * Description: Provides the interfaces of the libvirt library to handle * virtualized domains * - * Copyright (C) 2005-2006, 2010-2014 Red Hat, Inc. + * Copyright (C) 2005-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -34,6 +34,10 @@ extern "C" { # include # include # include +/* FIXME: Temporary hack until later patch creates new + * libvirt-domain-checkpoint.h file */ +typedef struct _virDomainCheckpoint virDomainCheckpoint; +typedef virDomainCheckpoint *virDomainCheckpointPtr; # include # include # include diff --git a/src/datatypes.h b/src/datatypes.h index 70d947657b..3d316e6739 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -32,6 +32,7 @@ extern virClassPtr virConnectClass; extern virClassPtr virDomainClass; extern virClassPtr virDomainMomentClass; +extern virClassPtr virDomainCheckpointClass; extern virClassPtr virDomainSnapshotClass; extern virClassPtr virInterfaceClass; extern virClassPtr virNetworkClass; @@ -293,6 +294,22 @@ extern virClassPtr virAdmClientClass; } \ } while (0) + +# define virCheckDomainCheckpointReturn(obj, retval) \ + do { \ + virDomainCheckpointPtr _check =3D (obj); \ + if (!virObjectIsClass(_check, virDomainCheckpointClass) || \ + !virObjectIsClass(virChkDom(_check), virDomainClass) || \ + !virObjectIsClass(virChkDom(_check)->conn, virConnectClass)) {= \ + virReportErrorHelper(VIR_FROM_DOMAIN_CHECKPOINT, \ + VIR_ERR_INVALID_DOMAIN_CHECKPOINT, \ + __FILE__, __FUNCTION__, __LINE__, \ + __FUNCTION__); \ + virDispatchError(NULL); \ + return retval; \ + } \ + } while (0) + # define virCheckDomainSnapshotReturn(obj, retval) \ do { \ virDomainSnapshotPtr _snap =3D (obj); \ @@ -683,6 +700,30 @@ struct _virDomainMoment { virDomainPtr domain; }; +/* + * _virDomainCheckpoint + * + * Internal structure associated with a domain checkpoint + */ +struct _virDomainCheckpoint { + virDomainMoment parent; + + /* Unused attribute to allow for subclass creation */ + bool dummy; +}; + +static inline char * +virChkName(virDomainCheckpointPtr checkpoint) +{ + return checkpoint->parent.name; +} + +static inline virDomainPtr +virChkDom(virDomainCheckpointPtr checkpoint) +{ + return checkpoint->parent.domain; +} + /** * _virDomainSnapshot * @@ -772,6 +813,8 @@ virNWFilterPtr virGetNWFilter(virConnectPtr conn, virNWFilterBindingPtr virGetNWFilterBinding(virConnectPtr conn, const char *portdev, const char *filtername); +virDomainCheckpointPtr virGetDomainCheckpoint(virDomainPtr domain, + const char *name); virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain, const char *name); diff --git a/src/datatypes.c b/src/datatypes.c index f0cfbe11fc..ec22a7b38a 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -37,6 +37,7 @@ virClassPtr virConnectClass; virClassPtr virConnectCloseCallbackDataClass; virClassPtr virDomainClass; virClassPtr virDomainMomentClass; +virClassPtr virDomainCheckpointClass; virClassPtr virDomainSnapshotClass; virClassPtr virInterfaceClass; virClassPtr virNetworkClass; @@ -52,6 +53,7 @@ static void virConnectDispose(void *obj); static void virConnectCloseCallbackDataDispose(void *obj); static void virDomainDispose(void *obj); static void virDomainMomentDispose(void *obj); +#define virDomainCheckpointDispose NULL #define virDomainSnapshotDispose NULL static void virInterfaceDispose(void *obj); static void virNetworkDispose(void *obj); @@ -89,6 +91,7 @@ virDataTypesOnceInit(void) DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData); DECLARE_CLASS(virDomain); DECLARE_CLASS(virDomainMoment); + DECLARE_CLASS_COMMON(virDomainCheckpoint, virDomainMomentClass); DECLARE_CLASS_COMMON(virDomainSnapshot, virDomainMomentClass); DECLARE_CLASS(virInterface); DECLARE_CLASS(virNetwork); @@ -961,6 +964,25 @@ virDomainMomentDispose(void *obj) } +/** + * virGetDomainCheckpoint: + * @domain: the domain to checkpoint + * @name: pointer to the domain checkpoint name + * + * Allocates a new domain checkpoint object. When the object is no longer = needed, + * virObjectUnref() must be called in order to not leak data. + * + * Returns a pointer to the domain checkpoint object, or NULL on error. + */ +virDomainCheckpointPtr +virGetDomainCheckpoint(virDomainPtr domain, + const char *name) +{ + return (virDomainCheckpointPtr) virGetDomainMoment(domain, name, + virDomainCheckpoint= Class); +} + + /** * virGetDomainSnapshot: * @domain: the domain to snapshot diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 10cdfad4fd..c848ba4239 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1252,10 +1252,12 @@ virConnectCloseCallbackDataClass; virConnectCloseCallbackDataGetCallback; virConnectCloseCallbackDataRegister; virConnectCloseCallbackDataUnregister; +virDomainCheckpointClass; virDomainClass; virDomainSnapshotClass; virGetConnect; virGetDomain; +virGetDomainCheckpoint; virGetDomainSnapshot; virGetInterface; virGetNetwork; --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553117607582505.0428053350897; Wed, 20 Mar 2019 14:33:27 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5FC7258E3E; Wed, 20 Mar 2019 21:33:25 +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 064CA60857; Wed, 20 Mar 2019 21:33:25 +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 3E7471803389; Wed, 20 Mar 2019 21:33:24 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2KLWjf4003881 for ; Wed, 20 Mar 2019 17:32:45 -0400 Received: by smtp.corp.redhat.com (Postfix) id 73C7C60BFE; Wed, 20 Mar 2019 21:32:45 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id EE6C660BF2; Wed, 20 Mar 2019 21:32:42 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Wed, 20 Mar 2019 16:32:41 -0500 Message-Id: <20190320213242.26859-1-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 17/16] snapshot: Store qemu snapshot state in bulk 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.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 20 Mar 2019 21:33:26 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Rather than one file per snapshot, store all qemu snapshots in a single file, using the recently added bulk snapshot list operations. For now, this doesn't change how often libvirt writes a snapshot file, but it does open the door for the next patch to update the signature to qemuDomainSnapshotWriteMetadata() and call it less frequently. One of the main benefits for doing a bulk write is that you only have to do a single file system write at the end of an operation, rather than potentially 3 during virDomainSnapshotCreateXML(REDEFINE|CURRENT) (delete the old snapshot definition being redefined, rewrite the previous current snapshot to longer be current, and store the new snapshot definition) or even more during virDomainSnapshotDelete(DESCENDENTS) (a file system hit per snapshot being deleted). It also makes it perhaps a bit more feasible to roll back to earlier state if something fails horribly midway through an operation (until you write the new file, the old file is still a reliable record of what state to roll back to), compared to the current code which has to track lots of things locally; although I did not attempt to play with any patches along those lines. Another benefit of the bulk write - it's less code to maintain, and will make it easier for me to model qemu's checkpoint storage in the same way (and for checkpoints, I don't even have to worry about legacy parsing). This is a one-way upgrade - if you have snapshots created by an older libvirt, the new libvirt will correctly load those snapshots and convert to the new format. But as the new libvirt will no longer output the old format, reverting back to the old libvirt will make it appear that all snapshots have disappeared (merely hidden until you upgrade libvirt again). But then again, we've never promised that downgrading libvirt after an upgrade was supposed to work flawlessly. There is a slight chance for confusion if a user named two separate domains 'foo' and 'foo.xml'; the new scheme expects 'foo.xml' to be a regular file for the former domain, while the old scheme expected 'foo.xml' to be a directory for the latter domain; if we are worried about that, we could tweak the code to instead output new state in a file named 'foo' instead of the more typical 'foo.xml' and just key off of whether the file is regular or a directory when deciding if this is the first libvirt run after an upgrade. But I felt that the chances of a user abusing domain names like that is not worth the effort. The bulk snapshot file can be huge (over RPC, we allow to be up to 4M, and we allow up to 16k snapshots; since each each snapshot includes a , a worst-case domain would result in gigabytes of bulk data); it is no worse on overall filesystem usage than before, but now in a single file vs. a series of files it requires more memory to read in at once. I don't know if we have to worry about that in practice, but my patch does cap things to read in no more than an arbitrarily-picked 128M, which we may have to raise in the future. Signed-off-by: Eric Blake --- src/qemu/qemu_domain.c | 59 ++++++++------------------- src/qemu/qemu_driver.c | 93 +++++++++++++++++++++++++++++++++--------- 2 files changed, 91 insertions(+), 61 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ea7b31dab3..424f839a00 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8448,45 +8448,28 @@ qemuFindQemuImgBinary(virQEMUDriverPtr driver) int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, - virDomainMomentObjPtr snapshot, + virDomainMomentObjPtr snapshot ATTRIBUTE_U= NUSED, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, const char *snapshotDir) { - char *newxml =3D NULL; - int ret =3D -1; - char *snapDir =3D NULL; - char *snapFile =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; - unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | - VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL; - virDomainSnapshotDefPtr def =3D virDomainSnapshotObjGetDef(snapshot); + unsigned int flags =3D VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE; + VIR_AUTOFREE(char *) newxml =3D NULL; + VIR_AUTOFREE(char *) snapDir =3D NULL; + VIR_AUTOFREE(char *) snapFile =3D NULL; + VIR_AUTOCLEAN(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; - if (virDomainSnapshotGetCurrent(vm->snapshots) =3D=3D snapshot) - flags |=3D VIR_DOMAIN_SNAPSHOT_FORMAT_CURRENT; virUUIDFormat(vm->def->uuid, uuidstr); - newxml =3D virDomainSnapshotDefFormat(uuidstr, def, caps, xmlopt, flag= s); - if (newxml =3D=3D NULL) + if (virDomainSnapshotObjListFormat(&buf, uuidstr, vm->snapshots, caps, + xmlopt, flags) < 0) return -1; - if (virAsprintf(&snapDir, "%s/%s", snapshotDir, vm->def->name) < 0) - goto cleanup; - if (virFileMakePath(snapDir) < 0) { - virReportSystemError(errno, _("cannot create snapshot directory '%= s'"), - snapDir); - goto cleanup; - } - - if (virAsprintf(&snapFile, "%s/%s.xml", snapDir, def->common.name) < 0) - goto cleanup; - - ret =3D virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); + if (virAsprintf(&snapFile, "%s/%s.xml", snapshotDir, vm->def->name) < = 0) + return -1; - cleanup: - VIR_FREE(snapFile); - VIR_FREE(snapDir); - VIR_FREE(newxml); - return ret; + newxml =3D virBufferContentAndReset(&buf); + return virXMLSaveFile(snapFile, NULL, "snapshot-edit", newxml); } /* The domain is expected to be locked and inactive. Return -1 on normal @@ -8589,7 +8572,6 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, bool update_parent, bool metadata_only) { - char *snapFile =3D NULL; int ret =3D -1; qemuDomainObjPrivatePtr priv; virDomainMomentObjPtr parentsnap =3D NULL; @@ -8610,10 +8592,6 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } } - if (virAsprintf(&snapFile, "%s/%s/%s.xml", cfg->snapshotDir, - vm->def->name, snap->def->name) < 0) - goto cleanup; - if (snap =3D=3D virDomainSnapshotGetCurrent(vm->snapshots)) { virDomainSnapshotSetCurrent(vm->snapshots, NULL); if (update_parent && snap->def->parent) { @@ -8635,8 +8613,6 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } } - if (unlink(snapFile) < 0) - VIR_WARN("Failed to unlink %s", snapFile); if (update_parent) virDomainMomentDropParent(snap); virDomainSnapshotObjListRemove(vm->snapshots, snap); @@ -8644,7 +8620,6 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, ret =3D 0; cleanup: - VIR_FREE(snapFile); virObjectUnref(cfg); return ret; } @@ -8691,7 +8666,7 @@ qemuDomainRemoveInactiveCommon(virQEMUDriverPtr drive= r, virDomainObjPtr vm) { virQEMUDriverConfigPtr cfg; - VIR_AUTOFREE(char *) snapDir =3D NULL; + VIR_AUTOFREE(char *) snapFile =3D NULL; cfg =3D virQEMUDriverGetConfig(driver); @@ -8699,12 +8674,12 @@ qemuDomainRemoveInactiveCommon(virQEMUDriverPtr dri= ver, if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) { VIR_WARN("unable to remove all snapshots for domain %s", vm->def->name); - } else if (virAsprintf(&snapDir, "%s/%s", cfg->snapshotDir, + } else if (virAsprintf(&snapFile, "%s/%s.xml", cfg->snapshotDir, vm->def->name) < 0) { - VIR_WARN("unable to remove snapshot directory %s/%s", + VIR_WARN("unable to remove snapshots storage %s/%s.xml", cfg->snapshotDir, vm->def->name); - } else if (rmdir(snapDir) < 0 && errno !=3D ENOENT) { - VIR_WARN("unable to remove snapshot directory %s", snapDir); + } else if (unlink(snapFile) < 0 && errno !=3D ENOENT) { + VIR_WARN("unable to remove snapshots storage %s", snapFile); } qemuExtDevicesCleanupHost(driver, vm->def); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9c2245b095..018d1cdc87 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -406,12 +406,14 @@ qemuSecurityInit(virQEMUDriverPtr driver) } +/* Older qemu used a series of $dir/snapshot/domainname/snap.xml + * files, instead of the modern $dir/snapshot/domainname.xml bulk + * file. Called while vm is locked. */ static int -qemuDomainSnapshotLoad(virDomainObjPtr vm, - void *data) +qemuDomainSnapshotLoadLegacy(virDomainObjPtr vm, + char *snapDir, + virCapsPtr caps) { - char *baseDir =3D (char *)data; - char *snapDir =3D NULL; DIR *dir =3D NULL; struct dirent *entry; char *xmlStr; @@ -424,21 +426,8 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL); int ret =3D -1; - virCapsPtr caps =3D NULL; int direrr; - virObjectLock(vm); - if (virAsprintf(&snapDir, "%s/%s", baseDir, vm->def->name) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to allocate memory for " - "snapshot directory for domain %s"), - vm->def->name); - goto cleanup; - } - - if (!(caps =3D virQEMUDriverGetCapabilities(qemu_driver, false))) - goto cleanup; - VIR_INFO("Scanning for snapshots for domain %s in %s", vm->def->name, snapDir); @@ -503,6 +492,74 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, _("Snapshots have inconsistent relations for domain= %s"), vm->def->name); + virResetLastError(); + + ret =3D 0; + cleanup: + VIR_DIR_CLOSE(dir); + return ret; +} + + +/* Load all snapshots associated with domain */ +static int +qemuDomainSnapshotLoad(virDomainObjPtr vm, + void *data) +{ + char *baseDir =3D (char *)data; + unsigned int flags =3D (VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE | + VIR_DOMAIN_SNAPSHOT_PARSE_DISKS); + int ret =3D -1; + virCapsPtr caps =3D NULL; + VIR_AUTOFREE(char *) snapFile =3D NULL; + VIR_AUTOFREE(char *) snapDir =3D NULL; + VIR_AUTOFREE(char *) xmlStr =3D NULL; + + virObjectLock(vm); + VIR_INFO("Scanning for snapshots for domain %s in %s", vm->def->name, + baseDir); + if (virAsprintf(&snapFile, "%s/%s.xml", baseDir, vm->def->name) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to allocate memory for " + "snapshots storage for domain %s"), + vm->def->name); + goto cleanup; + } + + if (!(caps =3D virQEMUDriverGetCapabilities(qemu_driver, false))) + goto cleanup; + + if (virFileExists(snapFile)) { + /* State last saved by modern libvirt in single file. As each + * snapshot contains a , it can be quite large. */ + if (virFileReadAll(snapFile, 128*1024*1024*1, &xmlStr) < 0) { + /* Nothing we can do here */ + virReportSystemError(errno, + _("Failed to read snapshot file %s"), + snapFile); + goto cleanup; + } + + ret =3D virDomainSnapshotObjListParse(xmlStr, vm->def->uuid, + vm->snapshots, caps, + qemu_driver->xmlopt, flags); + if (ret < 0) + goto cleanup; + VIR_INFO("Read in %d snapshots for domain %s", ret, vm->def->name); + } else if (virAsprintf(&snapDir, "%s/%s", baseDir, vm->def->name) >=3D= 0 && + virFileExists(snapDir)) { + /* State may have been saved by earlier libvirt; if so, try to + * read it in, convert to modern style, and remove the old + * directory if successful. */ + if (qemuDomainSnapshotLoadLegacy(vm, snapDir, caps) < 0) + goto cleanup; + if (qemuDomainSnapshotWriteMetadata(vm, NULL, caps, + qemu_driver->xmlopt, baseDir) = < 0) + goto cleanup; + if (virFileDeleteTree(snapDir) < 0) + VIR_WARN("Unable to remove legacy snapshot directory %s", snap= Dir); + } + /* FIXME: qemu keeps internal track of snapshots. We can get access * to this info via the "info snapshots" monitor command for running * domains, or via "qemu-img snapshot -l" for shutoff domains. It wou= ld @@ -516,8 +573,6 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, ret =3D 0; cleanup: - VIR_DIR_CLOSE(dir); - VIR_FREE(snapDir); virObjectUnref(caps); virObjectUnlock(vm); return ret; --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Wed Apr 24 07:48:47 2024 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 1553228742145644.798156418657; Thu, 21 Mar 2019 21:25:42 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B81F0C04FFF7; Fri, 22 Mar 2019 04:25:38 +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 6BF935D9C5; Fri, 22 Mar 2019 04:25:35 +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 088BA1803389; Fri, 22 Mar 2019 04:25:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x2M4PRml012900 for ; Fri, 22 Mar 2019 00:25:27 -0400 Received: by smtp.corp.redhat.com (Postfix) id B69F1608A4; Fri, 22 Mar 2019 04:25:27 +0000 (UTC) Received: from blue.redhat.com (ovpn-116-65.phx2.redhat.com [10.3.116.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 43E0560857; Fri, 22 Mar 2019 04:25:25 +0000 (UTC) From: Eric Blake To: libvir-list@redhat.com Date: Thu, 21 Mar 2019 23:25:24 -0500 Message-Id: <20190322042524.32568-1-eblake@redhat.com> In-Reply-To: <20190320054105.17689-1-eblake@redhat.com> References: <20190320054105.17689-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Cc: jtomko@redhat.com Subject: [libvirt] [PATCH 14.5/16] snapshot: Make virDomainMomentObjListGetNames more generic 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.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 22 Mar 2019 04:25:40 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Rather than hard-coding the snapshot filter bit values into the generic code, add another layer of indirection: callers must map which of their public filter bits correspond to supported moment bits, then pass two separate flags (the ones translated for moment code to operate on, and the remaining ones for the filter callback to operate on). Signed-off-by: Eric Blake Reviewed-by: John Ferlan --- I realized I don't have to mess with matching public API bits at all. But if I'm smart, the bit values I choose for checkpoints will match the internal ones supported by moments, so that only the snapshot code has to do the mapping. src/conf/virdomainmomentobjlist.h | 32 ++++++++++++++++++++++++++-- src/conf/virdomainmomentobjlist.c | 33 +++++++++++++++-------------- src/conf/virdomainsnapshotobjlist.c | 29 +++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/conf/virdomainmomentobjlist.h b/src/conf/virdomainmomentob= jlist.h index 89a0df5a24..b67af24bba 100644 --- a/src/conf/virdomainmomentobjlist.h +++ b/src/conf/virdomainmomentobjlist.h @@ -70,12 +70,40 @@ void virDomainMomentObjListFree(virDomainMomentObjListP= tr moments); virDomainMomentObjPtr virDomainMomentAssignDef(virDomainMomentObjListPtr m= oments, virDomainMomentDefPtr def); +/* Various enum bits that map to public API filters. Note that the + * values of the internal bits are not necessarily the same as the + * public ones. */ +typedef enum { + VIR_DOMAIN_MOMENT_LIST_ROOTS =3D (1 << 0), + VIR_DOMAIN_MOMENT_LIST_DESCENDANTS =3D (1 << 0), + VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL =3D (1 << 1), + VIR_DOMAIN_MOMENT_LIST_LEAVES =3D (1 << 2), + VIR_DOMAIN_MOMENT_LIST_NO_LEAVES =3D (1 << 3), + VIR_DOMAIN_MOMENT_LIST_METADATA =3D (1 << 4), + VIR_DOMAIN_MOMENT_LIST_NO_METADATA =3D (1 << 5), +} virDomainMomentFilters; + +# define VIR_DOMAIN_MOMENT_FILTERS_METADATA \ + (VIR_DOMAIN_MOMENT_LIST_METADATA | \ + VIR_DOMAIN_MOMENT_LIST_NO_METADATA) + +# define VIR_DOMAIN_MOMENT_FILTERS_LEAVES \ + (VIR_DOMAIN_MOMENT_LIST_LEAVES | \ + VIR_DOMAIN_MOMENT_LIST_NO_LEAVES) + +# define VIR_DOMAIN_MOMENT_FILTERS_ALL \ + (VIR_DOMAIN_MOMENT_LIST_ROOTS | \ + VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL | \ + VIR_DOMAIN_MOMENT_FILTERS_METADATA | \ + VIR_DOMAIN_MOMENT_FILTERS_LEAVES) + int virDomainMomentObjListGetNames(virDomainMomentObjListPtr moments, virDomainMomentObjPtr from, char **const names, int maxnames, - unsigned int flags, - virDomainMomentObjListFilter filter); + unsigned int moment_flags, + virDomainMomentObjListFilter filter, + unsigned int filter_flags); virDomainMomentObjPtr virDomainMomentFindByName(virDomainMomentObjListPtr = moments, const char *name); int virDomainMomentObjListSize(virDomainMomentObjListPtr moments); diff --git a/src/conf/virdomainmomentobjlist.c b/src/conf/virdomainmomentob= jlist.c index 46bd3e448a..94b927746a 100644 --- a/src/conf/virdomainmomentobjlist.c +++ b/src/conf/virdomainmomentobjlist.c @@ -281,6 +281,7 @@ struct virDomainMomentNameData { int count; bool error; virDomainMomentObjListFilter filter; + unsigned int filter_flags; }; @@ -295,13 +296,12 @@ static int virDomainMomentObjListCopyNames(void *payl= oad, return 0; /* Caller already sanitized flags. Filtering on DESCENDANTS was * done by choice of iteration in the caller. */ - /* TODO: Create VIR_DOMAIN_MOMENT_LIST names */ - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) && obj->nchildren) + if ((data->flags & VIR_DOMAIN_MOMENT_LIST_LEAVES) && obj->nchildren) return 0; - if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES) && !obj->nchild= ren) + if ((data->flags & VIR_DOMAIN_MOMENT_LIST_NO_LEAVES) && !obj->nchildre= n) return 0; - if (!data->filter(obj, data->flags)) + if (!data->filter(obj, data->filter_flags)) return 0; if (data->names && data->count < data->maxnames && @@ -320,25 +320,26 @@ virDomainMomentObjListGetNames(virDomainMomentObjList= Ptr moments, char **const names, int maxnames, unsigned int flags, - virDomainMomentObjListFilter filter) + virDomainMomentObjListFilter filter, + unsigned int filter_flags) { struct virDomainMomentNameData data =3D { names, maxnames, flags, 0, - false, filter }; + false, filter, filter_flags }; size_t i; + virCheckFlags(VIR_DOMAIN_MOMENT_FILTERS_ALL, -1); if (!from) { /* LIST_ROOTS and LIST_DESCENDANTS have the same bit value, * but opposite semantics. Toggle here to get the correct * traversal on the metaroot. */ - /* TODO: Create VIR_DOMAIN_MOMENT_LIST names */ - flags ^=3D VIR_DOMAIN_SNAPSHOT_LIST_ROOTS; + flags ^=3D VIR_DOMAIN_MOMENT_LIST_ROOTS; from =3D &moments->metaroot; } /* We handle LIST_ROOT/LIST_DESCENDANTS and LIST_TOPOLOGICAL directly, * mask those bits out to determine when we must use the filter callba= ck. */ - data.flags &=3D ~(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS | - VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL); + data.flags &=3D ~(VIR_DOMAIN_MOMENT_LIST_DESCENDANTS | + VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL); /* If this common code is being used, we assume that all moments * have metadata, and thus can handle METADATA up front as an @@ -346,21 +347,21 @@ virDomainMomentObjListGetNames(virDomainMomentObjList= Ptr moments, * add the ability to track qcow2 internal snapshots without the * use of metadata, in which case this check should move into the * filter callback. */ - if ((data.flags & VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA) =3D=3D - VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA) + if ((data.flags & VIR_DOMAIN_MOMENT_FILTERS_METADATA) =3D=3D + VIR_DOMAIN_MOMENT_LIST_NO_METADATA) return 0; - data.flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA; + data.flags &=3D ~VIR_DOMAIN_MOMENT_FILTERS_METADATA; - if (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) { + if (flags & VIR_DOMAIN_MOMENT_LIST_DESCENDANTS) { /* We could just always do a topological visit; but it is * possible to optimize for less stack usage and time when a * simpler full hashtable visit or counter will do. */ if (from->def || (names && - (flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL))) + (flags & VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL))) virDomainMomentForEachDescendant(from, virDomainMomentObjListCopyNam= es, &data); - else if (names || data.flags) + else if (names || data.flags || filter_flags) virHashForEach(moments->objs, virDomainMomentObjListCopyNames, &data); else diff --git a/src/conf/virdomainsnapshotobjlist.c b/src/conf/virdomainsnapsh= otobjlist.c index 52887add46..0e38e1585e 100644 --- a/src/conf/virdomainsnapshotobjlist.c +++ b/src/conf/virdomainsnapshotobjlist.c @@ -279,6 +279,31 @@ virDomainSnapshotObjListGetNames(virDomainSnapshotObjL= istPtr snapshots, int maxnames, unsigned int flags) { + /* Convert public flags into common flags */ + unsigned int moment_flags =3D 0; + struct { int snap_flag; int moment_flag; } map[] =3D { + { VIR_DOMAIN_SNAPSHOT_LIST_ROOTS, + VIR_DOMAIN_MOMENT_LIST_ROOTS, }, + { VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL, + VIR_DOMAIN_MOMENT_LIST_TOPOLOGICAL, }, + { VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, + VIR_DOMAIN_MOMENT_LIST_LEAVES, }, + { VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES, + VIR_DOMAIN_MOMENT_LIST_NO_LEAVES, }, + { VIR_DOMAIN_SNAPSHOT_LIST_METADATA, + VIR_DOMAIN_MOMENT_LIST_METADATA, }, + { VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA, + VIR_DOMAIN_MOMENT_LIST_NO_METADATA, }, + }; + size_t i; + + for (i =3D 0; i < ARRAY_CARDINALITY(map); i++) { + if (flags & map[i].snap_flag) { + flags &=3D ~map[i].snap_flag; + moment_flags |=3D map[i].moment_flag; + } + } + /* For ease of coding the visitor, it is easier to zero each group * where all of the bits are set. */ if ((flags & VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES) =3D=3D @@ -291,8 +316,8 @@ virDomainSnapshotObjListGetNames(virDomainSnapshotObjLi= stPtr snapshots, VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION) flags &=3D ~VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION; return virDomainMomentObjListGetNames(snapshots->base, from, names, - maxnames, flags, - virDomainSnapshotFilter); + maxnames, moment_flags, + virDomainSnapshotFilter, flags); } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list