I noticed that depending on the <driver> attributes the user passed
in, the output may omit the <driver> element altogether. For example,
the rerror_policy has had this problem since commit 4bb4109 in Oct
2011. But in adding testsuite coverage to expose it, I found another
problem: the C code is just fine without a driver name, but the
XML validator required either a name or a cache mode.
* src/conf/domain_conf.c (virDomainDiskDefFormat): Update
conditional.
* docs/schemas/domaincommon.rng (diskDriver): Simplify.
* tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.xml:
* tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.args:
New files.
* tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.xml:
Enhance test.
* tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-discard.xml:
Likewise.
* tests/qemuxml2argvtest.c (mymain): New test.
* tests/qemuxml2xmltest.c (mymain): Likewise.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
docs/schemas/domaincommon.rng | 20 +++++-----------
src/conf/domain_conf.c | 4 +++-
.../qemuxml2argv-disk-drive-copy-on-read.args | 5 ++++
.../qemuxml2argv-disk-drive-copy-on-read.xml | 28 ++++++++++++++++++++++
.../qemuxml2argv-disk-drive-discard.xml | 2 +-
tests/qemuxml2argvtest.c | 3 +++
.../qemuxml2xmlout-disk-drive-discard.xml | 2 +-
tests/qemuxml2xmltest.c | 1 +
8 files changed, 48 insertions(+), 17 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.xml
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 78fed88..09f426a 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1254,20 +1254,12 @@
-->
<define name="diskDriver">
<element name="driver">
- <choice>
- <group>
- <ref name="driverFormat"/>
- <optional>
- <ref name="driverCache"/>
- </optional>
- </group>
- <group>
- <optional>
- <ref name="driverFormat"/>
- </optional>
- <ref name="driverCache"/>
- </group>
- </choice>
+ <optional>
+ <ref name="driverFormat"/>
+ </optional>
+ <optional>
+ <ref name="driverCache"/>
+ </optional>
<optional>
<ref name="driverErrorPolicy"/>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 726c8ba..05fa3f9 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14963,7 +14963,9 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAdjustIndent(buf, 2);
if (def->src.driverName || def->src.format > 0 || def->cachemode ||
- def->ioeventfd || def->event_idx || def->copy_on_read) {
+ def->error_policy || def->rerror_policy || def->iomode ||
+ def->ioeventfd || def->event_idx || def->copy_on_read ||
+ def->discard) {
virBufferAddLit(buf, "<driver");
if (def->src.driverName)
virBufferAsprintf(buf, " name='%s'",
def->src.driverName);
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.args
b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.args
new file mode 100644
index 0000000..f743b6b
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.args
@@ -0,0 +1,5 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu -S -M \
+pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
+-no-acpi -boot c -usb -drive file=/dev/HostVG/QEMUGuest1,if=ide,bus=0,unit=0,\
+format=raw,copy-on-read=on -net none -serial none -parallel none
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.xml
b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.xml
new file mode 100644
index 0000000..c15ca93
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-copy-on-read.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='block' device='disk'>
+ <driver copy_on_read='on'/>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.xml
b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.xml
index b15fd63..de2855a 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.xml
@@ -25,7 +25,7 @@
<driver discard='unmap' name='qemu' type='qcow2'/>
</disk>
<disk type='file' device='cdrom'>
- <driver name='qemu' type='raw' discard='ignore'/>
+ <driver discard='ignore'/>
<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 13ed4f6..d43a4de 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -739,6 +739,9 @@ mymain(void)
DO_TEST("disk-drive-cache-unsafe",
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
QEMU_CAPS_DRIVE_CACHE_UNSAFE, QEMU_CAPS_DRIVE_FORMAT);
+ DO_TEST("disk-drive-copy-on-read",
+ QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
+ QEMU_CAPS_DRIVE_COPY_ON_READ, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-nbd",
QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
DO_TEST("disk-drive-network-nbd-export",
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-discard.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-discard.xml
index f01312f..f20b3b9 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-discard.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-discard.xml
@@ -23,7 +23,7 @@
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
- <driver name='qemu' type='raw' discard='ignore'/>
+ <driver discard='ignore'/>
<source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 788adbe..bf9d736 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -187,6 +187,7 @@ mymain(void)
DO_TEST("disk-drive-cache-v1-wt");
DO_TEST("disk-drive-cache-v1-wb");
DO_TEST("disk-drive-cache-v1-none");
+ DO_TEST("disk-drive-copy-on-read");
DO_TEST("disk-drive-network-nbd");
DO_TEST("disk-drive-network-nbd-export");
DO_TEST("disk-drive-network-nbd-ipv6");
--
1.9.0