[PATCH v2 0/3] Wrong allocation size displayed for NFS volumes
by John Ferlan
Changes over v1 - different tact as more research discovers that the
posix_fallocate() does not perform the correct pre-allocation of space
for an NFS backed file/disk, some details of the findings can be found:
http://www.redhat.com/archives/libvir-list/2014-August/msg00367.html
The first patch in this series will refactor the safezero to allow for
more fallback than the current code. Initially implemented as a series
of three 'safezero()' functions in commit id 'c29d0929' using build
conditionals to determine which of the 3 is being used.
The refactored code will have one function that will make a series of
calls rather the just failing on whatever is built into the system.
The first is a global virFileFdPosixFallocate() with the build conditional
controlling only whether the function runs or will just return -1. It
will also be re-used by the Volume Resize code in a future patch.
If on creation the virFileFdPosixFallocate() fails, attempts will be made
to then try the mmap() method (if it exists), and then fall back to the
slow, old, safewrite of zero filled buffers. The mmap function will follow
the format of the posix_fallocate insomuch as if HAVE_MMAP is defined,
then that will be attempted or a -1 will be returned immediately.
The major change of this patch over the prior code is the fallback. One
other minor change is if the virFileFdPosixFallocate() tries to call
posix_fallocate() and fails, then a VIR_WARN will be used to indicate
something went wrong. Previously, the code would return errno and eventually
that would filter back to a caller which would use the errno in a sys
error message. This I think only is odd when it comes to the resize path.
The second patch looks to resolve the first issue discovered by:
https://bugzilla.redhat.com/show_bug.cgi?id=1077068
It does this by checking the returned size/len of the file in the
posix_fallocate() call and if it does not match a VIR_WARN will be
posted and a failure returned allowing either the mmap or write of
zero filled buffers to the file.
The third patch changes the virStorageFileResize() logic to follow
the safezero() logic with respect to build conditionals. Also, rather
than reinvent the wheel, it will reuse the virFileFdPosixFallocate().
The new static API resizeSysFallocate() will return -1 if the build
conditionals are not met.
A current "downside" is by calling virFileFdPosixFallocate() twice
(once directly and the other indirectly through safezero), the
VIR_WARN will be displayed twice, but that should only affect someone
trying to debug things.
NOTE:
Investigation and testing while creating this series also showed it's
possible to modify the NFS Pool Start code to add a "-o wsize=4096" to
the MOUNT command in order to force smaller write's. While that did fix
the symptoms, the fix just didn't "feel right". The block size of the
"source" export was 4096 bytes, while the block size of the "target"
file was 1048576 bytes (current NFSv4 wsize default value when not
specified). Whether those play into what posix_fallocate() does I
am not sure, but if it does and that's fixed, then the way these
patches are coded up - it won't matter. Compared to perhaps needing
to revisit or document heavily how to set some new field in the pool
XML source - this just seems more right.
John Ferlan (3):
virfile: Refactor safezero, introduce virFileFdPosixFallocate
virfile: Check returned size from virFileFdPosixFallocate
virstoragefile: Refactor virStorageFileResize
src/libvirt_private.syms | 1 +
src/util/virfile.c | 58 ++++++++++++++++++++++++++++++++++++++---------
src/util/virfile.h | 2 ++
src/util/virstoragefile.c | 52 +++++++++++++++++++++++++++---------------
4 files changed, 84 insertions(+), 29 deletions(-)
--
1.9.3
10 years, 2 months
[PATCH v4 2/3] hostdev: Add iSCSI hostdev XML
by John Ferlan
Introduce a new structure to handle an iSCSI host device based on the
existing virDomainHostdevSubsysSCSI by adding a "protocol='iscsi'" to
the <source/> element. The hostdev structure mimics the existing
<disk/> element for an iSCSI device (network) device. New XML is:
<hostdev mode='subsystem' type='scsi' managed='yes'>
<source protocol='iscsi' name='iqn.1992-01.com.example'>
<host name='example.org' port='3260'/>
<auth username='myname'>
<secret type='iscsi' usage='mycluster_myname'/>
</auth>
</source>
<address type='drive' controller='0' bus='0' target='2' unit='5'/>
</hostdev>
The controller element will mimic the existing scsi_host code insomuch
as when 'lsi' and 'virtio-scsi' are used.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
Changes since v3:
* Rework RNG to match comments from review 8/8
* Move the <auth> inside the <source>
* Modify the tests and html doc to match where the <auth> is found
docs/formatdomain.html.in | 144 +++++++++++++-------
docs/schemas/domaincommon.rng | 51 ++++++-
src/conf/domain_conf.c | 150 ++++++++++++++++++---
.../qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args | 14 ++
.../qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml | 46 +++++++
.../qemuxml2argv-hostdev-scsi-lsi-iscsi.args | 14 ++
.../qemuxml2argv-hostdev-scsi-lsi-iscsi.xml | 40 ++++++
...emuxml2argv-hostdev-scsi-virtio-iscsi-auth.args | 16 +++
...qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml | 46 +++++++
.../qemuxml2argv-hostdev-scsi-virtio-iscsi.args | 16 +++
.../qemuxml2argv-hostdev-scsi-virtio-iscsi.xml | 40 ++++++
tests/qemuxml2argvtest.c | 16 +++
tests/qemuxml2xmltest.c | 5 +
13 files changed, 529 insertions(+), 69 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index e5b1adb..8b294bd 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2824,57 +2824,107 @@
</devices>
...</pre>
+
+ <p>or:</p>
+
+<pre>
+ ...
+ <devices>
+ <hostdev mode='subsystem' type='scsi'>
+ <source protocol='iscsi' name='iqn.2014-08.com.example:iscsi-nopool/1'>
+ <host name='example.com' port='3260'/>
+ <auth username='myuser'>
+ <secret type='iscsi' usage='libvirtiscsi'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </hostdev>
+ </devices>
+ ...</pre>
+
<dl>
<dt><code>hostdev</code></dt>
<dd>The <code>hostdev</code> element is the main container for describing
- host devices. For usb device passthrough <code>mode</code> is always
- "subsystem" and <code>type</code> is "usb" for a USB device, "pci"
- for a PCI device and "scsi" for a SCSI device. When
- <code>managed</code> is "yes" for a PCI
- device, it is detached from the host before being passed on to
- the guest, and reattached to the host after the guest exits.
- If <code>managed</code> is omitted or "no", and for USB
- devices, the user is responsible to
- call <code>virNodeDeviceDettach</code> (or <code>virsh
- nodedev-dettach</code>) before starting the guest or
- hot-plugging the device,
- and <code>virNodeDeviceReAttach</code> (or <code>virsh
- nodedev-reattach</code>) after hot-unplug or stopping the
- guest. For SCSI device, user is responsible to make sure the device
- is not used by host.
- The optional <code>sgio</code> (<span class="since">since 1.0.6</span>)
- attribute indicates whether the kernel will filter unprivileged
- SG_IO commands for the disk, valid settings are "filtered" or
- "unfiltered". Defaults to "filtered".
+ host devices. For each device, the <code>mode</code> is always
+ "subsystem" and the <code>type</code> is one of the following values
+ with additional attributes noted.
+ <dl>
+ <dt>usb</dt>
+ <dd>For USB devices, the user is responsible to call
+ <code>virNodeDeviceDettach</code> (or
+ <code>virsh nodedev-detach</code>) before starting the guest
+ or hot-plugging the device and <code>virNodeDeviceReAttach</code>
+ (or <code>virsh nodedev-reattach</code>) after hot-unplug or
+ stopping the guest.
+ </dd>
+ <dt>pci</dt>
+ <dd>For PCI devices, when <code>managed</code> is "yes" it is
+ detached from the host before being passed on to the guest
+ and reattached to the host after the guest exits. If
+ <code>managed</code> is omitted or "no", follow the steps
+ described for a USB device to detach before starting the
+ guest or hot-plugging and reattach after stopping the guest
+ or hot-unplug.
+ </dd>
+ <dt>scsi</dt>
+ <dd>For SCSI devices, user is responsible to make sure the device
+ is not used by host. The optional <code>sgio</code>
+ (<span class="since">since 1.0.6</span>) attribute indicates
+ whether the kernel will filter unprivileged SG_IO commands for
+ the disk, valid settings are "filtered" or "unfiltered".
+ The default is "filtered".
+ </dd>
+ </dl>
</dd>
<dt><code>source</code></dt>
- <dd>The source element describes the device as seen from the host.
- The USB device can either be addressed by vendor / product id using the
- <code>vendor</code> and <code>product</code> elements or by the device's
- address on the hosts using the <code>address</code> element. PCI devices
- on the other hand can only be described by their <code>address</code>.
- SCSI devices are described by both the <code>adapter</code> and
- <code>address</code> elements.
-
- <span class="since">Since 1.0.0</span>, the <code>source</code> element
- of USB devices may contain <code>startupPolicy</code> attribute which can
- be used to define policy what to do if the specified host USB device is
- not found. The attribute accepts the following values:
- <table class="top_table">
- <tr>
- <td> mandatory </td>
- <td> fail if missing for any reason (the default) </td>
- </tr>
- <tr>
- <td> requisite </td>
- <td> fail if missing on boot up,
- drop if missing on migrate/restore/revert </td>
- </tr>
- <tr>
- <td> optional </td>
- <td> drop if missing at any start attempt </td>
- </tr>
- </table>
+ <dd>The source element describes the device as seen from the host using
+ the following mechanism to describe:
+ <dl>
+ <dt>usb</dt>
+ <dd>The USB device can either be addressed by vendor / product id
+ using the <code>vendor</code> and <code>product</code> elements
+ or by the device's address on the host using the
+ <code>address</code> element.
+ <p>
+ <span class="since">Since 1.0.0</span>, the <code>source</code>
+ element of USB devices may contain <code>startupPolicy</code>
+ attribute which can be used to define policy what to do if the
+ specified host USB device is not found. The attribute accepts
+ the following values:
+ </p>
+ <table class="top_table">
+ <tr>
+ <td> mandatory </td>
+ <td> fail if missing for any reason (the default) </td>
+ </tr>
+ <tr>
+ <td> requisite </td>
+ <td> fail if missing on boot up,
+ drop if missing on migrate/restore/revert </td>
+ </tr>
+ <tr>
+ <td> optional </td>
+ <td> drop if missing at any start attempt </td>
+ </tr>
+ </table>
+ </dd>
+ <dt>pci</dt>
+ <dd>PCI devices can only be described by their <code>address</code>.
+ </dd>
+ <dt>scsi</dt>
+ <dd>SCSI devices are described by both the <code>adapter</code>
+ and <code>address</code> elements.
+ <p>
+ <span class="since">Since 1.2.8</span>, the <code>source</code>
+ element of a SCSI device may contain the <code>protocol</code>
+ attribute. When the attribute is set to "iscsi", the host
+ device XML follows the network <a href="#elementsDisks">disk</a>
+ device using the same <code>name</code> attribute and optionally
+ using the <code>auth</code> element to provide the authentication
+ credentials to the iSCSI server.
+ </p>
+ </dd>
+ </dl>
</dd>
<dt><code>vendor</code>, <code>product</code></dt>
<dd>The <code>vendor</code> and <code>product</code> elements each have an
@@ -3589,7 +3639,7 @@
before being passed on to the guest, and reattached to the host
after the guest exits. If <code>managed</code> is omitted or "no",
the user is responsible to call <code>virNodeDeviceDettach</code>
- (or <code>virsh nodedev-dettach</code>) before starting the guest
+ (or <code>virsh nodedev-detach</code>) before starting the guest
or hot-plugging the device, and <code>virNodeDeviceReAttach</code>
(or <code>virsh nodedev-reattach</code>) after hot-unplug or
stopping the guest.
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 11f0fd0..b7a1b6f 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3589,12 +3589,51 @@
</attribute>
</optional>
<element name="source">
- <interleave>
- <ref name="sourceinfoadapter"/>
- <element name="address">
- <ref name="scsiaddress"/>
- </element>
- </interleave>
+ <choice>
+ <group> <!-- scsi_host adapter -->
+ <optional>
+ <attribute name="protocol">
+ <choice>
+ <value>adapter</value> <!-- scsi_host, default, optional -->
+ </choice>
+ </attribute>
+ </optional>
+ <interleave>
+ <ref name="sourceinfoadapter"/>
+ <element name="address">
+ <ref name="scsiaddress"/>
+ </element>
+ </interleave>
+ </group>
+ <group> <!-- iscsi adapter -->
+ <attribute name="protocol">
+ <choice>
+ <value>iscsi</value> <!-- iscsi, required -->
+ </choice>
+ </attribute>
+ <attribute name="name">
+ <text/>
+ </attribute>
+ <interleave>
+ <oneOrMore>
+ <element name='host'>
+ <attribute name='name'>
+ <text/>
+ </attribute>
+ <optional>
+ <attribute name='port'>
+ <ref name="PortNumber"/>
+ </attribute>
+ </optional>
+ <empty/>
+ </element>
+ </oneOrMore>
+ <optional>
+ <ref name='diskAuth'/>
+ </optional>
+ </interleave>
+ </group>
+ </choice>
</element>
</define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 358afae..d87ca24 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -597,6 +597,11 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend,
"vfio",
"xen")
+VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol,
+ VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST,
+ "adapter",
+ "iscsi")
+
VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST,
"storage",
"misc",
@@ -4213,10 +4218,96 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr sourcenode,
}
static int
+virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr sourcenode,
+ virDomainHostdevSubsysSCSIPtr def)
+{
+ int ret = -1;
+ int auth_secret_usage = -1;
+ xmlNodePtr cur;
+ virStorageAuthDefPtr authdef = NULL;
+ virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &def->u.iscsi;
+
+ /* Similar to virDomainDiskSourceParse for a VIR_STORAGE_TYPE_NETWORK */
+
+ if (!(iscsisrc->path = virXMLPropString(sourcenode, "name"))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing iSCSI hostdev source path name"));
+ goto cleanup;
+ }
+
+ if (virDomainStorageHostParse(sourcenode, &iscsisrc->hosts,
+ &iscsisrc->nhosts) < 0)
+ goto cleanup;
+
+ if (iscsisrc->nhosts < 1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing the host address for the iSCSI hostdev"));
+ goto cleanup;
+ }
+ if (iscsisrc->nhosts > 1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("only one source host address may be specified "
+ "for the iSCSI hostdev"));
+ goto cleanup;
+ }
+
+ cur = sourcenode->children;
+ while (cur != NULL) {
+ if (cur->type == XML_ELEMENT_NODE &&
+ xmlStrEqual(cur->name, BAD_CAST "auth")) {
+ if (!(authdef = virStorageAuthDefParse(sourcenode->doc, cur)))
+ goto cleanup;
+ if ((auth_secret_usage =
+ virSecretUsageTypeFromString(authdef->secrettype)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("invalid secret type %s"),
+ authdef->secrettype);
+ goto cleanup;
+ }
+ if (auth_secret_usage != VIR_SECRET_USAGE_TYPE_ISCSI) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("hostdev invalid secret type '%s'"),
+ authdef->secrettype);
+ goto cleanup;
+ }
+ iscsisrc->auth = authdef;
+ authdef = NULL;
+ }
+ cur = cur->next;
+ }
+ ret = 0;
+
+ cleanup:
+ virStorageAuthDefFree(authdef);
+ return ret;
+}
+
+static int
virDomainHostdevSubsysSCSIDefParseXML(xmlNodePtr sourcenode,
virDomainHostdevSubsysSCSIPtr scsisrc)
{
- return virDomainHostdevSubsysSCSIHostDefParseXML(sourcenode, scsisrc);
+ char *protocol = NULL;
+ int ret = -1;
+
+ if ((protocol = virXMLPropString(sourcenode, "protocol"))) {
+ scsisrc->protocol =
+ virDomainHostdevSubsysSCSIProtocolTypeFromString(protocol);
+ if (scsisrc->protocol < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unknown SCSI subsystem protocol '%s'"),
+ protocol);
+ goto cleanup;
+ }
+ }
+
+ if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
+ ret = virDomainHostdevSubsysSCSIiSCSIDefParseXML(sourcenode, scsisrc);
+ else
+ ret = virDomainHostdevSubsysSCSIHostDefParseXML(sourcenode, scsisrc);
+
+ cleanup:
+ VIR_FREE(protocol);
+ return ret;
}
/* Check if a drive type address $controller:0:0:$unit is already
@@ -15761,6 +15852,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
virDomainHostdevSubsysSCSIPtr scsisrc = &def->source.subsys.u.scsi;
virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
+ virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
pcisrc->backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) {
@@ -15777,17 +15869,27 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
}
virBufferAddLit(buf, "<source");
- if (def->startupPolicy) {
- const char *policy;
- policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
- virBufferAsprintf(buf, " startupPolicy='%s'", policy);
+ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
+ if (def->startupPolicy) {
+ const char *policy;
+ policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
+ virBufferAsprintf(buf, " startupPolicy='%s'", policy);
+ }
+ if (usbsrc->autoAddress && (flags & VIR_DOMAIN_XML_MIGRATABLE))
+ virBufferAddLit(buf, " autoAddress='yes'");
+
+ if (def->missing && !(flags & VIR_DOMAIN_XML_INACTIVE))
+ virBufferAddLit(buf, " missing='yes'");
}
- if (usbsrc->autoAddress && (flags & VIR_DOMAIN_XML_MIGRATABLE))
- virBufferAddLit(buf, " autoAddress='yes'");
- if (def->missing &&
- !(flags & VIR_DOMAIN_XML_INACTIVE))
- virBufferAddLit(buf, " missing='yes'");
+ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
+ scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
+ const char *protocol =
+ virDomainHostdevSubsysSCSIProtocolTypeToString(scsisrc->protocol);
+
+ virBufferAsprintf(buf, " protocol='%s' name='%s'",
+ protocol, iscsisrc->path);
+ }
virBufferAddLit(buf, ">\n");
@@ -15828,12 +15930,20 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
}
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
- virBufferAsprintf(buf, "<adapter name='%s'/>\n",
- scsihostsrc->adapter);
- virBufferAsprintf(buf, "<address %sbus='%d' target='%d' unit='%d'/>\n",
- includeTypeInAddr ? "type='scsi' " : "",
- scsihostsrc->bus, scsihostsrc->target,
- scsihostsrc->unit);
+ if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
+ virBufferAddLit(buf, "<host");
+ virBufferEscapeString(buf, " name='%s'", iscsisrc->hosts[0].name);
+ virBufferEscapeString(buf, " port='%s'", iscsisrc->hosts[0].port);
+ virBufferAddLit(buf, "/>\n");
+ } else {
+ virBufferAsprintf(buf, "<adapter name='%s'/>\n",
+ scsihostsrc->adapter);
+ virBufferAsprintf(buf,
+ "<address %sbus='%d' target='%d' unit='%d'/>\n",
+ includeTypeInAddr ? "type='scsi' " : "",
+ scsihostsrc->bus, scsihostsrc->target,
+ scsihostsrc->unit);
+ }
break;
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -15842,8 +15952,16 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
return -1;
}
+ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
+ scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI &&
+ iscsisrc->auth) {
+ if (virStorageAuthDefFormat(buf, iscsisrc->auth) < 0)
+ return -1;
+ }
+
virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</source>\n");
+
return 0;
}
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
new file mode 100644
index 0000000..6638dce
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
@@ -0,0 +1,14 @@
+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 -nodefaults -monitor \
+unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+-device lsi,id=scsi0,bus=pci.0,addr=0x3 -usb \
+-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
+-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
+:3260/iqn.1992-01.com.example,if=none,format=raw,id=drive-hostdev0 \
+-device scsi-generic,bus=scsi0.0,scsi-id=4,drive=drive-hostdev0,id=hostdev0 \
+-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
+:3260/iqn.1992-01.com.example/1,if=none,format=raw,id=drive-hostdev1 \
+-device scsi-generic,bus=scsi0.0,scsi-id=5,drive=drive-hostdev1,id=hostdev1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
new file mode 100644
index 0000000..3bfded4
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
@@ -0,0 +1,46 @@
+<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'/>
+ <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 protocol='iscsi' name='iqn.1992-01.com.example'>
+ <host name='example.org' port='3260'/>
+ <auth username='myname'>
+ <secret type='iscsi' usage='mycluster_myname'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0' target='0' unit='4'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='scsi' managed='yes'>
+ <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
+ <host name='example.org' port='3260'/>
+ <auth username='myname'>
+ <secret type='iscsi' usage='mycluster_myname'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0' target='0' unit='5'/>
+ </hostdev>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
new file mode 100644
index 0000000..2aebe9c
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
@@ -0,0 +1,14 @@
+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 -nodefaults -monitor \
+unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+-device lsi,id=scsi0,bus=pci.0,addr=0x3 -usb \
+-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
+-drive file=iscsi://example.org:3260/iqn.1992-01.com.example,if=none,\
+format=raw,id=drive-hostdev0 \
+-device scsi-generic,bus=scsi0.0,scsi-id=4,drive=drive-hostdev0,id=hostdev0 \
+-drive file=iscsi://example.org:3260/iqn.1992-01.com.example/1,if=none,\
+format=raw,id=drive-hostdev1 \
+-device scsi-generic,bus=scsi0.0,scsi-id=5,drive=drive-hostdev1,id=hostdev1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
new file mode 100644
index 0000000..8a05099
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
@@ -0,0 +1,40 @@
+<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'/>
+ <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 protocol='iscsi' name='iqn.1992-01.com.example'>
+ <host name='example.org' port='3260'/>
+ </source>
+ <address type='drive' controller='0' bus='0' target='0' unit='4'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='scsi' managed='yes'>
+ <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
+ <host name='example.org' port='3260'/>
+ </source>
+ <address type='drive' controller='0' bus='0' target='0' unit='5'/>
+ </hostdev>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
new file mode 100644
index 0000000..7fd3a00
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
@@ -0,0 +1,16 @@
+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 -nodefaults -monitor \
+unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 -usb \
+-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
+-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
+:3260/iqn.1992-01.com.example,if=none,format=raw,id=drive-hostdev0 \
+-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=4,\
+drive=drive-hostdev0,id=hostdev0 \
+-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
+:3260/iqn.1992-01.com.example/1,if=none,format=raw,id=drive-hostdev1 \
+-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=5,\
+drive=drive-hostdev1,id=hostdev1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
new file mode 100644
index 0000000..d4dba4a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
@@ -0,0 +1,46 @@
+<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 protocol='iscsi' name='iqn.1992-01.com.example'>
+ <host name='example.org' port='3260'/>
+ <auth username='myname'>
+ <secret type='iscsi' usage='mycluster_myname'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0' target='2' unit='4'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='scsi' managed='yes'>
+ <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
+ <host name='example.org' port='3260'/>
+ <auth username='myname'>
+ <secret type='iscsi' usage='mycluster_myname'/>
+ </auth>
+ </source>
+ <address type='drive' controller='0' bus='0' target='2' unit='5'/>
+ </hostdev>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
new file mode 100644
index 0000000..e4b6e97
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
@@ -0,0 +1,16 @@
+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 -nodefaults -monitor \
+unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 -usb \
+-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
+-drive file=iscsi://example.org:3260/iqn.1992-01.com.example,if=none,\
+format=raw,id=drive-hostdev0 \
+-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=4,\
+drive=drive-hostdev0,id=hostdev0 \
+-drive file=iscsi://example.org:3260/iqn.1992-01.com.example/1,if=none,\
+format=raw,id=drive-hostdev1 \
+-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=5,\
+drive=drive-hostdev1,id=hostdev1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
new file mode 100644
index 0000000..13c0930
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
@@ -0,0 +1,40 @@
+<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 protocol='iscsi' name='iqn.1992-01.com.example'>
+ <host name='example.org' port='3260'/>
+ </source>
+ <address type='drive' controller='0' bus='0' target='2' unit='4'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='scsi' managed='yes'>
+ <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
+ <host name='example.org' port='3260'/>
+ </source>
+ <address type='drive' controller='0' bus='0' target='2' unit='5'/>
+ </hostdev>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 12ecabc..609c1bc 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1353,6 +1353,22 @@ mymain(void)
QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
QEMU_CAPS_DEVICE_SCSI_GENERIC,
QEMU_CAPS_DEVICE_SCSI_GENERIC_BOOTINDEX);
+ DO_TEST("hostdev-scsi-lsi-iscsi", QEMU_CAPS_DRIVE,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
+ QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI,
+ QEMU_CAPS_DEVICE_SCSI_GENERIC);
+ DO_TEST("hostdev-scsi-lsi-iscsi-auth", QEMU_CAPS_DRIVE,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
+ QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI,
+ QEMU_CAPS_DEVICE_SCSI_GENERIC);
+ DO_TEST("hostdev-scsi-virtio-iscsi", QEMU_CAPS_DRIVE,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
+ QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
+ QEMU_CAPS_DEVICE_SCSI_GENERIC);
+ DO_TEST("hostdev-scsi-virtio-iscsi-auth", QEMU_CAPS_DRIVE,
+ QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
+ QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
+ QEMU_CAPS_DEVICE_SCSI_GENERIC);
DO_TEST("mlock-on", QEMU_CAPS_MLOCK);
DO_TEST_FAILURE("mlock-on", NONE);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 451dedc..7d416d0 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -361,6 +361,11 @@ mymain(void)
DO_TEST_DIFFERENT("hostdev-scsi-autogen-address");
+ DO_TEST("hostdev-scsi-lsi-iscsi");
+ DO_TEST("hostdev-scsi-lsi-iscsi-auth");
+ DO_TEST("hostdev-scsi-virtio-iscsi");
+ DO_TEST("hostdev-scsi-virtio-iscsi-auth");
+
DO_TEST_DIFFERENT("s390-defaultconsole");
DO_TEST("pcihole64");
--
1.9.3
10 years, 3 months