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(a)linux.vnet.ibm.com>
Reviewed-by: Bjoern Walk <bwalk(a)linux.vnet.ibm.com>
---
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.
*/
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)
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
/* 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;
@@ -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