1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

snapshot: identify qemu snapshot roots

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.
This commit is contained in:
Eric Blake 2011-08-13 11:18:44 -06:00
parent 22a833e789
commit 6b3801b042
3 changed files with 36 additions and 18 deletions

View File

@ -11579,6 +11579,7 @@ struct virDomainSnapshotNameData {
int numnames;
int maxnames;
char **const names;
unsigned int flags;
};
static void virDomainSnapshotObjListCopyNames(void *payload,
@ -11590,6 +11591,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)))
@ -11600,9 +11603,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);
@ -11619,22 +11623,31 @@ cleanup:
return -1;
}
static void virDomainSnapshotObjListCount(void *payload ATTRIBUTE_UNUSED,
const void *name ATTRIBUTE_UNUSED,
void *data)
{
int *count = data;
struct virDomainSnapshotNumData {
int count;
unsigned int flags;
};
(*count)++;
static void virDomainSnapshotObjListCount(void *payload,
const void *name ATTRIBUTE_UNUSED,
void *opaque)
{
virDomainSnapshotObjPtr obj = payload;
struct virDomainSnapshotNumData *data = opaque;
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;
}
virDomainSnapshotObjPtr

View File

@ -1418,8 +1418,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,

View File

@ -8712,7 +8712,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);
@ -8724,7 +8725,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)
@ -8740,7 +8742,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);
@ -8756,7 +8759,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)