[libvirt] [PATCH v3 10/12] nodedev: Introduce virNodeDeviceObjListFindSCSIHostByWWNs

John Ferlan jferlan at redhat.com
Mon Jul 3 20:54:21 UTC 2017



On 07/03/2017 09:12 AM, Erik Skultety wrote:
> On Sat, Jun 03, 2017 at 09:12:00AM -0400, John Ferlan wrote:
>> Alter the nodeDeviceLookupSCSIHostByWWN to use the new API in order
>> to find what it's looking for.
>>
> 
> Would you mind enhancing the commit message a bit? I assume the new API is
> virNodeDeviceGetSCSIHostCaps but a random reader would lack the context. It
> misses the main motivation to move nodeDeviceLookupSCSIHostByWWN out of the
> driver simply because of the NodeDeviceObj privatization. Also, this got me
> thinking, whether 9/10 and 10/10 is critical for this series, so I tried to
> rewrite it without it and somewhere down the road I decided that it was an
> ugly, pointless waste of time and I like it this way much more.
> 
> ACK if you enhance the commit message a bit.
> 
> Erik
> 

Sure I'll add some details...

My first hack at 9/12 wasn't well received either since I moved too
much, see:

https://www.redhat.com/archives/libvir-list/2017-May/msg00722.html

and followups to that.  So I took the move and call path of less
resistance. The 10/12 change just follows other Lookup functions. It'll
get even more interesting soon when you see patch 13.

John

>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/conf/virnodedeviceobj.c          | 33 +++++++++++++++++++++
>>  src/conf/virnodedeviceobj.h          |  5 ++++
>>  src/libvirt_private.syms             |  1 +
>>  src/node_device/node_device_driver.c | 56 +++++++++++-------------------------
>>  4 files changed, 55 insertions(+), 40 deletions(-)
>>
>> diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
>> index a9187be..fa61a2d 100644
>> --- a/src/conf/virnodedeviceobj.c
>> +++ b/src/conf/virnodedeviceobj.c
>> @@ -274,6 +274,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)
>>  {
>> diff --git a/src/conf/virnodedeviceobj.h b/src/conf/virnodedeviceobj.h
>> index 6194c6c..6ec5ee7 100644
>> --- a/src/conf/virnodedeviceobj.h
>> +++ b/src/conf/virnodedeviceobj.h
>> @@ -53,6 +53,11 @@ virNodeDeviceObjListFindBySysfsPath(virNodeDeviceObjListPtr devs,
>>      ATTRIBUTE_NONNULL(2);
>>
>>  virNodeDeviceObjPtr
>> +virNodeDeviceObjListFindSCSIHostByWWNs(virNodeDeviceObjListPtr devs,
>> +                                       const char *wwnn,
>> +                                       const char *wwpn);
>> +
>> +virNodeDeviceObjPtr
>>  virNodeDeviceObjListAssignDef(virNodeDeviceObjListPtr devs,
>>                                virNodeDeviceDefPtr def);
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 33fc9fc..d415888 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -963,6 +963,7 @@ virNodeDeviceObjListAssignDef;
>>  virNodeDeviceObjListExport;
>>  virNodeDeviceObjListFindByName;
>>  virNodeDeviceObjListFindBySysfsPath;
>> +virNodeDeviceObjListFindSCSIHostByWWNs;
>>  virNodeDeviceObjListFree;
>>  virNodeDeviceObjListGetNames;
>>  virNodeDeviceObjListGetParentHost;
>> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
>> index 348539f..4a5f168 100644
>> --- a/src/node_device/node_device_driver.c
>> +++ b/src/node_device/node_device_driver.c
>> @@ -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;
>>  }
>>
>>
>> --
>> 2.9.4
>>
>> --
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list