mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
npiv: Expose fabric_name outside
This patch is to expose the fabric_name of fc_host class, which might be useful for users who wants to known which fabric the (v)HBA connects to. The patch also adds the missed capabilities' XML schema of scsi_host, (of course, with fabric_wwn added), and update the documents (docs/formatnode.html.in)
This commit is contained in:
parent
9ec14bcabb
commit
cc17f09246
@ -126,6 +126,7 @@
|
|||||||
<dd>A network protocol exposed by the device, where the
|
<dd>A network protocol exposed by the device, where the
|
||||||
attribute <code>type</code> can be "80203" for IEEE
|
attribute <code>type</code> can be "80203" for IEEE
|
||||||
802.3, or "80211" for various flavors of IEEE 802.11.
|
802.3, or "80211" for various flavors of IEEE 802.11.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</dd>
|
</dd>
|
||||||
<dt><code>scsi_host</code></dt>
|
<dt><code>scsi_host</code></dt>
|
||||||
@ -133,6 +134,12 @@
|
|||||||
<dl>
|
<dl>
|
||||||
<dt><code>host</code></dt>
|
<dt><code>host</code></dt>
|
||||||
<dd>The SCSI host number.</dd>
|
<dd>The SCSI host number.</dd>
|
||||||
|
<dt><code>capability</code></dt>
|
||||||
|
<dd>Current capabilities include "vports_ops" (indicates
|
||||||
|
vport operations are supported) and "fc_host", the later
|
||||||
|
implies following sub-elements: <code>wwnn</code>,
|
||||||
|
<code>wwpn</code>, <code>fabric_wwn</code>.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</dd>
|
</dd>
|
||||||
<dt><code>scsi</code></dt>
|
<dt><code>scsi</code></dt>
|
||||||
|
@ -216,6 +216,35 @@
|
|||||||
</attribute>
|
</attribute>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
|
<define name='wwn'>
|
||||||
|
<data type='string'>
|
||||||
|
<param name='pattern'>(0-9a-fA-F){16}</param>
|
||||||
|
</data>
|
||||||
|
</define>
|
||||||
|
|
||||||
|
<define name='capsfchost'>
|
||||||
|
<attribute name='type'>
|
||||||
|
<value>fc_host</value>
|
||||||
|
</attribute>
|
||||||
|
|
||||||
|
<element name='wwnn'>
|
||||||
|
<ref name='wwn'/>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name='wwpn'>
|
||||||
|
<ref name='wwn'/>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name='fabric_wwn'>
|
||||||
|
<ref name='wwn'/>
|
||||||
|
</element>
|
||||||
|
</define>
|
||||||
|
|
||||||
|
<define name='capsvports'>
|
||||||
|
<attribute name='type'>
|
||||||
|
<value>vports_ops</value>
|
||||||
|
</attribute>
|
||||||
|
</define>
|
||||||
|
|
||||||
<define name='capscsihost'>
|
<define name='capscsihost'>
|
||||||
<attribute name='type'>
|
<attribute name='type'>
|
||||||
@ -225,6 +254,17 @@
|
|||||||
<element name='host'>
|
<element name='host'>
|
||||||
<ref name='uint'/>
|
<ref name='uint'/>
|
||||||
</element>
|
</element>
|
||||||
|
|
||||||
|
<optional>
|
||||||
|
<zeroOrMore>
|
||||||
|
<element name='capability'>
|
||||||
|
<choice>
|
||||||
|
<ref name='capsfchost'/>
|
||||||
|
<ref name='capsvports'/>
|
||||||
|
</choice>
|
||||||
|
</element>
|
||||||
|
</zeroOrMore>
|
||||||
|
</optional>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
<define name='capscsi'>
|
<define name='capscsi'>
|
||||||
|
@ -396,6 +396,8 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDefPtr def)
|
|||||||
data->scsi_host.wwnn);
|
data->scsi_host.wwnn);
|
||||||
virBufferEscapeString(&buf, " <wwpn>%s</wwpn>\n",
|
virBufferEscapeString(&buf, " <wwpn>%s</wwpn>\n",
|
||||||
data->scsi_host.wwpn);
|
data->scsi_host.wwpn);
|
||||||
|
virBufferEscapeString(&buf, " <fabric_wwn>%s</fabric_wwn>\n",
|
||||||
|
data->scsi_host.fabric_wwn);
|
||||||
virBufferAddLit(&buf, " </capability>\n");
|
virBufferAddLit(&buf, " </capability>\n");
|
||||||
}
|
}
|
||||||
if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) {
|
if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) {
|
||||||
@ -1378,6 +1380,7 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
|
|||||||
case VIR_NODE_DEV_CAP_SCSI_HOST:
|
case VIR_NODE_DEV_CAP_SCSI_HOST:
|
||||||
VIR_FREE(data->scsi_host.wwnn);
|
VIR_FREE(data->scsi_host.wwnn);
|
||||||
VIR_FREE(data->scsi_host.wwpn);
|
VIR_FREE(data->scsi_host.wwpn);
|
||||||
|
VIR_FREE(data->scsi_host.fabric_wwn);
|
||||||
break;
|
break;
|
||||||
case VIR_NODE_DEV_CAP_SCSI_TARGET:
|
case VIR_NODE_DEV_CAP_SCSI_TARGET:
|
||||||
VIR_FREE(data->scsi_target.name);
|
VIR_FREE(data->scsi_target.name);
|
||||||
|
@ -141,6 +141,7 @@ struct _virNodeDevCapsDef {
|
|||||||
unsigned int host;
|
unsigned int host;
|
||||||
char *wwnn;
|
char *wwnn;
|
||||||
char *wwpn;
|
char *wwpn;
|
||||||
|
char *fabric_wwn;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
} scsi_host;
|
} scsi_host;
|
||||||
struct {
|
struct {
|
||||||
|
@ -149,10 +149,20 @@ int check_fc_host_linux(union _virNodeDevCapData *d)
|
|||||||
retval = -1;
|
retval = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (read_wwn(d->scsi_host.host,
|
||||||
|
"fabric_name",
|
||||||
|
&d->scsi_host.fabric_wwn) == -1) {
|
||||||
|
VIR_ERROR(_("Failed to read fabric WWN for host%d"),
|
||||||
|
d->scsi_host.host);
|
||||||
|
retval = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (retval == -1) {
|
if (retval == -1) {
|
||||||
VIR_FREE(d->scsi_host.wwnn);
|
VIR_FREE(d->scsi_host.wwnn);
|
||||||
VIR_FREE(d->scsi_host.wwpn);
|
VIR_FREE(d->scsi_host.wwpn);
|
||||||
|
VIR_FREE(d->scsi_host.fabric_wwn);
|
||||||
}
|
}
|
||||||
VIR_FREE(sysfs_path);
|
VIR_FREE(sysfs_path);
|
||||||
return retval;
|
return retval;
|
||||||
|
Loading…
Reference in New Issue
Block a user