Create the function from the code in getAdapterName() in order to return
the "host#" name for the provided parentaddr values.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/storage/storage_backend_scsi.c | 19 +++++----------
src/util/virutil.c | 50 ++++++++++++++++++++++++++++++++++++++
src/util/virutil.h | 6 +++++
4 files changed, 63 insertions(+), 13 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 189e07c..b29f77d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2151,6 +2151,7 @@ virGetGroupList;
virGetGroupName;
virGetHostname;
virGetListenFDs;
+virGetSCSIHostNameByParentaddr;
virGetSCSIHostNumber;
virGetSelfLastChanged;
virGetUnprivSGIOSysfsPath;
diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
index d9f3ff2..02160bc 100644
--- a/src/storage/storage_backend_scsi.c
+++ b/src/storage/storage_backend_scsi.c
@@ -519,22 +519,15 @@ getAdapterName(virStoragePoolSourceAdapter adapter)
if (adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
if (adapter.data.scsi_host.has_parent) {
+ virDevicePCIAddress addr = adapter.data.scsi_host.parentaddr;
unsigned int unique_id = adapter.data.scsi_host.unique_id;
- if (virAsprintf(&parentaddr, "%04x:%02x:%02x.%01x",
- adapter.data.scsi_host.parentaddr.domain,
- adapter.data.scsi_host.parentaddr.bus,
- adapter.data.scsi_host.parentaddr.slot,
- adapter.data.scsi_host.parentaddr.function) < 0)
+ if (!(name = virGetSCSIHostNameByParentaddr(addr.domain,
+ addr.bus,
+ addr.slot,
+ addr.function,
+ unique_id)))
goto cleanup;
- if (!(name = virFindSCSIHostByPCI(NULL, parentaddr,
- unique_id))) {
- virReportError(VIR_ERR_XML_ERROR,
- _("Failed to find scsi_host using PCI '%s'
"
- "and unique_id='%u'"),
- parentaddr, unique_id);
- goto cleanup;
- }
} else {
ignore_value(VIR_STRDUP(name, adapter.data.scsi_host.name));
}
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 1c23d7c..eddfb08 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -1886,6 +1886,45 @@ virGetSCSIHostNumber(const char *adapter_name,
return 0;
}
+/* virGetSCSIHostNameByParentaddr:
+ * @domain: The domain from the scsi_host parentaddr
+ * @bus: The bus from the scsi_host parentaddr
+ * @slot: The slot from the scsi_host parentaddr
+ * @function: The function from the scsi_host parentaddr
+ * @unique_id: The unique id value for parentaddr
+ *
+ * Generate a parentaddr and find the scsi_host host# for
+ * the provided parentaddr PCI address fields.
+ *
+ * Returns the "host#" string which must be free'd by
+ * the caller or NULL on error
+ */
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain,
+ unsigned int bus,
+ unsigned int slot,
+ unsigned int function,
+ unsigned int unique_id)
+{
+ char *name = NULL;
+ char *parentaddr = NULL;
+
+ if (virAsprintf(&parentaddr, "%04x:%02x:%02x.%01x",
+ domain, bus, slot, function) < 0)
+ goto cleanup;
+ if (!(name = virFindSCSIHostByPCI(NULL, parentaddr, unique_id))) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Failed to find scsi_host using PCI '%s' "
+ "and unique_id='%u'"),
+ parentaddr, unique_id);
+ goto cleanup;
+ }
+
+ cleanup:
+ VIR_FREE(parentaddr);
+ return name;
+}
+
/* virReadFCHost:
* @sysfs_prefix: "fc_host" sysfs path, defaults to SYSFS_FC_HOST_PATH
* @host: Host number, E.g. 5 of "fc_host/host5"
@@ -2264,6 +2303,17 @@ virGetSCSIHostNumber(const char *adapter_name ATTRIBUTE_UNUSED,
return NULL;
}
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain ATTRIBUTE_UNUSED,
+ unsigned int bus ATTRIBUTE_UNUSED,
+ unsigned int slot ATTRIBUTE_UNUSED,
+ unsigned int function ATTRIBUTE_UNUSED,
+ unsigned int unique_id ATTRIBUTE_UNUSED)
+{
+ virReportSystemError(ENOSYS, "%s", _("Not supported on this
platform"));
+ return NULL;
+}
+
int
virReadFCHost(const char *sysfs_prefix ATTRIBUTE_UNUSED,
int host ATTRIBUTE_UNUSED,
diff --git a/src/util/virutil.h b/src/util/virutil.h
index 442c998..f31bf88 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -177,6 +177,12 @@ int
virGetSCSIHostNumber(const char *adapter_name,
unsigned int *result)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain,
+ unsigned int bus,
+ unsigned int slot,
+ unsigned int function,
+ unsigned int unique_id);
int virReadFCHost(const char *sysfs_prefix,
int host,
const char *entry,
--
1.9.3