Re: [PATCH] nodedev: Fabric name must not be required for fc_host capability

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

 



On Wed, Jan 11, 2017 at 03:05:19PM +0100, Boris Fiuczynski wrote:
fabric_name is one of many fc_host attributes in Linux that is optional
and left to the low-level driver to decide if it is implemented.
The zfcp device driver does not provide a fabric name for an fcp host.

This patch removes the requirement for a fabric name by making it optional.

Signed-off-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxxxxxxx>
Reviewed-by: Bjoern Walk <bwalk@xxxxxxxxxxxxxxxxxx>
---
docs/formatnode.html.in                   |  2 +-
docs/schemas/nodedev.rng                  |  8 +++---
src/node_device/node_device_linux_sysfs.c |  3 +--
src/util/virutil.c                        |  4 +--
tests/fchostdata/fc_host/host7/node_name  |  1 +
tests/fchostdata/fc_host/host7/port_name  |  1 +
tests/fchostdata/fc_host/host7/port_state |  1 +
tests/fchosttest.c                        | 44 ++++++++++++++++++++++++++++---
8 files changed, 53 insertions(+), 11 deletions(-)
create mode 100644 tests/fchostdata/fc_host/host7/node_name
create mode 100644 tests/fchostdata/fc_host/host7/port_name
create mode 100644 tests/fchostdata/fc_host/host7/port_state

diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in
index e7b1140..f8d0e12 100644
--- a/docs/formatnode.html.in
+++ b/docs/formatnode.html.in
@@ -254,7 +254,7 @@
                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>.
+                optionally <code>fabric_wwn</code>.
              </dd>
            </dl>
          </dd>
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
index 9c98402..b100a6e 100644
--- a/docs/schemas/nodedev.rng
+++ b/docs/schemas/nodedev.rng
@@ -367,9 +367,11 @@
      <ref name='wwn'/>
    </element>

-    <element name='fabric_wwn'>
-      <ref name='wwn'/>
-    </element>
+    <optional>
+      <element name='fabric_wwn'>
+        <ref name='wwn'/>
+      </element>
+    </optional>
  </define>

  <define name='capsvports'>
diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c
index be99c41..e043744 100644
--- a/src/node_device/node_device_linux_sysfs.c
+++ b/src/node_device/node_device_linux_sysfs.c
@@ -73,9 +73,8 @@ nodeDeviceSysfsGetSCSIHostCaps(virNodeDevCapDataPtr d)
        VIR_STEAL_PTR(d->scsi_host.wwnn, tmp);

        if (!(tmp = virReadFCHost(NULL, d->scsi_host.host, "fabric_name"))) {
-            VIR_WARN("Failed to read fabric WWN for host%d",
+            VIR_INFO("Optional fabric WWN for host%d not available",
                     d->scsi_host.host);
-            goto cleanup;
        }
        VIR_FREE(d->scsi_host.fabric_wwn);
        VIR_STEAL_PTR(d->scsi_host.fabric_wwn, tmp);
diff --git a/src/util/virutil.c b/src/util/virutil.c
index aeaa7f9..ab61302 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -2011,7 +2011,7 @@ virGetSCSIHostNameByParentaddr(unsigned int domain,
 *
 * Read the value of sysfs "fc_host" entry.
 *
- * Returns result as a stringon success, caller must free @result after
+ * Returns result as a string on success, caller must free @result after
 * Otherwise returns NULL.

Looks like this could be separate commit.

 */
char *
@@ -2029,7 +2029,7 @@ virReadFCHost(const char *sysfs_prefix,
                    host, entry) < 0)
        goto cleanup;

-    if (virFileReadAll(sysfs_path, 1024, &buf) < 0)
+    if (virFileReadAllQuiet(sysfs_path, 1024, &buf) < 0)

Looks like the calls to this set the error or don't error out, so this
makes sense, but the other stub adds error, the previous call does too,
etc.  Looking at it more closely, everything that calls this function is
a bit of a mess regarding error reporting.  Just to not make it even
worse than before, I would suggest adding virFileExists() before this
and make the reporting optional.  Or simply make the previous function
call quiet as well.

        goto cleanup;

    if ((p = strchr(buf, '\n')))
diff --git a/tests/fchostdata/fc_host/host7/node_name b/tests/fchostdata/fc_host/host7/node_name
new file mode 100644
index 0000000..73a91bd
--- /dev/null
+++ b/tests/fchostdata/fc_host/host7/node_name
@@ -0,0 +1 @@
+0x2002001b32a9da4e
diff --git a/tests/fchostdata/fc_host/host7/port_name b/tests/fchostdata/fc_host/host7/port_name
new file mode 100644
index 0000000..f25abeb
--- /dev/null
+++ b/tests/fchostdata/fc_host/host7/port_name
@@ -0,0 +1 @@
+0x2102001b32a9da4e
diff --git a/tests/fchostdata/fc_host/host7/port_state b/tests/fchostdata/fc_host/host7/port_state
new file mode 100644
index 0000000..b73dd46
--- /dev/null
+++ b/tests/fchostdata/fc_host/host7/port_state
@@ -0,0 +1 @@
+Online
diff --git a/tests/fchosttest.c b/tests/fchosttest.c
index a08a2e8..ba580aa 100644
--- a/tests/fchosttest.c
+++ b/tests/fchosttest.c
@@ -29,13 +29,16 @@ static char *fchost_prefix;

#define TEST_FC_HOST_PREFIX fchost_prefix
#define TEST_FC_HOST_NUM 5
+#define TEST_FC_HOST_NUM_NO_FAB 7


The test number should be the same as the host number to make it
consistent, but it looks like it's not even the case now.  But that
doesn't mean we need to be butchering it even more.

/* Test virIsCapableFCHost */
static int
test1(const void *data ATTRIBUTE_UNUSED)
{
    if (virIsCapableFCHost(TEST_FC_HOST_PREFIX,
-                           TEST_FC_HOST_NUM))
+                           TEST_FC_HOST_NUM) &&
+        virIsCapableFCHost(TEST_FC_HOST_PREFIX,
+                           TEST_FC_HOST_NUM_NO_FAB))
        return 0;

    return -1;
