diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index b87d898f77..418120eb77 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2824,57 +2824,107 @@
</devices>
...
+
+
or:
+
+
+ ...
+ <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>
+ ...
+
hostdev
The hostdev
element is the main container for describing
- host devices. For usb device passthrough mode
is always
- "subsystem" and type
is "usb" for a USB device, "pci"
- for a PCI device and "scsi" for a SCSI device. When
- managed
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 managed
is omitted or "no", and for USB
- devices, the user is responsible to
- call virNodeDeviceDettach
(or virsh
- nodedev-dettach
) before starting the guest or
- hot-plugging the device,
- and virNodeDeviceReAttach
(or virsh
- nodedev-reattach
) 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 sgio
(since 1.0.6 )
- 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 mode
is always
+ "subsystem" and the type
is one of the following values
+ with additional attributes noted.
+
+ usb
+ For USB devices, the user is responsible to call
+ virNodeDeviceDettach
(or
+ virsh nodedev-detach
) before starting the guest
+ or hot-plugging the device and virNodeDeviceReAttach
+ (or virsh nodedev-reattach
) after hot-unplug or
+ stopping the guest.
+
+ pci
+ For PCI devices, when managed
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
+ managed
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.
+
+ scsi
+ For SCSI devices, user is responsible to make sure the device
+ is not used by host. The optional sgio
+ (since 1.0.6 ) attribute indicates
+ whether the kernel will filter unprivileged SG_IO commands for
+ the disk, valid settings are "filtered" or "unfiltered".
+ The default is "filtered".
+
+
source
- The source element describes the device as seen from the host.
- The USB device can either be addressed by vendor / product id using the
- vendor
and product
elements or by the device's
- address on the hosts using the address
element. PCI devices
- on the other hand can only be described by their address
.
- SCSI devices are described by both the adapter
and
- address
elements.
-
- Since 1.0.0 , the source
element
- of USB devices may contain startupPolicy
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:
-
-
- mandatory
- fail if missing for any reason (the default)
-
-
- requisite
- fail if missing on boot up,
- drop if missing on migrate/restore/revert
-
-
- optional
- drop if missing at any start attempt
-
-
+ The source element describes the device as seen from the host using
+ the following mechanism to describe:
+
+ usb
+ The USB device can either be addressed by vendor / product id
+ using the vendor
and product
elements
+ or by the device's address on the host using the
+ address
element.
+
+ Since 1.0.0 , the source
+ element of USB devices may contain startupPolicy
+ 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:
+
+
+
+ mandatory
+ fail if missing for any reason (the default)
+
+
+ requisite
+ fail if missing on boot up,
+ drop if missing on migrate/restore/revert
+
+
+ optional
+ drop if missing at any start attempt
+
+
+
+ pci
+ PCI devices can only be described by their address
.
+
+ scsi
+ SCSI devices are described by both the adapter
+ and address
elements.
+
+ Since 1.2.8 , the source
+ element of a SCSI device may contain the protocol
+ attribute. When the attribute is set to "iscsi", the host
+ device XML follows the network disk
+ device using the same name
attribute and optionally
+ using the auth
element to provide the authentication
+ credentials to the iSCSI server.
+
+
+
vendor
, product
The vendor
and product
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 managed
is omitted or "no",
the user is responsible to call virNodeDeviceDettach
- (or virsh nodedev-dettach
) before starting the guest
+ (or virsh nodedev-detach
) before starting the guest
or hot-plugging the device, and virNodeDeviceReAttach
(or virsh nodedev-reattach
) after hot-unplug or
stopping the guest.
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 11f0fd02d7..b7a1b6f8dc 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3589,12 +3589,51 @@
-
-
-
-
-
-
+
+
+
+
+
+ adapter
+
+
+
+
+
+
+
+
+
+
+
+
+
+ iscsi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 358afae33d..d87ca24f67 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",
@@ -4212,11 +4217,97 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr sourcenode,
return ret;
}
+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, "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->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 (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, " \n",
- scsihostsrc->adapter);
- virBufferAsprintf(buf, " \n",
- includeTypeInAddr ? "type='scsi' " : "",
- scsihostsrc->bus, scsihostsrc->target,
- scsihostsrc->unit);
+ if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
+ virBufferAddLit(buf, "hosts[0].name);
+ virBufferEscapeString(buf, " port='%s'", iscsisrc->hosts[0].port);
+ virBufferAddLit(buf, "/>\n");
+ } else {
+ virBufferAsprintf(buf, " \n",
+ scsihostsrc->adapter);
+ virBufferAsprintf(buf,
+ " \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, " \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 0000000000..6638dcee1c
--- /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 0000000000..3bfded490d
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
@@ -0,0 +1,46 @@
+
+ QEMUGuest2
+ c7a5fdbd-edaf-9466-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000..2aebe9c2eb
--- /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 0000000000..8a050998ea
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
@@ -0,0 +1,40 @@
+
+ QEMUGuest2
+ c7a5fdbd-edaf-9466-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000..7fd3a000d2
--- /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 0000000000..d4dba4ac23
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
@@ -0,0 +1,46 @@
+
+ QEMUGuest2
+ c7a5fdbd-edaf-9466-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000..e4b6e9727e
--- /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 0000000000..13c0930f64
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
@@ -0,0 +1,40 @@
+
+ QEMUGuest2
+ c7a5fdbd-edaf-9466-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 12ecabcfff..609c1bc8b0 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 451dedcff4..7d416d0511 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");