storage: Make the adapter name be consistent with node device driver

node device driver names the HBA like "scsi_host5", but storage
driver uses "host5", which could make the user confused. This
changes them to be consistent. However, for back-compat reason,
adapter name like "host5" is still supported.
This commit is contained in:
Osier Yang 2013-03-26 00:43:37 +08:00
parent 9f781da69d
commit c1f63a9bdf
2 changed files with 48 additions and 17 deletions

View File

@ -97,11 +97,12 @@
<dt><code>adapter</code></dt>
<dd>Provides the source for pools backed by SCSI adapters. May
only occur once. Attribute <code>name</code> is the SCSI adapter
name (ex. "host1"). Attribute <code>type</code>
(<span class="since">1.0.5</span>) specifies the adapter type.
Valid values are "fc_host" and "scsi_host". If omitted and
the <code>name</code> attribute is specified, then it defaults to
"scsi_host". To keep backwards compatibility, the attribute
name (ex. "scsi_host1". NB, although a name such as "host1" is
still supported for backwards compatibility, it is not recommended).
Attribute <code>type</code> (<span class="since">1.0.5</span>)
specifies the adapter type. Valid values are "fc_host" and "scsi_host".
If omitted and the <code>name</code> attribute is specified, then it
defaults to "scsi_host". To keep backwards compatibility, the attribute
<code>type</code> is optional for the "scsi_host" adapter, but
mandatory for the "fc_host" adapter. Attributes <code>wwnn</code>
(Word Wide Node Name) and <code>wwpn</code> (Word Wide Port Name)

View File

@ -631,15 +631,50 @@ out:
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, "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 int
virStorageBackendSCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
bool *isActive)
{
char *path;
unsigned int host;
*isActive = false;
if (virAsprintf(&path, "/sys/class/scsi_host/%s", pool->def->source.adapter.data.name) < 0) {
if (getHostNumber(pool->def->source.adapter.data.name, &host) < 0)
return -1;
if (virAsprintf(&path, "/sys/class/scsi_host/host%d", host) < 0) {
virReportOOMError();
return -1;
}
@ -656,29 +691,24 @@ static int
virStorageBackendSCSIRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool)
{
int retval = 0;
uint32_t host;
int ret = -1;
unsigned int host;
pool->def->allocation = pool->def->capacity = pool->def->available = 0;
if (sscanf(pool->def->source.adapter.data.name, "host%u", &host) != 1) {
VIR_DEBUG("Failed to get host number from '%s'",
pool->def->source.adapter.data.name);
retval = -1;
if (getHostNumber(pool->def->source.adapter.data.name, &host) < 0)
goto out;
}
VIR_DEBUG("Scanning host%u", host);
if (virStorageBackendSCSITriggerRescan(host) < 0) {
retval = -1;
if (virStorageBackendSCSITriggerRescan(host) < 0)
goto out;
}
virStorageBackendSCSIFindLUs(pool, host);
ret = 0;
out:
return retval;
return ret;
}