@@ -106,10 +109,43 @@ test3(const void *data ATTRIBUTE_UNUSED)
    return ret;
}

-/* Test virGetFCHostNameByWWN */
+/* Test virReadFCHost fabric name optional */
static int
test4(const void *data ATTRIBUTE_UNUSED)
{
+    const char *expect_wwnn = "2002001b32a9da4e";
+    const char *expect_wwpn = "2102001b32a9da4e";
+    char *wwnn = NULL;
+    char *wwpn = NULL;
+    int ret = -1;
+
+    if (!(wwnn = virReadFCHost(TEST_FC_HOST_PREFIX, TEST_FC_HOST_NUM_NO_FAB,
+                               "node_name")))
+        return -1;
+
+    if (!(wwpn = virReadFCHost(TEST_FC_HOST_PREFIX, TEST_FC_HOST_NUM_NO_FAB,
+                               "port_name")))
+        goto cleanup;
+
+    if (virReadFCHost(TEST_FC_HOST_PREFIX, TEST_FC_HOST_NUM_NO_FAB,
+                      "fabric_name"))
+        goto cleanup;
+
+    if (STRNEQ(expect_wwnn, wwnn) ||
+        STRNEQ(expect_wwpn, wwpn))
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    VIR_FREE(wwnn);
+    VIR_FREE(wwpn);
+    return ret;
+}
+
+/* Test virGetFCHostNameByWWN */
+static int
+test5(const void *data ATTRIBUTE_UNUSED)
+{
    const char *expect_hostname = "host5";
    char *hostname = NULL;
    int ret = -1;

Why don't you add it as a test6?

@@ -130,7 +166,7 @@ test4(const void *data ATTRIBUTE_UNUSED)

/* Test virFindFCHostCapableVport (host4 is not Online) */
static int
-test5(const void *data ATTRIBUTE_UNUSED)
+test6(const void *data ATTRIBUTE_UNUSED)
{
    const char *expect_hostname = "host5";
    char *hostname = NULL;
@@ -169,6 +205,8 @@ mymain(void)
        ret = -1;
    if (virTestRun("test5", test5, NULL) < 0)
        ret = -1;
+    if (virTestRun("test6", test6, NULL) < 0)
+        ret = -1;

 cleanup:
    VIR_FREE(fchost_prefix);
--
2.5.5

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

Attachment: signature.asc
Description: Digital signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]
  Powered by Linux