Use the new virNodeDeviceGetParentName instead. Modify the callers to build the node device scsi_host# name string in order to call the new function so that proper lookup occurs. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- Changes since v1: This is the replacement/followup for the previous patch 7 which rename the virStoragePoolGetVhbaSCSIHostParent. Instead the code will now use the new virNodeDeviceGetParentName function passing the scsi_hostN name as generated in each of the callers (what would have been done by the calling code in the v1 code). src/conf/storage_conf.c | 70 ++++++-------------------------------- src/conf/storage_conf.h | 5 --- src/libvirt_private.syms | 1 - src/storage/storage_backend_scsi.c | 23 +++++++++---- 4 files changed, 27 insertions(+), 72 deletions(-) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index fff7285..80ec438 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -35,6 +35,7 @@ #include "virerror.h" #include "datatypes.h" +#include "node_device_conf.h" #include "storage_conf.h" #include "virstoragefile.h" @@ -2275,64 +2276,6 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools, return ret; } -/* - * virStoragePoolGetVhbaSCSIHostParent: - * - * Using the Node Device Driver, find the host# name found via wwnn/wwpn - * lookup in the fc_host sysfs tree (e.g. virGetFCHostNameByWWN) to get - * the parent 'scsi_host#'. - * - * @conn: Connection pointer (must be non-NULL on entry) - * @name: Pointer a string from a virGetFCHostNameByWWN (e.g., "host#") - * - * Returns a "scsi_host#" string of the parent of the vHBA - */ -char * -virStoragePoolGetVhbaSCSIHostParent(virConnectPtr conn, - const char *name) -{ - char *nodedev_name = NULL; - virNodeDevicePtr device = NULL; - char *xml = NULL; - virNodeDeviceDefPtr def = NULL; - char *vhba_parent = NULL; - - VIR_DEBUG("conn=%p, name=%s", conn, name); - - /* We get passed "host#" from the return from virGetFCHostNameByWWN, - * so we need to adjust that to what the nodedev lookup expects - */ - if (virAsprintf(&nodedev_name, "scsi_%s", name) < 0) - goto cleanup; - - /* Compare the scsi_host for the name with the provided parent - * if not the same, then fail - */ - if (!(device = virNodeDeviceLookupByName(conn, nodedev_name))) { - virReportError(VIR_ERR_XML_ERROR, - _("Cannot find '%s' in node device database"), - nodedev_name); - goto cleanup; - } - - if (!(xml = virNodeDeviceGetXMLDesc(device, 0))) - goto cleanup; - - if (!(def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL))) - goto cleanup; - - /* The caller checks whether the returned value is NULL or not - * before continuing - */ - ignore_value(VIR_STRDUP(vhba_parent, def->parent)); - - cleanup: - VIR_FREE(nodedev_name); - virNodeDeviceDefFree(def); - VIR_FREE(xml); - virObjectUnref(device); - return vhba_parent; -} static int getSCSIHostNumber(virStoragePoolSourceAdapter adapter, @@ -2383,6 +2326,7 @@ matchFCHostToSCSIHost(virConnectPtr conn, unsigned int scsi_hostnum) { char *name = NULL; + char *scsi_host_name = NULL; char *parent_name = NULL; unsigned int fc_hostnum; @@ -2415,8 +2359,13 @@ matchFCHostToSCSIHost(virConnectPtr conn, * have a match. */ if (conn && !fc_adapter.data.fchost.parent) { - parent_name = virStoragePoolGetVhbaSCSIHostParent(conn, name); - if (parent_name) { + if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0) { + VIR_FREE(name); + return false; + } + if ((parent_name = virNodeDeviceGetParentName(conn, + scsi_host_name))) { + VIR_FREE(scsi_host_name); if (virGetSCSIHostNumber(parent_name, &fc_hostnum) == 0 && scsi_hostnum == fc_hostnum) { VIR_FREE(parent_name); @@ -2428,6 +2377,7 @@ matchFCHostToSCSIHost(virConnectPtr conn, /* Throw away the error and fall through */ virResetLastError(); VIR_DEBUG("Could not determine parent vHBA"); + VIR_FREE(scsi_host_name); } } VIR_FREE(name); diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index e952f5f..1723afc 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -30,7 +30,6 @@ # include "virbitmap.h" # include "virthread.h" # include "device_conf.h" -# include "node_device_conf.h" # include "object_event.h" # include <libxml/tree.h> @@ -418,10 +417,6 @@ int virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools, virStoragePoolDefPtr def, unsigned int check_active); -char *virStoragePoolGetVhbaSCSIHostParent(virConnectPtr conn, - const char *name) - ATTRIBUTE_NONNULL(1); - int virStoragePoolSourceFindDuplicate(virConnectPtr conn, virStoragePoolObjListPtr pools, virStoragePoolDefPtr def); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9ad0b0a..6806fc7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -889,7 +889,6 @@ virStoragePoolFormatDiskTypeToString; virStoragePoolFormatFileSystemNetTypeToString; virStoragePoolFormatFileSystemTypeToString; virStoragePoolFormatLogicalTypeToString; -virStoragePoolGetVhbaSCSIHostParent; virStoragePoolLoadAllConfigs; virStoragePoolLoadAllState; virStoragePoolObjAssignDef; diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index e037a93..106394d 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -36,6 +36,7 @@ #include "virstring.h" #include "virvhba.h" #include "storage_util.h" +#include "node_device_conf.h" #define VIR_FROM_THIS VIR_FROM_STORAGE @@ -214,10 +215,11 @@ getAdapterName(virStoragePoolSourceAdapter adapter) * sysfs tree to get the parent 'scsi_host#' to ensure it matches. */ static bool -checkVhbaSCSIHostParent(virConnectPtr conn, - const char *name, - const char *parent_name) +checkParent(virConnectPtr conn, + const char *name, + const char *parent_name) { + char *scsi_host_name = NULL; char *vhba_parent = NULL; bool retval = false; @@ -227,7 +229,10 @@ checkVhbaSCSIHostParent(virConnectPtr conn, if (!conn) return true; - if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name))) + if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0) + goto cleanup; + + if (!(vhba_parent = virNodeDeviceGetParentName(conn, scsi_host_name))) goto cleanup; if (STRNEQ(parent_name, vhba_parent)) { @@ -242,6 +247,7 @@ checkVhbaSCSIHostParent(virConnectPtr conn, cleanup: VIR_FREE(vhba_parent); + VIR_FREE(scsi_host_name); return retval; } @@ -276,7 +282,7 @@ createVport(virConnectPtr conn, * retrieved has the same parent */ if (adapter->data.fchost.parent && - checkVhbaSCSIHostParent(conn, name, adapter->data.fchost.parent)) + checkParent(conn, name, adapter->data.fchost.parent)) ret = 0; goto cleanup; @@ -383,6 +389,7 @@ deleteVport(virConnectPtr conn, { unsigned int parent_host; char *name = NULL; + char *scsi_host_name = NULL; char *vhba_parent = NULL; int ret = -1; @@ -416,7 +423,10 @@ deleteVport(virConnectPtr conn, if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0) goto cleanup; } else { - if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name))) + if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0) + goto cleanup; + + if (!(vhba_parent = virNodeDeviceGetParentName(conn, scsi_host_name))) goto cleanup; if (virGetSCSIHostNumber(vhba_parent, &parent_host) < 0) @@ -431,6 +441,7 @@ deleteVport(virConnectPtr conn, cleanup: VIR_FREE(name); VIR_FREE(vhba_parent); + VIR_FREE(scsi_host_name); return ret; } -- 2.9.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list