[libvirt] [PATCH 2/3] node device: Break out get_wwns and get_parent_node helpers

Dave Allan dallan at redhat.com
Tue Oct 20 15:55:17 UTC 2009


Cole Robinson wrote:
> These will be used by the test driver, so move them to a shareable space.
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  src/conf/node_device_conf.c          |   89 +++++++++++++++++++++++++++
>  src/conf/node_device_conf.h          |   11 +++
>  src/libvirt_private.syms             |    2 +
>  src/node_device/node_device_driver.c |  112 ++++------------------------------
>  4 files changed, 115 insertions(+), 99 deletions(-)
> 
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index f09f814..77f7be3 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -1215,6 +1215,95 @@ virNodeDeviceDefParseFile(virConnectPtr conn,
>      return virNodeDeviceDefParse(conn, NULL, filename, create);
>  }
>  
> +/*
> + * Return fc_host dev's WWNN and WWPN
> + */
> +int
> +virNodeDeviceGetWWNs(virConnectPtr conn,
> +                     virNodeDeviceDefPtr def,
> +                     char **wwnn,
> +                     char **wwpn)
> +{
> +    virNodeDevCapsDefPtr cap = NULL;
> +    int ret = 0;
> +
> +    cap = def->caps;
> +    while (cap != NULL) {
> +        if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
> +            cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
> +            *wwnn = strdup(cap->data.scsi_host.wwnn);
> +            *wwpn = strdup(cap->data.scsi_host.wwpn);
> +            break;
> +        }
> +
> +        cap = cap->next;
> +    }
> +
> +    if (cap == NULL) {
> +        virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT,
> +                                 "%s", _("Device is not a fibre channel HBA"));
> +        ret = -1;
> +    }
> +
> +    if (*wwnn == NULL || *wwpn == NULL) {
> +        /* Free the other one, if allocated... */
> +        VIR_FREE(wwnn);
> +        VIR_FREE(wwpn);
> +        ret = -1;
> +        virReportOOMError(conn);
> +    }
> +
> +    return ret;
> +}
> +
> +/*
> + * Return the NPIV dev's parent device name
> + */
> +int
> +virNodeDeviceGetParentHost(virConnectPtr conn,
> +                           const virNodeDeviceObjListPtr devs,
> +                           const char *dev_name,
> +                           const char *parent_name,
> +                           int *parent_host)
> +{
> +    virNodeDeviceObjPtr parent = NULL;
> +    virNodeDevCapsDefPtr cap = NULL;
> +    int ret = 0;
> +
> +    parent = virNodeDeviceFindByName(devs, parent_name);
> +    if (parent == NULL) {
> +        virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                                 _("Could not find parent HBA for '%s'"),
> +                                 dev_name);
> +        ret = -1;
> +        goto out;
> +    }
> +
> +    cap = parent->def->caps;
> +    while (cap != NULL) {
> +        if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
> +            (cap->data.scsi_host.flags &
> +             VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS)) {
> +                *parent_host = cap->data.scsi_host.host;
> +                break;
> +        }
> +
> +        cap = cap->next;
> +    }
> +
> +    if (cap == NULL) {
> +        virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                                 _("Parent HBA %s is not capable "
> +                                   "of vport operations"),
> +                                 parent->def->name);
> +        ret = -1;
> +    }
> +
> +    virNodeDeviceObjUnlock(parent);
> +
> +out:
> +    return ret;
> +}
>  
>  void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
>  {
> diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
> index 29a4d43..a7bb6c6 100644
> --- a/src/conf/node_device_conf.h
> +++ b/src/conf/node_device_conf.h
> @@ -221,6 +221,17 @@ virNodeDeviceDefPtr virNodeDeviceDefParseNode(virConnectPtr conn,
>                                                xmlNodePtr root,
>                                                int create);
>  
> +int virNodeDeviceGetWWNs(virConnectPtr conn,
> +                         virNodeDeviceDefPtr def,
> +                         char **wwnn,
> +                         char **wwpn);
> +
> +int virNodeDeviceGetParentHost(virConnectPtr conn,
> +                               const virNodeDeviceObjListPtr devs,
> +                               const char *dev_name,
> +                               const char *parent_name,
> +                               int *parent_host);
> +
>  void virNodeDeviceDefFree(virNodeDeviceDefPtr def);
>  
>  void virNodeDeviceObjFree(virNodeDeviceObjPtr dev);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 37395ab..45d1069 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -318,6 +318,8 @@ virNodeDeviceDefParseString;
>  virNodeDeviceObjLock;
>  virNodeDeviceObjUnlock;
>  virNodeDeviceAssignDef;
> +virNodeDeviceGetWWNs;
> +virNodeDeviceGetParentHost;
>  
>  
>  # pci.h
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index 21a4c8d..f33ff48 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -459,92 +459,6 @@ cleanup:
>  
>  
>  static int
> -get_wwns(virConnectPtr conn,
> -         virNodeDeviceDefPtr def,
> -         char **wwnn,
> -         char **wwpn)
> -{
> -    virNodeDevCapsDefPtr cap = NULL;
> -    int ret = 0;
> -
> -    cap = def->caps;
> -    while (cap != NULL) {
> -        if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
> -            cap->data.scsi_host.flags & VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST) {
> -            *wwnn = strdup(cap->data.scsi_host.wwnn);
> -            *wwpn = strdup(cap->data.scsi_host.wwpn);
> -            break;
> -        }
> -
> -        cap = cap->next;
> -    }
> -
> -    if (cap == NULL) {
> -        virNodeDeviceReportError(conn, VIR_ERR_NO_SUPPORT,
> -                                 "%s", _("Device is not a fibre channel HBA"));
> -        ret = -1;
> -    }
> -
> -    if (*wwnn == NULL || *wwpn == NULL) {
> -        /* Free the other one, if allocated... */
> -        VIR_FREE(wwnn);
> -        VIR_FREE(wwpn);
> -        ret = -1;
> -        virReportOOMError(conn);
> -    }
> -
> -    return ret;
> -}
> -
> -
> -static int
> -get_parent_host(virConnectPtr conn,
> -                virDeviceMonitorStatePtr driver,
> -                const char *dev_name,
> -                const char *parent_name,
> -                int *parent_host)
> -{
> -    virNodeDeviceObjPtr parent = NULL;
> -    virNodeDevCapsDefPtr cap = NULL;
> -    int ret = 0;
> -
> -    parent = virNodeDeviceFindByName(&driver->devs, parent_name);
> -    if (parent == NULL) {
> -        virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
> -                                 _("Could not find parent HBA for '%s'"),
> -                                 dev_name);
> -        ret = -1;
> -        goto out;
> -    }
> -
> -    cap = parent->def->caps;
> -    while (cap != NULL) {
> -        if (cap->type == VIR_NODE_DEV_CAP_SCSI_HOST &&
> -            (cap->data.scsi_host.flags &
> -             VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS)) {
> -                *parent_host = cap->data.scsi_host.host;
> -                break;
> -        }
> -
> -        cap = cap->next;
> -    }
> -
> -    if (cap == NULL) {
> -        virNodeDeviceReportError(conn, VIR_ERR_INTERNAL_ERROR,
> -                                 _("Parent HBA %s is not capable "
> -                                   "of vport operations"),
> -                                 parent->def->name);
> -        ret = -1;
> -    }
> -
> -    virNodeDeviceObjUnlock(parent);
> -
> -out:
> -    return ret;
> -}
> -
> -
> -static int
>  get_time(virConnectPtr conn, time_t *t)
>  {
>      int ret = 0;
> @@ -630,15 +544,15 @@ nodeDeviceCreateXML(virConnectPtr conn,
>          goto cleanup;
>      }
>  
> -    if (get_wwns(conn, def, &wwnn, &wwpn) == -1) {
> +    if (virNodeDeviceGetWWNs(conn, def, &wwnn, &wwpn) == -1) {
>          goto cleanup;
>      }
>  
> -    if (get_parent_host(conn,
> -                        driver,
> -                        def->name,
> -                        def->parent,
> -                        &parent_host) == -1) {
> +    if (virNodeDeviceGetParentHost(conn,
> +                                   &driver->devs,
> +                                   def->name,
> +                                   def->parent,
> +                                   &parent_host) == -1) {
>          goto cleanup;
>      }
>  
> @@ -685,13 +599,13 @@ nodeDeviceDestroy(virNodeDevicePtr dev)
>          goto out;
>      }
>  
> -    if (get_wwns(dev->conn, obj->def, &wwnn, &wwpn) == -1) {
> +    if (virNodeDeviceGetWWNs(dev->conn, obj->def, &wwnn, &wwpn) == -1) {
>          goto out;
>      }
>  
>      parent_name = strdup(obj->def->parent);
>  
> -    /* get_parent_host will cause the device object's lock to be
> +    /* virNodeDeviceGetParentHost will cause the device object's lock to be
>       * taken, so we have to dup the parent's name and drop the lock
>       * before calling it.  We don't need the reference to the object
>       * any more once we have the parent's name.  */
> @@ -703,11 +617,11 @@ nodeDeviceDestroy(virNodeDevicePtr dev)
>          goto out;
>      }
>  
> -    if (get_parent_host(dev->conn,
> -                        driver,
> -                        dev->name,
> -                        parent_name,
> -                        &parent_host) == -1) {
> +    if (virNodeDeviceGetParentHost(dev->conn,
> +                                   &driver->devs,
> +                                   dev->name,
> +                                   parent_name,
> +                                   &parent_host) == -1) {
>          goto out;
>      }
>  

Ack

Dave




More information about the libvir-list mailing list