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);