From 666bee397371d830ecfdbf92f6110a12b3a126f5 Mon Sep 17 00:00:00 2001 From: Boris Fiuczynski Date: Mon, 16 Jan 2017 14:27:34 +0100 Subject: [PATCH] nodedev: Fabric name must not be required for fc_host capability 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 --- docs/formatnode.html.in | 2 +- docs/news.xml | 13 +++++++- docs/schemas/nodedev.rng | 8 +++-- src/node_device/node_device_linux_sysfs.c | 9 ++--- tests/fchostdata/fc_host/host6/node_name | 1 + tests/fchostdata/fc_host/host6/port_name | 1 + tests/fchostdata/fc_host/host6/port_state | 1 + tests/fchosttest.c | 40 ++++++++++++++++++++++- 8 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 tests/fchostdata/fc_host/host6/node_name create mode 100644 tests/fchostdata/fc_host/host6/port_name create mode 100644 tests/fchostdata/fc_host/host6/port_state diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index e7b11400cb..f8d0e12340 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -254,7 +254,7 @@ number of vport in use. max_vports shows the maximum vports the HBA supports. "fc_host" implies following sub-elements: wwnn, wwpn, and - fabric_wwn. + optionally fabric_wwn. diff --git a/docs/news.xml b/docs/news.xml index 4ff0cb638e..6932163db4 100644 --- a/docs/news.xml +++ b/docs/news.xml @@ -18,7 +18,18 @@
- + + + nodedev: Fabric name must not be required for fc_host capability + + + 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. For example the zfcp device driver does not provide a + fabric name for an fcp host. The requirement for the existence of + a fabric name has been removed by making it optional. + +
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 9c9840207c..b100a6e16d 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -367,9 +367,11 @@ - - - + + + + + diff --git a/src/node_device/node_device_linux_sysfs.c b/src/node_device/node_device_linux_sysfs.c index be99c416ed..13520cd211 100644 --- a/src/node_device/node_device_linux_sysfs.c +++ b/src/node_device/node_device_linux_sysfs.c @@ -72,13 +72,10 @@ nodeDeviceSysfsGetSCSIHostCaps(virNodeDevCapDataPtr d) VIR_FREE(d->scsi_host.wwnn); 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", - d->scsi_host.host); - goto cleanup; + if ((tmp = virReadFCHost(NULL, d->scsi_host.host, "fabric_name"))) { + VIR_FREE(d->scsi_host.fabric_wwn); + VIR_STEAL_PTR(d->scsi_host.fabric_wwn, tmp); } - VIR_FREE(d->scsi_host.fabric_wwn); - VIR_STEAL_PTR(d->scsi_host.fabric_wwn, tmp); } if (virIsCapableVport(NULL, d->scsi_host.host)) { diff --git a/tests/fchostdata/fc_host/host6/node_name b/tests/fchostdata/fc_host/host6/node_name new file mode 100644 index 0000000000..73a91bdd51 --- /dev/null +++ b/tests/fchostdata/fc_host/host6/node_name @@ -0,0 +1 @@ +0x2002001b32a9da4e diff --git a/tests/fchostdata/fc_host/host6/port_name b/tests/fchostdata/fc_host/host6/port_name new file mode 100644 index 0000000000..f25abeb08a --- /dev/null +++ b/tests/fchostdata/fc_host/host6/port_name @@ -0,0 +1 @@ +0x2102001b32a9da4e diff --git a/tests/fchostdata/fc_host/host6/port_state b/tests/fchostdata/fc_host/host6/port_state new file mode 100644 index 0000000000..b73dd4613e --- /dev/null +++ b/tests/fchostdata/fc_host/host6/port_state @@ -0,0 +1 @@ +Online diff --git a/tests/fchosttest.c b/tests/fchosttest.c index a08a2e8e1a..bb35b8846e 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 6 /* 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; @@ -148,6 +151,39 @@ test5(const void *data ATTRIBUTE_UNUSED) return ret; } +/* Test virReadFCHost fabric name optional */ +static int +test6(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; +} + static int mymain(void) { @@ -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);