virHashRemoveEntry(snapshots->objs, snapshot->def->name);
}
-struct snapshot_has_children {
- char *name;
+struct snapshot_act_on_child {
+ char *parent;
int number;
+ virHashIterator iter;
+ void *data;
};
-static void virDomainSnapshotCountChildren(void *payload,
- const void *name ATTRIBUTE_UNUSED,
- void *data)
+static void
+virDomainSnapshotActOnChild(void *payload,
+ const void *name,
+ void *data)
{
virDomainSnapshotObjPtr obj = payload;
- struct snapshot_has_children *curr = data;
+ struct snapshot_act_on_child *curr = data;
- if (obj->def->parent && STREQ(obj->def->parent, curr->name))
+ if (obj->def->parent && STREQ(curr->parent, obj->def->parent)) {
curr->number++;
+ if (curr->iter)
+ (curr->iter)(payload, name, curr->data);
+ }
}
-int virDomainSnapshotHasChildren(virDomainSnapshotObjPtr snap,
- virDomainSnapshotObjListPtr snapshots)
+/* Run iter(data) on all direct children of snapshot, while ignoring all
+ * other entries in snapshots. Return the number of children
+ * visited. No particular ordering is guaranteed. */
+int
+virDomainSnapshotForEachChild(virDomainSnapshotObjListPtr snapshots,
+ virDomainSnapshotObjPtr snapshot,
+ virHashIterator iter,
+ void *data)
{
- struct snapshot_has_children children;
+ struct snapshot_act_on_child act;
- children.name = snap->def->name;
- children.number = 0;
- virHashForEach(snapshots->objs, virDomainSnapshotCountChildren, &children);
+ act.parent = snapshot->def->name;
+ act.number = 0;
+ act.iter = iter;
+ act.data = data;
+ virHashForEach(snapshots->objs, virDomainSnapshotActOnChild, &act);
- return children.number;
+ return act.number;
+}
+
+int virDomainSnapshotHasChildren(virDomainSnapshotObjPtr snap,
+ virDomainSnapshotObjListPtr snapshots)
+{
+ return virDomainSnapshotForEachChild(snapshots, snap, NULL, NULL);
}
typedef enum {
virDomainSnapshotObjPtr snapshot);
int virDomainSnapshotHasChildren(virDomainSnapshotObjPtr snap,
virDomainSnapshotObjListPtr snapshots);
+int virDomainSnapshotForEachChild(virDomainSnapshotObjListPtr snapshots,
+ virDomainSnapshotObjPtr snapshot,
+ virHashIterator iter,
+ void *data);
int virDomainSnapshotForEachDescendant(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotObjPtr snapshot,
virHashIterator iter,
virDomainSnapshotDefFree;
virDomainSnapshotDefParseString;
virDomainSnapshotFindByName;
+virDomainSnapshotForEachChild;
virDomainSnapshotForEachDescendant;
virDomainSnapshotHasChildren;
virDomainSnapshotObjListGetNames;
struct snap_reparent {
struct qemud_driver *driver;
- virDomainSnapshotObjPtr snap;
+ const char *parent;
virDomainObjPtr vm;
int err;
};
return;
}
- if (snap->def->parent && STREQ(snap->def->parent, rep->snap->def->name)) {
- VIR_FREE(snap->def->parent);
+ VIR_FREE(snap->def->parent);
- if (rep->snap->def->parent != NULL) {
- snap->def->parent = strdup(rep->snap->def->parent);
+ if (rep->parent != NULL) {
+ snap->def->parent = strdup(rep->parent);
- if (snap->def->parent == NULL) {
- virReportOOMError();
- rep->err = -1;
- return;
- }
+ if (snap->def->parent == NULL) {
+ virReportOOMError();
+ rep->err = -1;
+ return;
}
-
- rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap,
- rep->driver->snapshotDir);
}
+
+ rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap,
+ rep->driver->snapshotDir);
}
static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
vm->current_snapshot = snap;
} else {
rep.driver = driver;
- rep.snap = snap;
+ rep.parent = snap->def->parent;
rep.vm = vm;
rep.err = 0;
- virHashForEach(vm->snapshots.objs, qemuDomainSnapshotReparentChildren,
- &rep);
+ virDomainSnapshotForEachChild(&vm->snapshots, snap,
+ qemuDomainSnapshotReparentChildren,
+ &rep);
if (rep.err < 0)
goto endjob;
}