From 78be2e8b7460352f1c5041aa670194e52149947a Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Fri, 18 Nov 2016 07:08:37 -0500 Subject: [PATCH] iscsi: Add parent wwnn/wwpn or fabric capability for createVport https://bugzilla.redhat.com/show_bug.cgi?id=1349696 As it turns out using only the 'parent' to achieve the goal of a consistent vHBA parent has issues with reboots where the scsi_hostX parent could change to scsi_hostY causing either failure to create the vHBA or usage of the wrong HBA for our vHBA. Thus add the ability to search for the "parent" by the parent wwnn/ wwpn values or just a fabric_name if someone only cares to ensure usage of the same SAN for the vHBA. --- src/storage/storage_backend_scsi.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index 25a8deaf38..be02f6eec0 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -695,6 +695,7 @@ createVport(virConnectPtr conn, unsigned int parent_host; char *name = NULL; char *parent_hoststr = NULL; + bool skip_capable_check = false; virStoragePoolFCRefreshInfoPtr cbdata = NULL; virThread thread; int ret = -1; @@ -725,6 +726,23 @@ createVport(virConnectPtr conn, if (adapter->data.fchost.parent) { if (VIR_STRDUP(parent_hoststr, adapter->data.fchost.parent) < 0) goto cleanup; + } else if (adapter->data.fchost.parent_wwnn && + adapter->data.fchost.parent_wwpn) { + if (!(parent_hoststr = + virGetFCHostNameByWWN(NULL, adapter->data.fchost.parent_wwnn, + adapter->data.fchost.parent_wwpn))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("cannot find parent using provided wwnn/wwpn")); + goto cleanup; + } + } else if (adapter->data.fchost.parent_fabric_wwn) { + if (!(parent_hoststr = + virGetFCHostNameByFabricWWN(NULL, + adapter->data.fchost.parent_fabric_wwn))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("cannot find parent using provided fabric_wwn")); + goto cleanup; + } } else { if (!(parent_hoststr = virFindFCHostCapableVport(NULL))) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -732,6 +750,7 @@ createVport(virConnectPtr conn, "cannot find one on this host")); goto cleanup; } + skip_capable_check = true; } if (virGetSCSIHostNumber(parent_hoststr, &parent_host) < 0) @@ -745,7 +764,7 @@ createVport(virConnectPtr conn, * parent. Besides we have a way to determine the parent based on * the 'name' field. */ - if (adapter->data.fchost.parent && !virIsCapableFCHost(NULL, parent_host)) { + if (!skip_capable_check && !virIsCapableFCHost(NULL, parent_host)) { virReportError(VIR_ERR_XML_ERROR, _("parent '%s' specified for vHBA is not vport capable"), parent_hoststr); -- GitLab