]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuDomainPrepareDiskSourceData: Setup 'detect_zeroes' for all layers
authorPeter Krempa <pkrempa@redhat.com>
Fri, 14 Nov 2025 15:05:06 +0000 (16:05 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 19 Nov 2025 07:34:13 +0000 (08:34 +0100)
While it may seem that zero detection is pointless for backing chain
layers other than the top one, which is usually the only one gettin
written to,  with block operations such as active-layer commit the
non-top layer may become active, in which case the VM wouldn't be
configured in accordance to the XML any more.

Similarly with snapshots a new image is introduced which would not get
zero detection enabled, but next start of the VM would enable it.

Fix this by propagating the zero detection setting for all layers.

This problem partially addresses one of the issues reported in
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1120389

Fixes: 8a78f88a1a6 and a522c3044bd (effectively reverts them)
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
src/qemu/qemu_domain.c
tests/qemublocktestdata/xml2json/file-backing_basic-detect.json
tests/qemublocktestdata/xml2json/file-backing_basic-unmap-detect.json
tests/qemublocktestdata/xml2json/file-backing_basic-unmap-ignore.json
tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args

index a42721efad3a7787a8706cec2dca0348164ca793..0ac9ae0658c48e0c1665882de0c5a7f617cda929 100644 (file)
@@ -9702,11 +9702,7 @@ qemuDomainPrepareDiskSourceData(virDomainDiskDef *disk,
     if (!disk)
         return;
 
-    /* transfer properties valid only for the top level image */
-    if (src == disk->src || src == disk->src->dataFileStore)
-        src->detect_zeroes = disk->detect_zeroes;
-
-    /* transfer properties valid for the full chain */
+    src->detect_zeroes = disk->detect_zeroes;
     src->iomode = disk->iomode;
     src->cachemode = disk->cachemode;
     src->discard = disk->discard;
index c27233269baf13d58879e1e7ce6c20f6612a187e..773b7b3a02c0709d2d5dea6cba2609aedd217067 100644 (file)
@@ -16,6 +16,7 @@
 {
   "node-name": "node-b-f",
   "read-only": true,
+  "detect-zeroes": "on",
   "driver": "qed",
   "file": "node-b-s",
   "backing": "node-c-f"
@@ -30,6 +31,7 @@
 {
   "node-name": "node-c-f",
   "read-only": true,
+  "detect-zeroes": "on",
   "driver": "vmdk",
   "file": "node-c-s",
   "backing": "node-d-f"
@@ -49,6 +51,7 @@
 {
   "node-name": "node-d-f",
   "read-only": true,
+  "detect-zeroes": "on",
   "driver": "raw",
   "file": "node-d-s"
 }
index 1ec0b8fffc472323b346c7c74a378cdd5bbe3a26..70faaa81defeacd9a21c618e8738314b833f49be 100644 (file)
@@ -18,6 +18,7 @@
   "node-name": "node-b-f",
   "read-only": true,
   "discard": "unmap",
+  "detect-zeroes": "unmap",
   "driver": "qed",
   "file": "node-b-s",
   "backing": "node-c-f"
@@ -33,6 +34,7 @@
   "node-name": "node-c-f",
   "read-only": true,
   "discard": "unmap",
+  "detect-zeroes": "unmap",
   "driver": "vmdk",
   "file": "node-c-s",
   "backing": "node-d-f"
@@ -53,6 +55,7 @@
   "node-name": "node-d-f",
   "read-only": true,
   "discard": "unmap",
+  "detect-zeroes": "unmap",
   "driver": "raw",
   "file": "node-d-s"
 }
index 315a17323a100fa7c5e2a063e2bf0fb3b7e9395e..4bb964aaa4e8d232fe7e6c4c926cf4bc6d2bfbfc 100644 (file)
@@ -18,6 +18,7 @@
   "node-name": "node-b-f",
   "read-only": true,
   "discard": "ignore",
+  "detect-zeroes": "on",
   "driver": "qed",
   "file": "node-b-s",
   "backing": "node-c-f"
@@ -33,6 +34,7 @@
   "node-name": "node-c-f",
   "read-only": true,
   "discard": "ignore",
+  "detect-zeroes": "on",
   "driver": "vmdk",
   "file": "node-c-s",
   "backing": "node-d-f"
@@ -53,6 +55,7 @@
   "node-name": "node-d-f",
   "read-only": true,
   "discard": "ignore",
+  "detect-zeroes": "on",
   "driver": "raw",
   "file": "node-d-s"
 }
index d959d4a717f70e28cd0596f45abdc51fcad36b37..6284c082b1d592dcc5ee445b58fc5acdcccf0791 100644 (file)
@@ -28,17 +28,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-test/.config \
 -boot menu=on,strict=on \
 -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-unmap-back.img","node-name":"libvirt-7-storage","auto-read-only":true,"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-7-format","read-only":true,"discard":"unmap","driver":"qcow2","file":"libvirt-7-storage","backing":null}' \
+-blockdev '{"node-name":"libvirt-7-format","read-only":true,"discard":"unmap","detect-zeroes":"unmap","driver":"qcow2","file":"libvirt-7-storage","backing":null}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-unmap.img","node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-6-format","read-only":false,"discard":"unmap","detect-zeroes":"unmap","driver":"qcow2","file":"libvirt-6-storage","backing":"libvirt-7-format"}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x4","drive":"libvirt-6-format","id":"virtio-disk0","bootindex":2}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-on-back.img","node-name":"libvirt-5-storage","auto-read-only":true,"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-5-format","read-only":true,"discard":"unmap","driver":"qcow2","file":"libvirt-5-storage","backing":null}' \
+-blockdev '{"node-name":"libvirt-5-format","read-only":true,"discard":"unmap","detect-zeroes":"on","driver":"qcow2","file":"libvirt-5-storage","backing":null}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-on.img","node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-4-format","read-only":false,"discard":"unmap","detect-zeroes":"on","driver":"qcow2","file":"libvirt-4-storage","backing":"libvirt-5-format"}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x5","drive":"libvirt-4-format","id":"virtio-disk1"}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-off-back.img","node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-3-format","read-only":true,"discard":"unmap","driver":"qcow2","file":"libvirt-3-storage","backing":null}' \
+-blockdev '{"node-name":"libvirt-3-format","read-only":true,"discard":"unmap","detect-zeroes":"off","driver":"qcow2","file":"libvirt-3-storage","backing":null}' \
 -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/detect-zeroes-off.img","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-2-format","read-only":false,"discard":"unmap","detect-zeroes":"off","driver":"qcow2","file":"libvirt-2-storage","backing":"libvirt-3-format"}' \
 -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x6","drive":"libvirt-2-format","id":"virtio-disk2"}' \