On Sat, Sep 24, 2011 at 06:30:02PM -0600, Eric Blake wrote:
Although a client can already obtain a snapshot's parent by
dumping and parsing the xml, then doing a snapshot lookup by
name, it is more efficient to get the parent in one step, which
in turn will make operations that must traverse a snapshot
hierarchy easier to perform.
* include/libvirt/libvirt.h.in (virDomainSnapshotGetParent):
Declare.
* src/libvirt.c (virDomainSnapshotGetParent): New function.
* src/libvirt_public.syms: Export it.
* src/driver.h (virDrvDomainSnapshotGetParent): New callback.
---
include/libvirt/libvirt.h.in | 4 +++
src/driver.h | 5 ++++
src/libvirt.c | 44 ++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 ++++
4 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 39155a6..afeb83f 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -2711,6 +2711,10 @@ int virDomainHasCurrentSnapshot(virDomainPtr domain, unsigned int
flags);
virDomainSnapshotPtr virDomainSnapshotCurrent(virDomainPtr domain,
unsigned int flags);
+/* Get a handle to the parent snapshot, if one exists */
+virDomainSnapshotPtr virDomainSnapshotGetParent(virDomainSnapshotPtr snapshot,
+ unsigned int flags);
+
typedef enum {
VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING = 1 << 0, /* Run after revert */
VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED = 1 << 1, /* Pause after revert */
diff --git a/src/driver.h b/src/driver.h
index 3792003..7dcab8f 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -590,6 +590,10 @@ typedef int
(*virDrvDomainHasCurrentSnapshot)(virDomainPtr domain, unsigned int flags);
typedef virDomainSnapshotPtr
+ (*virDrvDomainSnapshotGetParent)(virDomainSnapshotPtr snapshot,
+ unsigned int flags);
+
+typedef virDomainSnapshotPtr
(*virDrvDomainSnapshotCurrent)(virDomainPtr domain,
unsigned int flags);
@@ -854,6 +858,7 @@ struct _virDriver {
virDrvDomainSnapshotListNames domainSnapshotListNames;
virDrvDomainSnapshotLookupByName domainSnapshotLookupByName;
virDrvDomainHasCurrentSnapshot domainHasCurrentSnapshot;
+ virDrvDomainSnapshotGetParent domainSnapshotGetParent;
virDrvDomainSnapshotCurrent domainSnapshotCurrent;
virDrvDomainRevertToSnapshot domainRevertToSnapshot;
virDrvDomainSnapshotDelete domainSnapshotDelete;
diff --git a/src/libvirt.c b/src/libvirt.c
index 8f94b11..38fcfbc 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -16150,6 +16150,50 @@ error:
}
/**
+ * virDomainSnapshotGetParent:
+ * @snapshot: a snapshot object
+ * @flags: unused flag parameters; callers should pass 0
+ *
+ * Get the parent snapshot for @snapshot, if any.
+ *
+ * Returns a domain snapshot object or NULL in case of failure. If the
+ * given snapshot is a root (no parent), then the VIR_ERR_NO_DOMAIN_SNAPSHOT
+ * error is raised.
+ */
+virDomainSnapshotPtr
+virDomainSnapshotGetParent(virDomainSnapshotPtr snapshot,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DEBUG("snapshot=%p, flags=%x", snapshot, flags);
+
+ virResetLastError();
+
+ if (!VIR_IS_DOMAIN_SNAPSHOT(snapshot)) {
+ virLibDomainSnapshotError(VIR_ERR_INVALID_DOMAIN_SNAPSHOT,
+ __FUNCTION__);
+ virDispatchError(NULL);
+ return NULL;
+ }
+
+ conn = snapshot->domain->conn;
+
+ if (conn->driver->domainSnapshotGetParent) {
+ virDomainSnapshotPtr snap;
+ snap = conn->driver->domainSnapshotGetParent(snapshot, flags);
+ if (!snap)
+ goto error;
+ return snap;
+ }
+
+ virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ virDispatchError(conn);
+ return NULL;
+}
+
+/**
* virDomainRevertToSnapshot:
* @snapshot: a domain snapshot object
* @flags: bitwise-OR of virDomainSnapshotRevertFlags
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 8a6d55a..cef14f0 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -489,4 +489,9 @@ LIBVIRT_0.9.5 {
virDomainSnapshotGetName;
} LIBVIRT_0.9.4;
+LIBVIRT_0.9.7 {
+ global:
+ virDomainSnapshotGetParent;
+} LIBVIRT_0.9.5;
+
# .... define new API here using predicted next version number ....
--
1.7.4.4
ACK, interface and intent looks fine !
I have seen another patch today touching the libvirt_public.syms
though, tweaking may be needed by someone :-)
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/