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,
unsigned int *hostnum)
#include "virlog.h"
#include "virfile.h"
#include "vircommand.h"
-#include "viraccessapicheck.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE
return name;
}
-/*
- * Using the host# name found via wwnn/wwpn lookup in the fc_host
- * sysfs tree to get the parent 'scsi_host#'. On entry we need 'conn'
- * set. We won't get here from the autostart path since the caller
- * will return true before calling this function. For the shutdown
- * path we won't be able to delete the vport.
- */
-static char * ATTRIBUTE_NONNULL(1)
-getVhbaSCSIHostParent(virConnectPtr conn,
- const char *name)
-{
- char *nodedev_name = NULL;
- virNodeDevicePtr device = NULL;
- char *xml = NULL;
- virNodeDeviceDefPtr def = NULL;
- char *vhba_parent = NULL;
- virErrorPtr savedError = 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:
- if (!vhba_parent)
- savedError = virSaveLastError();
- VIR_FREE(nodedev_name);
- virNodeDeviceDefFree(def);
- VIR_FREE(xml);
- virNodeDeviceFree(device);
- if (savedError) {
- virSetError(savedError);
- virFreeError(savedError);
- }
- return vhba_parent;
-}
-
/*
* Using the host# name found via wwnn/wwpn lookup in the fc_host
* sysfs tree to get the parent 'scsi_host#' to ensure it matches.
if (!conn)
return true;
- if (!(vhba_parent = getVhbaSCSIHostParent(conn, name)))
+ if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name)))
goto cleanup;
if (STRNEQ(parent_name, vhba_parent)) {
if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
goto cleanup;
} else {
- if (!(vhba_parent = getVhbaSCSIHostParent(conn, name)))
+ if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn, name)))
goto cleanup;
if (virGetSCSIHostNumber(vhba_parent, &parent_host) < 0)