On Tue, Dec 06, 2011 at 08:42:18PM +0800, Osier Yang wrote: > 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) > --- > docs/formatnode.html.in | 7 +++++ > docs/schemas/nodedev.rng | 40 +++++++++++++++++++++++++++++ > src/conf/node_device_conf.c | 3 ++ > src/conf/node_device_conf.h | 1 + > src/node_device/node_device_linux_sysfs.c | 10 +++++++ > 5 files changed, 61 insertions(+), 0 deletions(-) > > diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in > index 126f8de..c04d04d 100644 > --- a/docs/formatnode.html.in > +++ b/docs/formatnode.html.in > @@ -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> > diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng > index 55191d9..1b9a2d1 100644 > --- a/docs/schemas/nodedev.rng > +++ b/docs/schemas/nodedev.rng > @@ -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'> > diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c > index 9d48ff8..ea6ebde 100644 > --- a/src/conf/node_device_conf.c > +++ b/src/conf/node_device_conf.c > @@ -389,6 +389,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) { > @@ -1405,6 +1407,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); > diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h > index e317354..e787fc7 100644 > --- a/src/conf/node_device_conf.h > +++ b/src/conf/node_device_conf.h > @@ -141,6 +141,7 @@ struct _virNodeDevCapsDef { > unsigned int host; > char *wwnn; > char *wwpn; > + char *fabric_wwn; > unsigned int flags; > } scsi_host; > struct { > diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c > index d352800..380be9c 100644 > --- a/src/node_device/node_device_linux_sysfs.c > +++ b/src/node_device/node_device_linux_sysfs.c > @@ -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; Not your fault, since you're just following existing practice, but the error reporting in these methods seems a little odd, using VIR_ERROR instead of virReportError. Presumably because these codepaths are only ever run in daemon context, not in response to a user API. These days though the daemon code also uses virReportError, so some day we might like to cleanup this code. > + 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; ACK. The error cleanup can wait till later Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list