]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: snapshot: Change 'data-file' to read-only after snapshot
authorPeter Krempa <pkrempa@redhat.com>
Tue, 26 Nov 2024 09:23:23 +0000 (10:23 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 28 Nov 2024 09:27:56 +0000 (10:27 +0100)
For the reason outlined in previous commit qemu doesn't do this
automatically. Handle it manually after the snapshot.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_snapshot.c

index 5b3aadcbf01691683aa51d9da68eadd6594f965c..18b2e478f6457dbfa3611a3eba59aa4962063f22 100644 (file)
@@ -1434,12 +1434,14 @@ qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk,
  * qemuSnapshotDiskUpdateSource:
  * @vm: domain object
  * @dd: snapshot disk data object
+ * @asyncJob: async job type
  *
  * Updates disk definition after a successful snapshot.
  */
 static void
 qemuSnapshotDiskUpdateSource(virDomainObj *vm,
-                             qemuSnapshotDiskData *dd)
+                             qemuSnapshotDiskData *dd,
+                             virDomainAsyncJob asyncJob)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     virQEMUDriver *driver = priv->driver;
@@ -1451,6 +1453,11 @@ qemuSnapshotDiskUpdateSource(virDomainObj *vm,
     if (qemuSecurityMoveImageMetadata(driver, vm, dd->disk->src, dd->src) < 0)
         VIR_WARN("Unable to move disk metadata on vm %s", vm->def->name);
 
+    /* if the original image has a data-file turn it read-only */
+    if (dd->disk->src->dataFileStore) {
+        ignore_value(qemuBlockReopenReadOnly(vm, dd->disk->src->dataFileStore, asyncJob));
+    }
+
     /* unlock the write lock on the original image as qemu will no longer write to it */
     virDomainLockImageDetach(driver->lockManager, vm, dd->disk->src);
 
@@ -1498,7 +1505,7 @@ qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt)
         virDomainAuditDisk(snapctxt->vm, dd->disk->src, dd->src, "snapshot", rc >= 0);
 
         if (rc == 0)
-            qemuSnapshotDiskUpdateSource(snapctxt->vm, dd);
+            qemuSnapshotDiskUpdateSource(snapctxt->vm, dd, snapctxt->asyncJob);
     }
 
     if (rc < 0)