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. */ 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list