[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] npiv: Expose fabric_name outside



On 2011年12月07日 05:05, Daniel P. Berrange wrote:
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

Thanks, Pushed. I will try to do the cleanup later.

Regards,
Osier


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]