On 06/16/2015 11:29 PM, Eric Farman wrote:
> Defining a domain with a SCSI disk attached via a hostdev
> tag and a source address unit value longer than two digits
> causes an error when editing the domain with virsh edit,
> even if no changes are made to the domain definition.
> The error suggests invalid XML, somewhere:
>
> # virsh edit lmb_guest
> error: XML document failed to validate against schema:
> Unable to validate doc against /usr/local/share/libvirt/schemas/domain.rng
> Extra element devices in interleave
> Element domain failed to validate content
>
> The virt-xml-validate tool fails with a similar error:
>
> # virt-xml-validate lmb_guest.xml
> Relax-NG validity error : Extra element devices in interleave
> lmb_guest.xml:17: element devices: Relax-NG validity error :
> Element domain failed to validate content
> lmb_guest.xml fails to validate
>
> The hostdev tag requires a source address to be specified,
> which includes bus, target, and unit address attributes.
> According to the SCSI Architecture Model spec (section
> 4.9 of SAM-2), a LUN address is 64 bits and thus could be
> up to 20 decimal digits long. Unfortunately, the XML
> schema limits this string to just two digits. Similarly,
> the target field can be up to 32 bits in length, which
> would be 10 decimal digits.
>
> # lsscsi -xx
> [0:0:19:0x4022401100000000] disk IBM 2107900 3.44 /dev/sda
> # lsscsi
> [0:0:19:1074872354]disk IBM 2107900 3.44 /dev/sda
> # cat lmb_guest.xml
> <domain type='kvm'>
> <name>lmb_guest</name>
> <memory unit='MiB'>1024</memory>
> ...trimmed...
> <devices>
> <controller type='scsi' model='virtio-scsi' index='0'/>
> <hostdev mode='subsystem' type='scsi'>
> <source>
> <adapter name='scsi_host0'/>
> <address bus='0' target='19' unit='1074872354'/>
> </source>
> </hostdev>
> ...trimmed...
>
> Since the reference unit and target fields are used in
> several places in the XML schema, create a separate one
> specific for SCSI Logical Units that will permit the
> greater length. This permits both the validation utility
> and the virsh edit command to succeed when a hostdev
> tag is included.
>
> Signed-off-by: Eric Farman <[email protected]>
> Reviewed-by: Matthew Rosato <[email protected]>
> Reviewed-by: Stefan Zimmermann <[email protected]>
> Reviewed-by: Boris Fiuczynski <[email protected]>
> ---
> docs/formatdomain.html.in | 6 +++++-
> docs/schemas/domaincommon.rng | 14 ++++++++++++--
> 2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 4e85b51..c88c4a6 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -3256,7 +3256,11 @@
> </dd>
> <dt>scsi</dt>
> <dd>SCSI devices are described by both the <code>adapter</code>
> - and <code>address</code> elements.
> + and <code>address</code> elements. The <code>address</code>
> + element includes a <code>bus</code> attribute (a 2-digit bus
> + number), a <code>target</code> attribute (a 10-digit target
> + number), and a <code>unit</code> attribute (a 20-digit unit
> + number on the bus).
Since we know from the v1 comments that qemu has a max of 16384 units, add:
Not all hypervisors support larger <code>unit</code> values. It is up to
each hypervisor to determine the maximum value supported for the adapter.
I could add "<code>target</code> and " if you think that would be better..
> <p>
> <span class="since">Since 1.2.8</span>, the <code>source</code>
> element of a SCSI device may contain the <code>protocol</code>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index f0f7400..b3c5cb8 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -3833,10 +3833,10 @@
> <ref name="driveBus"/>
> </attribute>
> <attribute name="target">
> - <ref name="driveTarget"/>
> + <ref name="driveSCSITarget"/>
> </attribute>
> <attribute name="unit">
> - <ref name="driveUnit"/>
> + <ref name="driveSCSIUnit"/>
> </attribute>
> </define>
> <define name="usbportaddress">
> @@ -5129,11 +5129,21 @@
> <param name="pattern">[0-9]{1,2}</param>
> </data>
> </define>
> + <define name="driveSCSITarget">
> + <data type="string">
> + <param name="pattern">[0-9]{1,10}</param>
> + </data>
> + </define>
> <define name="driveUnit">
> <data type="string">
> <param name="pattern">[0-9]{1,2}</param>
> </data>
> </define>
> + <define name="driveSCSIUnit">
> + <data type="string">
> + <param name="pattern">[0-9]{1,20}</param>
> + </data>
> + </define>
> <define name="featureName">
> <data type="string">
> <param name='pattern'>[a-zA-Z0-9\-_\.]+</param>
>
I'm going to add a test as well. It's essentially a copy of
tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-scsi.xml
adjusted to have a larger unit value (it'll be attached)
>From 09518db2ddf099d6c2862899b1a71a6e58d4314d Mon Sep 17 00:00:00 2001
From: John Ferlan <[email protected]>
Date: Thu, 18 Jun 2015 14:28:39 -0400
Subject: [PATCH] Add test for larger unit value
Signed-off-by: John Ferlan <[email protected]>
---
.../qemuxml2argv-hostdev-scsi-large-unit.xml | 35 ++++++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
2 files changed, 36 insertions(+)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-large-unit.xml
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-large-unit.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-large-unit.xml
new file mode 100644
index 0000000..b5efb40
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-large-unit.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</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'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'/>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <hostdev mode='subsystem' type='scsi' managed='yes'>
+ <source>
+ <adapter name='scsi_host0'/>
+ <address bus='0' target='0' unit='1074872354'/>
+ </source>
+ <address type='drive' controller='0' bus='0' target='4' unit='8'/>
+ </hostdev>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 3287ea3..711827d 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -577,6 +577,7 @@ mymain(void)
DO_TEST("hostdev-scsi-rawio");
DO_TEST_DIFFERENT("hostdev-scsi-autogen-address");
+ DO_TEST("hostdev-scsi-large-unit");
DO_TEST("hostdev-scsi-lsi-iscsi");
DO_TEST("hostdev-scsi-lsi-iscsi-auth");
--
2.1.0
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list