mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-05 13:17:51 +03:00
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 <fiuczy@linux.vnet.ibm.com>
This commit is contained in:
parent
d59226926e
commit
666bee3973
@ -254,7 +254,7 @@
|
|||||||
number of vport in use. <code>max_vports</code> shows the
|
number of vport in use. <code>max_vports</code> shows the
|
||||||
maximum vports the HBA supports. "fc_host" implies following
|
maximum vports the HBA supports. "fc_host" implies following
|
||||||
sub-elements: <code>wwnn</code>, <code>wwpn</code>, and
|
sub-elements: <code>wwnn</code>, <code>wwpn</code>, and
|
||||||
<code>fabric_wwn</code>.
|
optionally <code>fabric_wwn</code>.
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</dd>
|
</dd>
|
||||||
|
@ -18,7 +18,18 @@
|
|||||||
<change/>
|
<change/>
|
||||||
</section>
|
</section>
|
||||||
<section title="Bug fixes">
|
<section title="Bug fixes">
|
||||||
<change/>
|
<change>
|
||||||
|
<summary>
|
||||||
|
nodedev: Fabric name must not be required for fc_host capability
|
||||||
|
</summary>
|
||||||
|
<description>
|
||||||
|
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.
|
||||||
|
</description>
|
||||||
|
</change>
|
||||||
</section>
|
</section>
|
||||||
</release>
|
</release>
|
||||||
<release version="v3.0.0" date="2017-01-17">
|
<release version="v3.0.0" date="2017-01-17">
|
||||||
|
@ -367,9 +367,11 @@
|
|||||||
<ref name='wwn'/>
|
<ref name='wwn'/>
|
||||||
</element>
|
</element>
|
||||||
|
|
||||||
|
<optional>
|
||||||
<element name='fabric_wwn'>
|
<element name='fabric_wwn'>
|
||||||
<ref name='wwn'/>
|
<ref name='wwn'/>
|
||||||
</element>
|
</element>
|
||||||
|
</optional>
|
||||||
</define>
|
</define>
|
||||||
|
|
||||||
<define name='capsvports'>
|
<define name='capsvports'>
|
||||||
|
@ -72,14 +72,11 @@ nodeDeviceSysfsGetSCSIHostCaps(virNodeDevCapDataPtr d)
|
|||||||
VIR_FREE(d->scsi_host.wwnn);
|
VIR_FREE(d->scsi_host.wwnn);
|
||||||
VIR_STEAL_PTR(d->scsi_host.wwnn, tmp);
|
VIR_STEAL_PTR(d->scsi_host.wwnn, tmp);
|
||||||
|
|
||||||
if (!(tmp = virReadFCHost(NULL, d->scsi_host.host, "fabric_name"))) {
|
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;
|
|
||||||
}
|
|
||||||
VIR_FREE(d->scsi_host.fabric_wwn);
|
VIR_FREE(d->scsi_host.fabric_wwn);
|
||||||
VIR_STEAL_PTR(d->scsi_host.fabric_wwn, tmp);
|
VIR_STEAL_PTR(d->scsi_host.fabric_wwn, tmp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (virIsCapableVport(NULL, d->scsi_host.host)) {
|
if (virIsCapableVport(NULL, d->scsi_host.host)) {
|
||||||
d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS;
|
d->scsi_host.flags |= VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS;
|
||||||
|
1
tests/fchostdata/fc_host/host6/node_name
Normal file
1
tests/fchostdata/fc_host/host6/node_name
Normal file
@ -0,0 +1 @@
|
|||||||
|
0x2002001b32a9da4e
|
1
tests/fchostdata/fc_host/host6/port_name
Normal file
1
tests/fchostdata/fc_host/host6/port_name
Normal file
@ -0,0 +1 @@
|
|||||||
|
0x2102001b32a9da4e
|
1
tests/fchostdata/fc_host/host6/port_state
Normal file
1
tests/fchostdata/fc_host/host6/port_state
Normal file
@ -0,0 +1 @@
|
|||||||
|
Online
|
@ -29,13 +29,16 @@ static char *fchost_prefix;
|
|||||||
|
|
||||||
#define TEST_FC_HOST_PREFIX fchost_prefix
|
#define TEST_FC_HOST_PREFIX fchost_prefix
|
||||||
#define TEST_FC_HOST_NUM 5
|
#define TEST_FC_HOST_NUM 5
|
||||||
|
#define TEST_FC_HOST_NUM_NO_FAB 6
|
||||||
|
|
||||||
/* Test virIsCapableFCHost */
|
/* Test virIsCapableFCHost */
|
||||||
static int
|
static int
|
||||||
test1(const void *data ATTRIBUTE_UNUSED)
|
test1(const void *data ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
if (virIsCapableFCHost(TEST_FC_HOST_PREFIX,
|
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 0;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -148,6 +151,39 @@ test5(const void *data ATTRIBUTE_UNUSED)
|
|||||||
return ret;
|
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
|
static int
|
||||||
mymain(void)
|
mymain(void)
|
||||||
{
|
{
|
||||||
@ -169,6 +205,8 @@ mymain(void)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
if (virTestRun("test5", test5, NULL) < 0)
|
if (virTestRun("test5", test5, NULL) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
if (virTestRun("test6", test6, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(fchost_prefix);
|
VIR_FREE(fchost_prefix);
|
||||||
|
Loading…
Reference in New Issue
Block a user