[libvirt] [PATCH 6/9 v2] nodedev: Dump max vports and vports in use for HBA's XML

Michal Privoznik mprivozn at redhat.com
Tue Jan 15 10:08:21 UTC 2013


On 15.01.2013 10:38, Osier Yang wrote:
> This enrichs HBA's xml by dumping the number of max vports and
> vports in use. Format is like:
> 
>   <capability type='vport_ops'>
>     <max_vports>164</max_vports>
>     <vports>5</vports>
>   </capability>
> 
> * docs/formatnode.html.in: (Document the new XML)
> * docs/schemas/nodedev.rng: (Add the schema)
> * src/conf/node_device_conf.h: (New member for data.scsi_host)
> * src/node_device/node_device_linux_sysfs.c: (Collect the value of
>   max_vports and vports)
> ---
>  docs/formatnode.html.in                   |   10 ++++--
>  docs/schemas/nodedev.rng                  |    6 +++
>  src/conf/node_device_conf.c               |    7 +++-
>  src/conf/node_device_conf.h               |    2 +
>  src/node_device/node_device_linux_sysfs.c |   49 ++++++++++++++++++++++++++--
>  5 files changed, 66 insertions(+), 8 deletions(-)
> 
> diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
> index fcaaaaf..5712bcf 100644
> --- a/docs/formatnode.html.in
> +++ b/docs/formatnode.html.in
> @@ -136,9 +136,13 @@
>                <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>.
> +                vport operations are supported) and "fc_host". "vport_ops"
> +                could contain two optional sub-elements: <code>vports</code>,
> +                and <code>max_vports</code>. <code>vports</code> shows the
> +                number of vport in use. <code>max_vports</code> shows the
> +                maximum vports the HBA supports. "fc_host" implies following
> +                sub-elements: <code>wwnn</code>, <code>wwpn</code>, and
> +                <code>fabric_wwn</code>.
>                </dd>
>              </dl>
>            </dd>
> diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
> index 7c85815..b94cce6 100644
> --- a/docs/schemas/nodedev.rng
> +++ b/docs/schemas/nodedev.rng
> @@ -267,6 +267,12 @@
>      <attribute name='type'>
>        <value>vports_ops</value>
>      </attribute>
> +    <element name='max_vports'>
> +      <ref name='unsignedInt'/>
> +    </element>
> +    <element name='vports'>
> +      <ref name='unsignedInt'/>
> +    </element>
>    </define>
>  
>    <define name='capscsihost'>
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index 819e6af..5962d58 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -392,7 +392,12 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDefPtr def)
>                  virBufferAddLit(&buf, "    </capability>\n");
>              }
>              if (data->scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS) {
> -                virBufferAddLit(&buf, "    <capability type='vport_ops' />\n");
> +                virBufferAddLit(&buf, "    <capability type='vport_ops'>\n");
> +                virBufferAsprintf(&buf, "      <max_vports>%d</max_vports>\n",
> +                                  data->scsi_host.max_vports);
> +                virBufferAsprintf(&buf, "      <vports>%d</vports>\n",
> +                                  data->scsi_host.vports);
> +                virBufferAddLit(&buf, "    </capability>\n");
>              }
>  
>              break;
> diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
> index 145d699..4e584a3 100644
> --- a/src/conf/node_device_conf.h
> +++ b/src/conf/node_device_conf.h
> @@ -137,6 +137,8 @@ struct _virNodeDevCapsDef {
>              char *wwpn;
>              char *fabric_wwn;
>              unsigned int flags;
> +            int max_vports;
> +            int vports;
>          } scsi_host;
>          struct {
>              char *name;
> diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c
> index 85bbab6..a1c3637 100644
> --- a/src/node_device/node_device_linux_sysfs.c
> +++ b/src/node_device/node_device_linux_sysfs.c
> @@ -40,6 +40,8 @@
>  int
>  detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>  {
> +    char *max_vports = NULL;
> +    char *vports = NULL;
>      int ret = -1;
>  
>      VIR_DEBUG("Checking if host%d is an FC HBA", d->scsi_host.host);
> @@ -50,7 +52,7 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>          if (virReadFCHost(NULL,
>                            d->scsi_host.host,
>                            "port_name",
> -                          &d->scsi_host.wwpn) == -1) {
> +                          &d->scsi_host.wwpn) < 0) {
>              VIR_ERROR(_("Failed to read WWPN for host%d"), d->scsi_host.host);
>              goto cleanup;
>          }
> @@ -58,7 +60,7 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>          if (virReadFCHost(NULL,
>                            d->scsi_host.host,
>                            "node_name",
> -                          &d->scsi_host.wwnn) == -1) {
> +                          &d->scsi_host.wwnn) < 0) {
>              VIR_ERROR(_("Failed to read WWNN for host%d"), d->scsi_host.host);
>              goto cleanup;
>          }
> @@ -66,23 +68,62 @@ detect_scsi_host_caps_linux(union _virNodeDevCapData *d)
>          if (virReadFCHost(NULL,
>                            d->scsi_host.host,
>                            "fabric_name",
> -                          &d->scsi_host.fabric_wwn) == -1) {
> +                          &d->scsi_host.fabric_wwn) < 0) {
>              VIR_ERROR(_("Failed to read fabric WWN for host%d"),
>                        d->scsi_host.host);
>              goto cleanup;
>          }
>      }
>  
> -    if (virIsCapableVport(NULL, d->scsi_host.host) == 0)
> +    if (virIsCapableVport(NULL, d->scsi_host.host) == 0) {
>          d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS;
>  
> +        if (virReadFCHost(NULL,
> +                          d->scsi_host.max_vports,
> +                          "max_npiv_vports",
> +                          &max_vports) < 0) {
> +            VIR_ERROR(_("Failed to read max_npiv_vports for host%d"),
> +                      d->scsi_host.host);
> +            goto cleanup;
> +        }
> +
> +         if (virReadFCHost(NULL,
> +                          d->scsi_host.max_vports,
> +                          "npiv_vports_inuse",
> +                          &vports) < 0) {
> +            VIR_ERROR(_("Failed to read npiv_vports_inuse for host%d"),
> +                      d->scsi_host.host);
> +            goto cleanup;
> +        }
> +
> +        if (virStrToLong_i(max_vports, NULL, 10,
> +                           &d->scsi_host.max_vports) < 0) {
> +            VIR_ERROR(_("Failed to parse value of max_npiv_vports '%s'"),
> +                      max_vports);
> +            goto cleanup;
> +        }
> +
> +        if (virStrToLong_i(vports, NULL, 10,
> +                           &d->scsi_host.vports) < 0) {
> +            VIR_ERROR(_("Failed to parse value of npiv_vports_inuse '%s'"),
> +                      vports);
> +            goto cleanup;
> +        }
> +    }
> +
>      ret = 0;
>  cleanup:
>      if (ret < 0) {
> +        /* Clear the two flags in case of producing confusing XML output */
> +        d->scsi_host.flags &= ~(VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST |
> +                                VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS);
> +

Yeah, this is what I thought. ACK

Michal

>          VIR_FREE(d->scsi_host.wwnn);
>          VIR_FREE(d->scsi_host.wwpn);
>          VIR_FREE(d->scsi_host.fabric_wwn);
>      }
> +    VIR_FREE(max_vports);
> +    VIR_FREE(vports);
>      return ret;
>  }
>  
> 




More information about the libvir-list mailing list