[libvirt] [PATCH 11/11] iscsi: Add parent wwnn/wwpn or fabric capability for createVport

John Ferlan jferlan at redhat.com
Fri Nov 18 14:26:37 UTC 2016


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.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/storage/storage_backend_scsi.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
index df48b1a..4f13d5c 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,14 +750,15 @@ createVport(virConnectPtr conn,
                              "cannot find one on this host"));
             goto cleanup;
         }
+        skip_capable_check = true;
     }
 
     if (virGetSCSIHostNumber(parent_hoststr, &parent_host) < 0)
         goto cleanup;
 
-    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 '%s' is not vport capable"),
                        parent_hoststr);
         goto cleanup;
     }
-- 
2.7.4




More information about the libvir-list mailing list