On 10/20/2009 11:55 AM, Dave Allan wrote:
Cole Robinson wrote:
> These will be used by the test driver, so move them to a shareable space.
>
> Signed-off-by: Cole Robinson <crobinso(a)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
Thanks, I've pushed this now.
- Cole