From bc71e8453519c5123b23fcc295d90a4e788540ca Mon Sep 17 00:00:00 2001 Message-Id: From: John Ferlan Date: Tue, 28 Oct 2014 22:13:32 -0400 Subject: [PATCH] virutil: Introduce virGetSCSIHostNameByParentaddr https://bugzilla.redhat.com/show_bug.cgi?id=1146837 Create the function from the code in getAdapterName() in order to return the "host#" name for the provided parentaddr values. (cherry picked from commit beff5d4e1bc72d673f6f0e61afeaa637eddc8e4d) Signed-off-by: John Ferlan Signed-off-by: Jiri Denemark --- 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 d14023e..401bbb5 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2120,6 +2120,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 0a69912..78952ec 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -1878,6 +1878,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" @@ -2256,6 +2295,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 8b41063..105c519 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, -- 2.1.3