snapshot->parent = NULL;
snapshot->sibling = NULL;
}
+
+
+/* Take all children of @from and convert them into children of @to. */
+void
+virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from,
+ virDomainSnapshotObjPtr to)
+{
+ virDomainSnapshotObjPtr child;
+ virDomainSnapshotObjPtr last;
+
+ if (!from->first_child)
+ return;
+ for (child = from->first_child; child; child = child->sibling) {
+ child->parent = to;
+ if (!child->sibling)
+ last = child;
+ }
+ to->nchildren += from->nchildren;
+ last->sibling = to->first_child;
+ to->first_child = from->first_child;
+ from->nchildren = 0;
+ from->first_child = NULL;
+}
virHashIterator iter,
void *data);
void virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot);
+void virDomainSnapshotMoveChildren(virDomainSnapshotObjPtr from,
+ virDomainSnapshotObjPtr to);
#endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */
virDomainSnapshotDropParent;
virDomainSnapshotForEachChild;
virDomainSnapshotForEachDescendant;
+virDomainSnapshotMoveChildren;
# conf/virdomainsnapshotobjlist.h
virCapsPtr caps;
virDomainXMLOptionPtr xmlopt;
int err;
- virDomainSnapshotObjPtr last;
};
return 0;
VIR_FREE(snap->def->parent);
- snap->parent = rep->parent;
if (rep->parent->def &&
VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) {
return 0;
}
- if (!snap->sibling)
- rep->last = snap;
-
rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap,
rep->caps, rep->xmlopt,
rep->cfg->snapshotDir);
rep.parent = snap->parent;
rep.vm = vm;
rep.err = 0;
- rep.last = NULL;
rep.caps = driver->caps;
rep.xmlopt = driver->xmlopt;
virDomainSnapshotForEachChild(snap,
&rep);
if (rep.err < 0)
goto endjob;
- /* Can't modify siblings during ForEachChild, so do it now. */
- snap->parent->nchildren += snap->nchildren;
- rep.last->sibling = snap->parent->first_child;
- snap->parent->first_child = snap->first_child;
+ virDomainSnapshotMoveChildren(snap, snap->parent);
}
if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) {
virDomainSnapshotObjPtr parent;
virDomainObjPtr vm;
int err;
- virDomainSnapshotObjPtr last;
};
static int
return 0;
VIR_FREE(snap->def->parent);
- snap->parent = rep->parent;
if (rep->parent->def &&
VIR_STRDUP(snap->def->parent, rep->parent->def->name) < 0) {
return 0;
}
- if (!snap->sibling)
- rep->last = snap;
return 0;
}
rep.parent = snap->parent;
rep.vm = vm;
rep.err = 0;
- rep.last = NULL;
virDomainSnapshotForEachChild(snap,
testDomainSnapshotReparentChildren,
&rep);
if (rep.err < 0)
goto cleanup;
- /* Can't modify siblings during ForEachChild, so do it now. */
- snap->parent->nchildren += snap->nchildren;
- rep.last->sibling = snap->parent->first_child;
- snap->parent->first_child = snap->first_child;
+ virDomainSnapshotMoveChildren(snap, snap->parent);
}
if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) {