[libvirt] [PATCH] npiv: Expose fabric_name outside

Daniel P. Berrange berrange at redhat.com
Tue Dec 6 21:05:34 UTC 2011


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 :|




More information about the libvir-list mailing list