From beff5d4e1bc72d673f6f0e61afeaa637eddc8e4d Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Oct 29 2014 01:25:32 +0000 Subject: virutil: Introduce virGetSCSIHostNameByParentaddr Create the function from the code in getAdapterName() in order to return the "host#" name for the provided parentaddr values. --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a99c285..9d5c814 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2160,6 +2160,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 5e73d9e..3e7f7a2 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -1884,6 +1884,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" @@ -2262,6 +2301,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,