[libvirt] [PATCH 1/6] snapshot: identify which snapshots have metadata

Eric Blake eblake at redhat.com
Fri Aug 12 18:49:00 UTC 2011


To make it easier to know when undefine will fail because of existing
snapshot metadata, we need to know how many snapshots have metadata.

* include/libvirt/libvirt.h.in (VIR_DOMAIN_SNAPSHOT_NUM_METADATA):
New flag.
* src/libvirt.c (virDomainSnapshotNum): Document it.
* src/esx/esx_driver.c (esxDomainSnapshotNum): Implement it.
* src/vbox/vbox_tmpl.c (vboxDomainSnapshotNum): Likewise.
* src/qemu/qemu_driver.c (qemuDomainSnapshotNum): Likewise.
---
 include/libvirt/libvirt.h.in |    4 ++++
 src/esx/esx_driver.c         |    6 +++++-
 src/libvirt.c                |   11 ++++++++---
 src/qemu/qemu_driver.c       |    6 +++++-
 src/vbox/vbox_tmpl.c         |    8 +++++++-
 5 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index eae0a10..c672145 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -2551,6 +2551,10 @@ virDomainSnapshotPtr virDomainSnapshotCreateXML(virDomainPtr domain,
 char *virDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
                                   unsigned int flags);

+typedef enum {
+    VIR_DOMAIN_SNAPSHOT_NUM_METADATA = (1 << 0), /* Snapshots which have metadata */
+} virDomainSnapshotNumFlags;
+
 /* Return the number of snapshots for this domain */
 int virDomainSnapshotNum(virDomainPtr domain, unsigned int flags);

diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index beeafbd..837b774 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -4329,12 +4329,16 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
     esxPrivate *priv = domain->conn->privateData;
     esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;

-    virCheckFlags(0, -1);
+    virCheckFlags(VIR_DOMAIN_SNAPSHOT_NUM_METADATA, -1);

     if (esxVI_EnsureSession(priv->primary) < 0) {
         return -1;
     }

+    /* ESX snapshots do not require libvirt to maintain any metadata.  */
+    if (flags & VIR_DOMAIN_SNAPSHOT_NUM_METADATA)
+        return 0;
+
     if (esxVI_LookupRootSnapshotTreeList(priv->primary, domain->uuid,
                                          &rootSnapshotTreeList) < 0) {
         return -1;
diff --git a/src/libvirt.c b/src/libvirt.c
index 8ee9e96..3e031b6 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -15526,11 +15526,16 @@ error:
 /**
  * virDomainSnapshotNum:
  * @domain: a domain object
- * @flags: unused flag parameters; callers should pass 0
+ * @flags: bitwise-or of supported virDomainSnapshotNumFlags
+ *
+ * Provides the number of domain snapshots for this domain.
  *
- * Provides the number of domain snapshots for this domain..
+ * If @flags includes VIR_DOMAIN_SNAPSHOT_NUM_METADATA, then the result is
+ * the number of snapshots that also include metadata that would prevent
+ * the removal of the last reference to a domain; this value will either
+ * be 0 or the same value as if @flags had been 0.
  *
- * Returns the number of domain snapshost found or -1 in case of error.
+ * Returns the number of domain snapshots found or -1 in case of error.
  */
 int
 virDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c5b3965..ffea714 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8577,7 +8577,7 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
     virDomainObjPtr vm = NULL;
     int n = -1;

-    virCheckFlags(0, -1);
+    virCheckFlags(VIR_DOMAIN_SNAPSHOT_NUM_METADATA, -1);

     qemuDriverLock(driver);
     vm = virDomainFindByUUID(&driver->domains, domain->uuid);
@@ -8589,6 +8589,10 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
         goto cleanup;
     }

+    /* All qemu snapshots have libvirt metadata, so
+     * VIR_DOMAIN_SNAPSHOT_NUM_METADATA makes no difference to our
+     * answer.  */
+
     n = virDomainSnapshotObjListNum(&vm->snapshots);

 cleanup:
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 8de2bae..fa19aaa 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -5861,7 +5861,7 @@ vboxDomainSnapshotNum(virDomainPtr dom,
     nsresult rc;
     PRUint32 snapshotCount;

-    virCheckFlags(0, -1);
+    virCheckFlags(VIR_DOMAIN_SNAPSHOT_NUM_METADATA, -1);

     vboxIIDFromUUID(&iid, dom->uuid);
     rc = VBOX_OBJECT_GET_MACHINE(iid.value, &machine);
@@ -5871,6 +5871,12 @@ vboxDomainSnapshotNum(virDomainPtr dom,
         goto cleanup;
     }

+    /* VBox snapshots do not require libvirt to maintain any metadata.  */
+    if (flags & VIR_DOMAIN_SNAPSHOT_NUM_METADATA) {
+        ret = 0;
+        goto cleanup;
+    }
+
     rc = machine->vtbl->GetSnapshotCount(machine, &snapshotCount);
     if (NS_FAILED(rc)) {
         vboxError(VIR_ERR_INTERNAL_ERROR,
-- 
1.7.4.4




More information about the libvir-list mailing list