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 <farman@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Stefan Zimmermann <stzi@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxxxxxxx> > --- > 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 <jferlan@xxxxxxxxxx> Date: Thu, 18 Jun 2015 14:28:39 -0400 Subject: [PATCH] Add test for larger unit value Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- .../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 libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list