[libvirt] [PATCH 2/3] node device: Break out get_wwns and get_parent_node helpers
Cole Robinson
crobinso at redhat.com
Tue Oct 20 19:42:48 UTC 2009
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 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
>
Thanks, I've pushed this now.
- Cole
More information about the libvir-list
mailing list