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. v1 - v2: * Use virStrToLong_ui instead of sscanf * No tests addition or changes, because this patch only affects the way scsi backend works for adapter, adding xml2xml tests for it is just meaningless. --- docs/formatstorage.html.in | 15 ++++++----- src/storage/storage_backend_scsi.c | 54 +++++++++++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index eff3016..5fae933 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -89,13 +89,14 @@ <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.4</span>) specifies the adapter type. - Valid value 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> + 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.4</span>) + specifies the adapter type. Valid value 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) (<span class="since">1.0.4</span>) are used by the "fc_host" adapter to uniquely indentify the device in the Fibre Channel storage farbic diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index c1c163e..cc1ebe2 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -632,14 +632,49 @@ out: } 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; } -- 1.8.0.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list