From f7b6a5ed06a39ce3fa366fa8e02431c14899300f Mon Sep 17 00:00:00 2001 Message-Id: From: John Ferlan Date: Tue, 28 Oct 2014 22:13:31 -0400 Subject: [PATCH] virutil: Introduce virGetSCSIHostNumber https://bugzilla.redhat.com/show_bug.cgi?id=1146837 Create/use virGetSCSIHostNumber to replace the static getHostNumber Removed the "if (result &&" since result is now required to be non NULL on input. (cherry picked from commit 55f439599c46ee9694fbf933e561b55a9a827c61) Signed-off-by: John Ferlan Signed-off-by: Jiri Denemark --- src/libvirt_private.syms | 1 + src/storage/storage_backend_scsi.c | 40 +++------------------------- src/util/virutil.c | 54 ++++++++++++++++++++++++++++++++++++++ src/util/virutil.h | 4 +++ 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f569417..d14023e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2120,6 +2120,7 @@ virGetGroupList; virGetGroupName; virGetHostname; virGetListenFDs; +virGetSCSIHostNumber; virGetSelfLastChanged; virGetUnprivSGIOSysfsPath; virGetUserCacheDirectory; diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index 16ed328..d9f3ff2 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -511,38 +511,6 @@ virStorageBackendSCSITriggerRescan(uint32_t host) return retval; } -static int -getHostNumber(const char *adapter_name, - unsigned int *result) -{ - char *host = (char *)adapter_name; - - /* Specifying adapter like 'host5' is still supported for - * back-compat reason. - */ - if (STRPREFIX(host, "scsi_host")) { - host += strlen("scsi_host"); - } else if (STRPREFIX(host, "fc_host")) { - host += strlen("fc_host"); - } else if (STRPREFIX(host, "host")) { - host += strlen("host"); - } else { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Invalid adapter name '%s' for SCSI pool"), - adapter_name); - return -1; - } - - if (result && virStrToLong_ui(host, NULL, 10, result) == -1) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Invalid adapter name '%s' for SCSI pool"), - adapter_name); - return -1; - } - - return 0; -} - static char * getAdapterName(virStoragePoolSourceAdapter adapter) { @@ -610,7 +578,7 @@ createVport(virStoragePoolSourceAdapter adapter) return -1; } - if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0) + if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0) return -1; if (virManageVport(parent_host, adapter.data.fchost.wwpn, @@ -643,7 +611,7 @@ deleteVport(virStoragePoolSourceAdapter adapter) adapter.data.fchost.wwpn))) return -1; - if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0) + if (virGetSCSIHostNumber(adapter.data.fchost.parent, &parent_host) < 0) goto cleanup; if (virManageVport(parent_host, adapter.data.fchost.wwpn, @@ -683,7 +651,7 @@ virStorageBackendSCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED, } } - if (getHostNumber(name, &host) < 0) + if (virGetSCSIHostNumber(name, &host) < 0) goto cleanup; if (virAsprintf(&path, "%s/host%d", @@ -712,7 +680,7 @@ virStorageBackendSCSIRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED, if (!(name = getAdapterName(pool->def->source.adapter))) return -1; - if (getHostNumber(name, &host) < 0) + if (virGetSCSIHostNumber(name, &host) < 0) goto out; VIR_DEBUG("Scanning host%u", host); diff --git a/src/util/virutil.c b/src/util/virutil.c index 2edbec5..0a69912 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -1832,6 +1832,52 @@ virFindSCSIHostByPCI(const char *sysfs_prefix, return ret; } +/* virGetSCSIHostNumber: + * @adapter_name: Name of the host adapter + * @result: Return the entry value as unsigned int + * + * Convert the various forms of scsi_host names into the numeric + * host# value that can be used in order to scan sysfs looking for + * the specific host. + * + * Names can be either "scsi_host#" or just "host#", where + * "host#" is the back-compat format, but both equate to + * the same source adapter. First check if both pool and def + * are using same format (easier) - if so, then compare + * + * Returns 0 on success, and @result has the host number. + * Otherwise returns -1. + */ +int +virGetSCSIHostNumber(const char *adapter_name, + unsigned int *result) +{ + /* Specifying adapter like 'host5' is still supported for + * back-compat reason. + */ + if (STRPREFIX(adapter_name, "scsi_host")) { + adapter_name += strlen("scsi_host"); + } else if (STRPREFIX(adapter_name, "fc_host")) { + adapter_name += strlen("fc_host"); + } else if (STRPREFIX(adapter_name, "host")) { + adapter_name += strlen("host"); + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid adapter name '%s' for SCSI pool"), + adapter_name); + return -1; + } + + if (virStrToLong_ui(adapter_name, NULL, 10, result) == -1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid adapter name '%s' for SCSI pool"), + adapter_name); + return -1; + } + + return 0; +} + /* virReadFCHost: * @sysfs_prefix: "fc_host" sysfs path, defaults to SYSFS_FC_HOST_PATH * @host: Host number, E.g. 5 of "fc_host/host5" @@ -2203,6 +2249,14 @@ virFindSCSIHostByPCI(const char *sysfs_prefix ATTRIBUTE_UNUSED, } int +virGetSCSIHostNumber(const char *adapter_name ATTRIBUTE_UNUSED, + unsigned int *result ATTRIBUTE_UNUSED) +{ + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform")); + return NULL; +} + +int virReadFCHost(const char *sysfs_prefix ATTRIBUTE_UNUSED, int host ATTRIBUTE_UNUSED, const char *entry ATTRIBUTE_UNUSED, diff --git a/src/util/virutil.h b/src/util/virutil.h index 89b7923..8b41063 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -173,6 +173,10 @@ char * virFindSCSIHostByPCI(const char *sysfs_prefix, const char *parentaddr, unsigned int unique_id); +int +virGetSCSIHostNumber(const char *adapter_name, + unsigned int *result) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); int virReadFCHost(const char *sysfs_prefix, int host, const char *entry, -- 2.1.3