Filtering for roots is pretty easy to do.
* src/conf/domain_conf.h (virDomainSnapshotObjListGetNames)
(virDomainSnapshotObjListNum): Update prototype.
* src/conf/domain_conf.c (virDomainSnapshotObjListCopyNames)
(virDomainSnapshotObjListGetNames, virDomainSnapshotObjListCount)
(virDomainSnapshotObjListNum): Support filtering.
* src/qemu/qemu_driver.c (qemuDomainSnapshotNum)
(qemuDomainSnapshotListNames): Update callers.
---
src/conf/domain_conf.c | 34 ++++++++++++++++++++++++----------
src/conf/domain_conf.h | 6 ++++--
src/qemu/qemu_driver.c | 11 +++++++----
3 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f1b0aca..4bf3541 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11169,6 +11169,7 @@ struct virDomainSnapshotNameData {
int numnames;
int maxnames;
char **const names;
+ unsigned int flags;
};
static void virDomainSnapshotObjListCopyNames(void *payload,
@@ -11180,6 +11181,8 @@ static void virDomainSnapshotObjListCopyNames(void *payload,
if (data->oom)
return;
+ if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) &&
!obj->def->parent)
+ return;
if (data->numnames < data->maxnames) {
if (!(data->names[data->numnames] = strdup(obj->def->name)))
@@ -11190,9 +11193,10 @@ static void virDomainSnapshotObjListCopyNames(void *payload,
}
int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
- char **const names, int maxnames)
+ char **const names, int maxnames,
+ unsigned int flags)
{
- struct virDomainSnapshotNameData data = { 0, 0, maxnames, names };
+ struct virDomainSnapshotNameData data = { 0, 0, maxnames, names, flags };
int i;
virHashForEach(snapshots->objs, virDomainSnapshotObjListCopyNames, &data);
@@ -11209,22 +11213,32 @@ cleanup:
return -1;
}
-static void virDomainSnapshotObjListCount(void *payload ATTRIBUTE_UNUSED,
+struct virDomainSnapshotNumData {
+ int count;
+ unsigned int flags;
+};
+
+static void virDomainSnapshotObjListCount(void *payload,
const void *name ATTRIBUTE_UNUSED,
- void *data)
+ void *opaque)
{
- int *count = data;
+ virDomainSnapshotObjPtr obj = payload;
+ struct virDomainSnapshotNumData *data = opaque;
- (*count)++;
+ if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) &&
+ !obj->def->parent)
+ return;
+ data->count++;
}
-int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots)
+int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots,
+ unsigned int flags)
{
- int count = 0;
+ struct virDomainSnapshotNumData data = { 0, flags };
- virHashForEach(snapshots->objs, virDomainSnapshotObjListCount, &count);
+ virHashForEach(snapshots->objs, virDomainSnapshotObjListCount, &data);
- return count;
+ return data.count;
}
static int virDomainSnapshotObjListSearchName(const void *payload,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 5f752ec..503fb58 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1335,8 +1335,10 @@ virDomainSnapshotObjPtr
virDomainSnapshotAssignDef(virDomainSnapshotObjListPtr s
int virDomainSnapshotObjListInit(virDomainSnapshotObjListPtr objs);
int virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
- char **const names, int maxnames);
-int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots);
+ char **const names, int maxnames,
+ unsigned int flags);
+int virDomainSnapshotObjListNum(virDomainSnapshotObjListPtr snapshots,
+ unsigned int flags);
virDomainSnapshotObjPtr virDomainSnapshotFindByName(const virDomainSnapshotObjListPtr
snapshots,
const char *name);
void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3e6d653..e435a2f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8536,7 +8536,8 @@ static int qemuDomainSnapshotListNames(virDomainPtr domain, char
**names,
virDomainObjPtr vm = NULL;
int n = -1;
- virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+ virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
+ VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, domain->uuid);
@@ -8548,7 +8549,8 @@ static int qemuDomainSnapshotListNames(virDomainPtr domain, char
**names,
goto cleanup;
}
- n = virDomainSnapshotObjListGetNames(&vm->snapshots, names, nameslen);
+ n = virDomainSnapshotObjListGetNames(&vm->snapshots, names, nameslen,
+ flags);
cleanup:
if (vm)
@@ -8564,7 +8566,8 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
virDomainObjPtr vm = NULL;
int n = -1;
- virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+ virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
+ VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, domain->uuid);
@@ -8580,7 +8583,7 @@ static int qemuDomainSnapshotNum(virDomainPtr domain,
* VIR_DOMAIN_SNAPSHOT_LIST_METADATA makes no difference to our
* answer. */
- n = virDomainSnapshotObjListNum(&vm->snapshots);
+ n = virDomainSnapshotObjListNum(&vm->snapshots, flags);
cleanup:
if (vm)
--
1.7.4.4