[libvirt] [PATCH 3/3] snapshot: implement LIST_LEAVES flag in esx
Daniel Veillard
veillard at redhat.com
Wed Oct 12 14:24:52 UTC 2011
On Fri, Oct 07, 2011 at 08:37:05PM -0600, Eric Blake wrote:
> Relatively straight-forward filtering.
>
> * src/esx/esx_vi.h (esxVI_GetNumberOfSnapshotTrees)
> (esxVI_GetSnapshotTreeNames): Add parameter.
> * src/esx/esx_vi.c (esxVI_GetNumberOfSnapshotTrees)
> (esxVI_GetSnapshotTreeNames): Allow leaf filtering.
> * src/esx/esx_driver.c (esxDomainSnapshotNum)
> (esxDomainSnapshotListNames, esxDomainSnapshotNumChildren)
> (esxDomainSnapshotListChildrenNames): Pass new flag through.
> ---
> src/esx/esx_driver.c | 29 +++++++++++++++++++++--------
> src/esx/esx_vi.c | 27 ++++++++++++++++-----------
> src/esx/esx_vi.h | 4 ++--
> 3 files changed, 39 insertions(+), 21 deletions(-)
>
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index bcf2406..f2a8f64 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -4359,11 +4359,14 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
> esxPrivate *priv = domain->conn->privateData;
> esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
> bool recurse;
> + bool leaves;
>
> virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
> - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> + VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
>
> recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
> + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
>
> if (esxVI_EnsureSession(priv->primary) < 0) {
> return -1;
> @@ -4378,7 +4381,8 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
> return -1;
> }
>
> - count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse);
> + count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse,
> + leaves);
>
> esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
>
> @@ -4395,11 +4399,14 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen,
> esxPrivate *priv = domain->conn->privateData;
> esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
> bool recurse;
> + bool leaves;
>
> virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
> - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> + VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
>
> recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
> + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
>
> if (names == NULL || nameslen < 0) {
> ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument"));
> @@ -4420,7 +4427,7 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen,
> }
>
> result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen,
> - recurse);
> + recurse, leaves);
>
> esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
>
> @@ -4437,11 +4444,14 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags)
> esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
> esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL;
> bool recurse;
> + bool leaves;
>
> virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS |
> - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> + VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
>
> recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0;
> + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
>
> if (esxVI_EnsureSession(priv->primary) < 0) {
> return -1;
> @@ -4462,7 +4472,7 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags)
> }
>
> count = esxVI_GetNumberOfSnapshotTrees(snapshotTree->childSnapshotList,
> - recurse);
> + recurse, leaves);
>
> cleanup:
> esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> @@ -4482,11 +4492,14 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
> esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
> esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL;
> bool recurse;
> + bool leaves;
>
> virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS |
> - VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> + VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> + VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
>
> recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0;
> + leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
>
> if (names == NULL || nameslen < 0) {
> ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument"));
> @@ -4516,7 +4529,7 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
> }
>
> result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
> - names, nameslen, recurse);
> + names, nameslen, recurse, leaves);
>
> cleanup:
> esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
> index 4a8c709..55a388a 100644
> --- a/src/esx/esx_vi.c
> +++ b/src/esx/esx_vi.c
> @@ -2164,17 +2164,19 @@ esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
>
> int
> esxVI_GetNumberOfSnapshotTrees
> - (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse)
> + (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse,
> + bool leaves)
> {
> int count = 0;
> esxVI_VirtualMachineSnapshotTree *snapshotTree;
>
> for (snapshotTree = snapshotTreeList; snapshotTree != NULL;
> snapshotTree = snapshotTree->_next) {
> - count++;
> + if (!(leaves && snapshotTree->childSnapshotList))
> + count++;
> if (recurse)
> count += esxVI_GetNumberOfSnapshotTrees
> - (snapshotTree->childSnapshotList, true);
> + (snapshotTree->childSnapshotList, true, leaves);
> }
>
> return count;
> @@ -2184,7 +2186,8 @@ esxVI_GetNumberOfSnapshotTrees
>
> int
> esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> - char **names, int nameslen, bool recurse)
> + char **names, int nameslen, bool recurse,
> + bool leaves)
> {
> int count = 0;
> int result;
> @@ -2194,14 +2197,16 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> for (snapshotTree = snapshotTreeList;
> snapshotTree != NULL && count < nameslen;
> snapshotTree = snapshotTree->_next) {
> - names[count] = strdup(snapshotTree->name);
> + if (!(leaves && snapshotTree->childSnapshotList)) {
> + names[count] = strdup(snapshotTree->name);
>
> - if (names[count] == NULL) {
> - virReportOOMError();
> - goto failure;
> - }
> + if (names[count] == NULL) {
> + virReportOOMError();
> + goto failure;
> + }
>
> - count++;
> + count++;
> + }
>
> if (count >= nameslen) {
> break;
> @@ -2211,7 +2216,7 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
> names + count,
> nameslen - count,
> - true);
> + true, leaves);
>
> if (result < 0) {
> goto failure;
> diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
> index 05ed3d0..b8e921f 100644
> --- a/src/esx/esx_vi.h
> +++ b/src/esx/esx_vi.h
> @@ -359,11 +359,11 @@ int esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
>
> int esxVI_GetNumberOfSnapshotTrees
> (esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> - bool recurse);
> + bool recurse, bool leaves);
>
> int esxVI_GetSnapshotTreeNames
> (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, char **names,
> - int nameslen, bool recurse);
> + int nameslen, bool recurse, bool leaves);
>
> int esxVI_GetSnapshotTreeByName
> (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, const char *name,
ACK looks fine but it may be better if Matthias could have a look :-)
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