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:
Osier Yang 2011-12-06 07:09:03 -05:00
parent 9ec14bcabb
commit cc17f09246
5 changed files with 61 additions and 0 deletions

View File

@ -126,6 +126,7 @@
<dd>A network protocol exposed by the device, where the
attribute <code>type</code> can be "80203" for IEEE
802.3, or "80211" for various flavors of IEEE 802.11.
</dd>
</dl>
</dd>
<dt><code>scsi_host</code></dt>
@ -133,6 +134,12 @@
<dl>
<dt><code>host</code></dt>
<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>
</dd>
<dt><code>scsi</code></dt>

View File

@ -216,6 +216,35 @@
</attribute>
</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'>
<attribute name='type'>
@ -225,6 +254,17 @@
<element name='host'>
<ref name='uint'/>
</element>
<optional>
<zeroOrMore>
<element name='capability'>
<choice>
<ref name='capsfchost'/>
<ref name='capsvports'/>
</choice>
</element>
</zeroOrMore>
</optional>
</define>
<define name='capscsi'>

View File

@ -396,6 +396,8 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDefPtr def)
data->scsi_host.wwnn);
virBufferEscapeString(&buf, " <wwpn>%s</wwpn>\n",
data->scsi_host.wwpn);
virBufferEscapeString(&buf, " <fabric_wwn>%s</fabric_wwn>\n",
data->scsi_host.fabric_wwn);
virBufferAddLit(&buf, " </capability>\n");
}
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:
VIR_FREE(data->scsi_host.wwnn);
VIR_FREE(data->scsi_host.wwpn);
VIR_FREE(data->scsi_host.fabric_wwn);
break;
case VIR_NODE_DEV_CAP_SCSI_TARGET:
VIR_FREE(data->scsi_target.name);

View File

@ -141,6 +141,7 @@ struct _virNodeDevCapsDef {
unsigned int host;
char *wwnn;
char *wwpn;
char *fabric_wwn;
unsigned int flags;
} scsi_host;
struct {

View File

@ -149,10 +149,20 @@ int check_fc_host_linux(union _virNodeDevCapData *d)
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:
if (retval == -1) {
VIR_FREE(d->scsi_host.wwnn);
VIR_FREE(d->scsi_host.wwpn);
VIR_FREE(d->scsi_host.fabric_wwn);
}
VIR_FREE(sysfs_path);
return retval;