Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 24 +++++++++++++++++++
tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml | 1 +
.../caps_2.6.0-gicv2.aarch64.xml | 1 +
.../caps_2.6.0-gicv3.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml | 1 +
tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml | 1 +
.../qemuxml2argv-disk-drive-detect-zeroes.args | 27 ++++++++++++++++++++++
.../qemuxml2argv-disk-drive-detect-zeroes.xml | 2 +-
tests/qemuxml2argvtest.c | 3 +++
13 files changed, 65 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index d9f04c8d3aad..3b875877f27e 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -333,6 +333,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
"qxl.max_outputs", /* 225 */
"qxl-vga.max_outputs",
"spice-unix",
+ "drive-detect-zeroes",
);
@@ -2650,6 +2651,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] =
{
{ "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
{ "machine", "vmport", QEMU_CAPS_MACHINE_VMPORT_OPT },
{ "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
+ { "drive", "detect-zeroes", QEMU_CAPS_DRIVE_DETECT_ZEROES },
{ "realtime", "mlock", QEMU_CAPS_MLOCK },
{ "boot-opts", "strict", QEMU_CAPS_BOOT_STRICT },
{ "boot-opts", "reboot-timeout", QEMU_CAPS_REBOOT_TIMEOUT },
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index e273f2a44033..e284cfbcfb6b 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -365,6 +365,7 @@ typedef enum {
QEMU_CAPS_QXL_MAX_OUTPUTS, /* -device qxl,max-outputs= */
QEMU_CAPS_QXL_VGA_MAX_OUTPUTS, /* -device qxl-vga,max-outputs= */
QEMU_CAPS_SPICE_UNIX, /* -spice unix */
+ QEMU_CAPS_DRIVE_DETECT_ZEROES, /* -drive detect-zeroes= */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 490260f15e4f..e550c8ee6e50 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1391,6 +1391,30 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
}
}
+ if (disk->detect_zeroes) {
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_DETECT_ZEROES)) {
+ int detect_zeroes = disk->detect_zeroes;
+
+ /*
+ * As a convinience syntax, if discards are ignored and
+ * zero detection is set to 'unmap', then simply behave
+ * like zero detection is set to 'on'. But don't change
+ * it in the XML for easier adjustments. This behaviour
+ * is documented.
+ */
+ if (disk->discard != VIR_DOMAIN_DISK_DISCARD_UNMAP &&
+ detect_zeroes == VIR_DOMAIN_DISK_DETECT_ZEROES_UNMAP)
+ detect_zeroes = VIR_DOMAIN_DISK_DETECT_ZEROES_ON;
+
+ virBufferAsprintf(&opt, ",detect-zeroes=%s",
+ virDomainDiskDetectZeroesTypeToString(detect_zeroes));
+ } else {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("detect_zeroes is not supported by this QEMU
binary"));
+ goto error;
+ }
+ }
+
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
const char *wpolicy = NULL, *rpolicy = NULL;
diff --git a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
index 5e9b34d8a493..964b6f020483 100644
--- a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
@@ -164,6 +164,7 @@
<flag name='device-tray-moved-event'/>
<flag name='nec-usb-xhci-ports'/>
<flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
<version>2001001</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
index df1eb5ecd343..112ac95eabee 100644
--- a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
@@ -181,6 +181,7 @@
<flag name='qxl.max_outputs'/>
<flag name='qxl-vga.max_outputs'/>
<flag name='spice-unix'/>
+ <flag name='drive-detect-zeroes'/>
<version>2004000</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
index 83f1e146d857..d7781cf215a1 100644
--- a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
@@ -185,6 +185,7 @@
<flag name='qxl.max_outputs'/>
<flag name='qxl-vga.max_outputs'/>
<flag name='spice-unix'/>
+ <flag name='drive-detect-zeroes'/>
<version>2005000</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
index 8b68291aecb4..29f3b5ac3f11 100644
--- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
@@ -155,6 +155,7 @@
<flag name='nec-usb-xhci-ports'/>
<flag name='virtio-scsi-pci.iothread'/>
<flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
<version>2005094</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
index d65523ee285f..7c0dcf6b218b 100644
--- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
@@ -155,6 +155,7 @@
<flag name='nec-usb-xhci-ports'/>
<flag name='virtio-scsi-pci.iothread'/>
<flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
<version>2005094</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
index 771d20954387..8438deb3d6d4 100644
--- a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
+++ b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
@@ -149,6 +149,7 @@
<flag name='nec-usb-xhci-ports'/>
<flag name='virtio-scsi-pci.iothread'/>
<flag name='name-guest'/>
+ <flag name='drive-detect-zeroes'/>
<version>2005094</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
index c9f296542dc1..442d5a7e4047 100644
--- a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
@@ -191,6 +191,7 @@
<flag name='qxl.max_outputs'/>
<flag name='qxl-vga.max_outputs'/>
<flag name='spice-unix'/>
+ <flag name='drive-detect-zeroes'/>
<version>2006000</version>
<kvmVersion>0</kvmVersion>
<package></package>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args
b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args
new file mode 100644
index 000000000000..ea651414f1e7
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.args
@@ -0,0 +1,27 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu \
+-name test \
+-S \
+-M pc-0.13 \
+-m 1024 \
+-smp 1 \
+-uuid 92d7a226-cfae-425b-a6d3-00bbf9ec5c9e \
+-nographic \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-test/monitor.sock,server,nowait \
+-no-acpi \
+-boot dc \
+-usb \
+-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\
+id=drive-virtio-disk0,discard=unmap,detect-zeroes=unmap \
+-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
+id=virtio-disk0 \
+-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\
+media=cdrom,id=drive-ide0-1-0,readonly=on,discard=ignore,detect-zeroes=on \
+-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.xml
b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.xml
index 8953f50f3f92..1546ac134f1a 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-detect-zeroes.xml
@@ -23,7 +23,7 @@
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
- <driver discard='ignore' detect_zeroes='off'/>
+ <driver discard='ignore' detect_zeroes='unmap'/>
<source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 573162fc4cc0..c406b645313c 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -875,6 +875,9 @@ mymain(void)
QEMU_CAPS_VIRTIO_BLK_SCSI);
DO_TEST("disk-drive-discard",
QEMU_CAPS_DRIVE_DISCARD);
+ DO_TEST("disk-drive-detect-zeroes",
+ QEMU_CAPS_DRIVE_DISCARD,
+ QEMU_CAPS_DRIVE_DETECT_ZEROES);
DO_TEST("disk-snapshot", NONE);
DO_TEST_PARSE_ERROR("disk-same-targets",
QEMU_CAPS_SCSI_LSI,
--
2.8.3