This new element will hold the new disk overlay created when reverting
to non-leaf snapshot in order to remember the files libvirt created.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/conf/schemas/domainsnapshot.rng | 7 +++++++
src/conf/snapshot_conf.c | 30 +++++++++++++++++++++++++++++
src/conf/snapshot_conf.h | 5 +++++
3 files changed, 42 insertions(+)
diff --git a/src/conf/schemas/domainsnapshot.rng b/src/conf/schemas/domainsnapshot.rng
index 45f01b96cd..2549c47b22 100644
--- a/src/conf/schemas/domainsnapshot.rng
+++ b/src/conf/schemas/domainsnapshot.rng
@@ -60,6 +60,13 @@
</zeroOrMore>
</element>
</optional>
+ <optional>
+ <element name="revertDisks">
+ <zeroOrMore>
+ <ref name="disksnapshot"/>
+ </zeroOrMore>
+ </element>
+ </optional>
<optional>
<element name="active">
<choice>
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index ac5aba1753..8ecf311a17 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -112,6 +112,9 @@ virDomainSnapshotDefDispose(void *obj)
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);
}
@@ -376,6 +379,22 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt,
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;
@@ -834,6 +853,17 @@ virDomainSnapshotDefFormatInternal(virBuffer *buf,
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)
diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
index ad49990a1e..ab76af604a 100644
--- a/src/conf/snapshot_conf.h
+++ b/src/conf/snapshot_conf.h
@@ -80,6 +80,11 @@ struct _virDomainSnapshotDef {
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;
};
--
2.41.0