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