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(a)redhat.com>
---
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