提交 67653160 编写于 作者: O Osier Yang

conf: Introduce sgio for hostdev

"sgio" is only valid for scsi host device.
上级 ead43915
...@@ -2414,7 +2414,12 @@ ...@@ -2414,7 +2414,12 @@
and <code>virNodeDeviceReAttach</code> (or <code>virsh and <code>virNodeDeviceReAttach</code> (or <code>virsh
nodedev-reattach</code>) after hot-unplug or stopping the nodedev-reattach</code>) after hot-unplug or stopping the
guest. For SCSI device, user is responsible to make sure the device guest. For SCSI device, user is responsible to make sure the device
is not used by host.</dd> 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".
</dd>
<dt><code>source</code></dt> <dt><code>source</code></dt>
<dd>The source element describes the device as seen from the host. <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 The USB device can either be addressed by vendor / product id using the
......
...@@ -3234,6 +3234,14 @@ ...@@ -3234,6 +3234,14 @@
<attribute name="type"> <attribute name="type">
<value>scsi</value> <value>scsi</value>
</attribute> </attribute>
<optional>
<attribute name="sgio">
<choice>
<value>filtered</value>
<value>unfiltered</value>
</choice>
</attribute>
</optional>
<element name="source"> <element name="source">
<interleave> <interleave>
<ref name="sourceinfoadapter"/> <ref name="sourceinfoadapter"/>
......
...@@ -3790,6 +3790,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, ...@@ -3790,6 +3790,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
{ {
xmlNodePtr sourcenode; xmlNodePtr sourcenode;
char *managed = NULL; char *managed = NULL;
char *sgio = NULL;
char *backendStr = NULL; char *backendStr = NULL;
int backend; int backend;
int ret = -1; int ret = -1;
...@@ -3804,6 +3805,8 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, ...@@ -3804,6 +3805,8 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
def->managed = true; def->managed = true;
} }
sgio = virXMLPropString(node, "sgio");
/* @type is passed in from the caller rather than read from the /* @type is passed in from the caller rather than read from the
* xml document, because it is specified in different places for * xml document, because it is specified in different places for
* different kinds of defs - it is an attribute of * different kinds of defs - it is an attribute of
...@@ -3840,6 +3843,22 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, ...@@ -3840,6 +3843,22 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
goto error; goto error;
} }
if (sgio) {
if (def->source.subsys.type !=
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("sgio is only supported for scsi host device"));
goto error;
}
if ((def->source.subsys.u.scsi.sgio =
virDomainDeviceSGIOTypeFromString(sgio)) <= 0) {
virReportError(VIR_ERR_XML_ERROR,
_("unknown sgio mode '%s'"), sgio);
goto error;
}
}
switch (def->source.subsys.type) { switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
if (virDomainHostdevSubsysPciDefParseXML(sourcenode, def, flags) < 0) if (virDomainHostdevSubsysPciDefParseXML(sourcenode, def, flags) < 0)
...@@ -3878,6 +3897,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, ...@@ -3878,6 +3897,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
ret = 0; ret = 0;
error: error:
VIR_FREE(managed); VIR_FREE(managed);
VIR_FREE(sgio);
VIR_FREE(backendStr); VIR_FREE(backendStr);
return ret; return ret;
} }
...@@ -15439,11 +15459,17 @@ virDomainHostdevDefFormat(virBufferPtr buf, ...@@ -15439,11 +15459,17 @@ virDomainHostdevDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " <hostdev mode='%s' type='%s'", virBufferAsprintf(buf, " <hostdev mode='%s' type='%s'",
mode, type); mode, type);
if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
virBufferAsprintf(buf, " managed='%s'>\n", virBufferAsprintf(buf, " managed='%s'",
def->managed ? "yes" : "no"); def->managed ? "yes" : "no");
else
virBufferAddLit(buf, ">\n"); if (def->source.subsys.type ==
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
def->source.subsys.u.scsi.sgio)
virBufferAsprintf(buf, " sgio='%s'",
virDomainDeviceSGIOTypeToString(def->source.subsys.u.scsi.sgio));
}
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 6); virBufferAdjustIndent(buf, 6);
switch (def->mode) { switch (def->mode) {
......
...@@ -423,6 +423,7 @@ struct _virDomainHostdevSubsys { ...@@ -423,6 +423,7 @@ struct _virDomainHostdevSubsys {
unsigned bus; unsigned bus;
unsigned target; unsigned target;
unsigned unit; unsigned unit;
int sgio; /* enum virDomainDeviceSGIO */
} scsi; } scsi;
} u; } u;
}; };
......
<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' sgio='unfiltered'>
<source>
<adapter name='scsi_host0'/>
<address bus='0' target='0' unit='0'/>
</source>
<address type='drive' controller='0' bus='0' target='4' unit='8'/>
</hostdev>
<memballoon model='virtio'/>
</devices>
</domain>
...@@ -295,6 +295,7 @@ mymain(void) ...@@ -295,6 +295,7 @@ mymain(void)
DO_TEST("disk-copy_on_read"); DO_TEST("disk-copy_on_read");
DO_TEST("hostdev-scsi-shareable"); DO_TEST("hostdev-scsi-shareable");
DO_TEST("hostdev-scsi-sgio");
virObjectUnref(driver.caps); virObjectUnref(driver.caps);
virObjectUnref(driver.xmlopt); virObjectUnref(driver.xmlopt);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册