for (i = 0; i < def->ndisks; i++)
virDomainSnapshotDiskDefClear(&def->disks[i]);
g_free(def->disks);
+ for (i = 0; i < def->nrevertdisks; i++)
+ virDomainSnapshotDiskDefClear(&def->revertdisks[i]);
+ g_free(def->revertdisks);
virObjectUnref(def->cookie);
}
return NULL;
}
+ if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE) {
+ g_autofree xmlNodePtr *revertDiskNodes = NULL;
+
+ if ((n = virXPathNodeSet("./revertDisks/*", ctxt, &revertDiskNodes)) < 0)
+ return NULL;
+ if (n)
+ def->revertdisks = g_new0(virDomainSnapshotDiskDef, n);
+ def->nrevertdisks = n;
+ for (i = 0; i < def->nrevertdisks; i++) {
+ if (virDomainSnapshotDiskDefParseXML(revertDiskNodes[i], ctxt,
+ &def->revertdisks[i],
+ flags, xmlopt) < 0)
+ return NULL;
+ }
+ }
+
if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL) {
int active;
virBufferAddLit(buf, "</disks>\n");
}
+ if (def->nrevertdisks > 0) {
+ g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+
+ for (i = 0; i < def->nrevertdisks; i++) {
+ if (virDomainSnapshotDiskDefFormat(&childBuf, &def->revertdisks[i], xmlopt) < 0)
+ return -1;
+ }
+
+ virXMLFormatElement(buf, "revertDisks", NULL, &childBuf);
+ }
+
if (def->parent.dom) {
if (virDomainDefFormatInternal(def->parent.dom, xmlopt,
buf, domainflags) < 0)
size_t ndisks; /* should not exceed dom->ndisks */
virDomainSnapshotDiskDef *disks;
+ /* When we revert to non-leaf snapshot we need to
+ * store the new overlay disks. */
+ size_t nrevertdisks;
+ virDomainSnapshotDiskDef *revertdisks;
+
virObject *cookie;
};