From 3817fa10c4ad9888798ac653d73166d8435bf45c Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 11 Apr 2018 15:35:02 +0200 Subject: [PATCH] storage: Properly track that backing chain members are readonly Everything besides the top of the chain is readonly. Track this when parsing the XML and detecting the chain from the disk. Also fix the state when taking snapshots. All other cases where the top image is changed already preserve the readonly state from the original image. Signed-off-by: Peter Krempa Reviewed-by: John Ferlan --- src/conf/domain_conf.c | 3 +++ src/qemu/qemu_driver.c | 3 +++ src/util/virstoragefile.c | 1 + 3 files changed, 7 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4e2de46d45..f678e26b28 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8735,6 +8735,9 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt, if (VIR_ALLOC(backingStore) < 0) goto cleanup; + /* backing store is always read-only */ + backingStore->readonly = true; + /* terminator does not have a type */ if (!(type = virXMLPropString(ctxt->node, "type"))) { VIR_STEAL_PTR(src->backingStore, backingStore); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 83fc191085..c129321a5c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14680,6 +14680,9 @@ qemuDomainSnapshotUpdateDiskSources(qemuDomainSnapshotDiskDataPtr dd, if (dd->initialized) virStorageFileDeinit(dd->src); + /* the old disk image is now readonly */ + dd->disk->src->readonly = true; + VIR_STEAL_PTR(dd->disk->src->relPath, dd->relPath); VIR_STEAL_PTR(dd->src->backingStore, dd->disk->src); VIR_STEAL_PTR(dd->disk->src, dd->src); diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 185427f19c..b10a40e545 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -3425,6 +3425,7 @@ virStorageSourceNewFromBacking(virStorageSourcePtr parent) if (virStorageSourceInitChainElement(ret, parent, true) < 0) goto error; + ret->readonly = true; ret->detected = true; }