[PATCH 0/2] Fix detect_zeroes setup in qemu and improve tests
See 2/2 for explanation. Peter Krempa (2): qemuxmlconftest: Improve coverage of 'disk-detect-zeroes' test case qemuDomainPrepareDiskSourceData: Setup 'detect_zeroes' for all layers src/qemu/qemu_domain.c | 6 +--- .../xml2json/file-backing_basic-detect.json | 3 ++ .../file-backing_basic-unmap-detect.json | 3 ++ .../file-backing_basic-unmap-ignore.json | 3 ++ .../disk-detect-zeroes.x86_64-latest.args | 20 +++++++++--- tests/qemuxmlconfdata/disk-detect-zeroes.xml | 31 +++++++++++++++++-- 6 files changed, 55 insertions(+), 11 deletions(-) -- 2.51.1
From: Peter Krempa <pkrempa@redhat.com> Add test cases for all three options 'off'/'on'/'unmap' as well as add backing store for each image to show how the configuration behaves. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- .../disk-detect-zeroes.x86_64-latest.args | 20 +++++++++--- tests/qemuxmlconfdata/disk-detect-zeroes.xml | 31 +++++++++++++++++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args b/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args index 07acc46113..d959d4a717 100644 --- a/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args +++ b/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args @@ -27,10 +27,22 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-test/.config \ -no-shutdown \ -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/f14.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":"unmap","driver":"qcow2","file":"libvirt-2-storage"}' \ --device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x4","drive":"libvirt-2-format","id":"virtio-disk0","bootindex":2}' \ --blockdev '{"driver":"file","filename":"/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso","node-name":"libvirt-1-storage","read-only":true,"discard":"ignore","detect-zeroes":"on"}' \ +-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 '{"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 '{"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 '{"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"}' \ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/detect-zeroes-cdrom.iso","node-name":"libvirt-1-storage","read-only":true,"discard":"ignore","detect-zeroes":"on"}' \ -device '{"driver":"ide-cd","bus":"ide.1","unit":0,"drive":"libvirt-1-storage","id":"ide0-1-0","bootindex":1}' \ -audiodev '{"id":"audio1","driver":"none"}' \ -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ diff --git a/tests/qemuxmlconfdata/disk-detect-zeroes.xml b/tests/qemuxmlconfdata/disk-detect-zeroes.xml index ca3732c391..3ea15c3a46 100644 --- a/tests/qemuxmlconfdata/disk-detect-zeroes.xml +++ b/tests/qemuxmlconfdata/disk-detect-zeroes.xml @@ -21,13 +21,40 @@ <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' discard='unmap' detect_zeroes='unmap'/> - <source file='/var/lib/libvirt/images/f14.img'/> + <source file='/var/lib/libvirt/images/detect-zeroes-unmap.img'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/detect-zeroes-unmap-back.img'/> + <backingStore/> + </backingStore> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' discard='unmap' detect_zeroes='on'/> + <source file='/var/lib/libvirt/images/detect-zeroes-on.img'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/detect-zeroes-on-back.img'/> + <backingStore/> + </backingStore> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' discard='unmap' detect_zeroes='off'/> + <source file='/var/lib/libvirt/images/detect-zeroes-off.img'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/detect-zeroes-off-back.img'/> + <backingStore/> + </backingStore> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw' discard='ignore' detect_zeroes='unmap'/> - <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> + <source file='/var/lib/libvirt/detect-zeroes-cdrom.iso'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> -- 2.51.1
From: Peter Krempa <pkrempa@redhat.com> 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> --- src/qemu/qemu_domain.c | 6 +----- .../xml2json/file-backing_basic-detect.json | 3 +++ .../xml2json/file-backing_basic-unmap-detect.json | 3 +++ .../xml2json/file-backing_basic-unmap-ignore.json | 3 +++ tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args | 6 +++--- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a42721efad..0ac9ae0658 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; diff --git a/tests/qemublocktestdata/xml2json/file-backing_basic-detect.json b/tests/qemublocktestdata/xml2json/file-backing_basic-detect.json index c27233269b..773b7b3a02 100644 --- a/tests/qemublocktestdata/xml2json/file-backing_basic-detect.json +++ b/tests/qemublocktestdata/xml2json/file-backing_basic-detect.json @@ -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" } diff --git a/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-detect.json b/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-detect.json index 1ec0b8fffc..70faaa81de 100644 --- a/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-detect.json +++ b/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-detect.json @@ -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" } diff --git a/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-ignore.json b/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-ignore.json index 315a17323a..4bb964aaa4 100644 --- a/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-ignore.json +++ b/tests/qemublocktestdata/xml2json/file-backing_basic-unmap-ignore.json @@ -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" } diff --git a/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args b/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args index d959d4a717..6284c082b1 100644 --- a/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args +++ b/tests/qemuxmlconfdata/disk-detect-zeroes.x86_64-latest.args @@ -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"}' \ -- 2.51.1
On a Friday in 2025, Peter Krempa via Devel wrote:
See 2/2 for explanation.
Peter Krempa (2): qemuxmlconftest: Improve coverage of 'disk-detect-zeroes' test case qemuDomainPrepareDiskSourceData: Setup 'detect_zeroes' for all layers
src/qemu/qemu_domain.c | 6 +--- .../xml2json/file-backing_basic-detect.json | 3 ++ .../file-backing_basic-unmap-detect.json | 3 ++ .../file-backing_basic-unmap-ignore.json | 3 ++ .../disk-detect-zeroes.x86_64-latest.args | 20 +++++++++--- tests/qemuxmlconfdata/disk-detect-zeroes.xml | 31 +++++++++++++++++-- 6 files changed, 55 insertions(+), 11 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
On Fri, Nov 14, 2025 at 04:53:24PM +0100, Peter Krempa via Devel wrote:
See 2/2 for explanation.
Peter Krempa (2): qemuxmlconftest: Improve coverage of 'disk-detect-zeroes' test case qemuDomainPrepareDiskSourceData: Setup 'detect_zeroes' for all layers
Reviewed-by: Andrea Bolognani <abologna@redhat.com> -- Andrea Bolognani / Red Hat / Virtualization
participants (3)
-
Andrea Bolognani -
Ján Tomko -
Peter Krempa