]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nodedev: Introduce virNodeDeviceObjListFindSCSIHostByWWNs
authorJohn Ferlan <jferlan@redhat.com>
Fri, 12 May 2017 19:31:10 +0000 (15:31 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 17 Jul 2017 14:40:24 +0000 (10:40 -0400)
In an overall effort to privatize access to virNodeDeviceObj and
virNodeDeviceObjList into the virnodedeviceobj module, move the
object list parsing from node_device_driver and replace with a
call to a virnodedeviceobj helper. This follows other similar
APIs/helpers which peruse the object list looking for some specific
data in order to get/return an @device (virNodeDevice) object to
the caller.

Signed-off-by: John Ferlan <jferlan@redhat.com>
src/conf/virnodedeviceobj.c
src/conf/virnodedeviceobj.h
src/libvirt_private.syms
src/node_device/node_device_driver.c

index bcd2324a931aaff4e0a6b19493252e9fad4c8b7e..781f35d0deaec46d3a66c4bc8862aaed32d330f9 100644 (file)
@@ -273,6 +273,39 @@ virNodeDeviceObjListFindByCap(virNodeDeviceObjListPtr devs,
 }
 
 
+virNodeDeviceObjPtr
+virNodeDeviceObjListFindSCSIHostByWWNs(virNodeDeviceObjListPtr devs,
+                                       const char *wwnn,
+                                       const char *wwpn)
+{
+    size_t i;
+
+    for (i = 0; i < devs->count; i++) {
+        virNodeDeviceObjPtr obj = devs->objs[i];
+        virNodeDevCapsDefPtr cap;
+
+        virNodeDeviceObjLock(obj);
+        cap = obj->def->caps;
+
+        while (cap) {
+            if (cap->data.type == VIR_NODE_DEV_CAP_SCSI_HOST) {
+                virNodeDeviceGetSCSIHostCaps(&cap->data.scsi_host);
+                if (cap->data.scsi_host.flags &
+                    VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
+                    if (STREQ(cap->data.scsi_host.wwnn, wwnn) &&
+                        STREQ(cap->data.scsi_host.wwpn, wwpn))
+                        return obj;
+                }
+            }
+            cap = cap->next;
+        }
+        virNodeDeviceObjUnlock(obj);
+    }
+
+    return NULL;
+}
+
+
 void
 virNodeDeviceObjFree(virNodeDeviceObjPtr obj)
 {
index 6194c6c7252f3bf5d6edd30e484d41c13f2379e2..6ec5ee7636cbbbcbd6c640a8a829b8644470df4e 100644 (file)
@@ -52,6 +52,11 @@ virNodeDeviceObjListFindBySysfsPath(virNodeDeviceObjListPtr devs,
                                     const char *sysfs_path)
     ATTRIBUTE_NONNULL(2);
 
+virNodeDeviceObjPtr
+virNodeDeviceObjListFindSCSIHostByWWNs(virNodeDeviceObjListPtr devs,
+                                       const char *wwnn,
+                                       const char *wwpn);
+
 virNodeDeviceObjPtr
 virNodeDeviceObjListAssignDef(virNodeDeviceObjListPtr devs,
                               virNodeDeviceDefPtr def);
index cc83d07b87ebf4c7318dde402b6f67bdc3683564..a6bd03b3cc1fea2136fce7bd68025018482b3e3d 100644 (file)
@@ -970,6 +970,7 @@ virNodeDeviceObjListAssignDef;
 virNodeDeviceObjListExport;
 virNodeDeviceObjListFindByName;
 virNodeDeviceObjListFindBySysfsPath;
+virNodeDeviceObjListFindSCSIHostByWWNs;
 virNodeDeviceObjListFree;
 virNodeDeviceObjListGetNames;
 virNodeDeviceObjListGetParentHost;
index 930f9b6e5d05dc861688bd855bc21c34b272e86d..85a7c8884540c804a2d583be42da7cfe4964f76c 100644 (file)
@@ -288,9 +288,6 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
                               const char *wwpn,
                               unsigned int flags)
 {
-    size_t i;
-    virNodeDeviceObjListPtr devs = driver->devs;
-    virNodeDevCapsDefPtr cap = NULL;
     virNodeDeviceObjPtr obj = NULL;
     virNodeDeviceDefPtr def;
     virNodeDevicePtr device = NULL;
@@ -298,48 +295,27 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
     virCheckFlags(0, NULL);
 
     nodeDeviceLock();
+    obj = virNodeDeviceObjListFindSCSIHostByWWNs(driver->devs, wwnn, wwpn);
+    nodeDeviceUnlock();
 
-    for (i = 0; i < devs->count; i++) {
-        obj = devs->objs[i];
-        virNodeDeviceObjLock(obj);
-        def = virNodeDeviceObjGetDef(obj);
-        cap = def->caps;
-
-        while (cap) {
-            if (cap->data.type == VIR_NODE_DEV_CAP_SCSI_HOST) {
-                nodeDeviceSysfsGetSCSIHostCaps(&cap->data.scsi_host);
-                if (cap->data.scsi_host.flags &
-                    VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
-                    if (STREQ(cap->data.scsi_host.wwnn, wwnn) &&
-                        STREQ(cap->data.scsi_host.wwpn, wwpn)) {
-
-                        if (virNodeDeviceLookupSCSIHostByWWNEnsureACL(conn, def) < 0)
-                            goto error;
-
-                        if ((device = virGetNodeDevice(conn, def->name))) {
-                            if (VIR_STRDUP(device->parent, def->parent) < 0) {
-                                virObjectUnref(device);
-                                device = NULL;
-                            }
-                        }
-                        virNodeDeviceObjUnlock(obj);
-                        goto out;
-                    }
-                }
-            }
-            cap = cap->next;
-        }
+    if (!obj)
+        return NULL;
 
-        virNodeDeviceObjUnlock(obj);
-    }
+    def = virNodeDeviceObjGetDef(obj);
 
- out:
-    nodeDeviceUnlock();
-    return device;
+    if (virNodeDeviceLookupSCSIHostByWWNEnsureACL(conn, def) < 0)
+        goto cleanup;
 
- error:
+    if ((device = virGetNodeDevice(conn, def->name))) {
+        if (VIR_STRDUP(device->parent, def->parent) < 0) {
+            virObjectUnref(device);
+            device = NULL;
+        }
+    }
+
+ cleanup:
     virNodeDeviceObjUnlock(obj);
-    goto out;
+    return device;
 }