virutil: Introduce virGetSCSIHostNumber

Create/use virGetSCSIHostNumber to replace the static getHostNumber

Removed the "if (result &&" since result is now required to be non NULL
on input.
This commit is contained in:
John Ferlan 2014-10-06 14:18:11 -04:00
parent e3a52afcfc
commit 55f439599c
4 changed files with 63 additions and 36 deletions

View File

@ -2160,6 +2160,7 @@ virGetGroupList;
virGetGroupName;
virGetHostname;
virGetListenFDs;
virGetSCSIHostNumber;
virGetSelfLastChanged;
virGetUnprivSGIOSysfsPath;
virGetUserCacheDirectory;

View File

@ -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);

View File

@ -1838,6 +1838,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"
@ -2208,6 +2254,14 @@ virFindSCSIHostByPCI(const char *sysfs_prefix ATTRIBUTE_UNUSED,
return NULL;
}
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,

View File

@ -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,