[libvirt] [PATCH 1/5] snapshot: new virDomainSnapshotGetParent API

Daniel Veillard veillard at redhat.com
Wed Sep 28 13:10:45 UTC 2011


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 at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list