diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index 7892b9456a88b46d929b96441d8ad61edb31ff05..eba364746bba3cb70b740d7a7f691ea6b5cb0d4f 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -97,11 +97,12 @@
adapter
name
is the SCSI adapter
- name (ex. "host1"). Attribute type
- (1.0.5) specifies the adapter type.
- Valid values are "fc_host" and "scsi_host". If omitted and
- the name
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 type
(1.0.5)
+ specifies the adapter type. Valid values are "fc_host" and "scsi_host".
+ If omitted and the name
attribute is specified, then it
+ defaults to "scsi_host". To keep backwards compatibility, the attribute
type
is optional for the "scsi_host" adapter, but
mandatory for the "fc_host" adapter. Attributes wwnn
(Word Wide Node Name) and wwpn
(Word Wide Port Name)
diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c
index c1c163ec3e3ef176135ddc472ccc64a5bfe35739..f3ca4640374b0632900ce5e0e4ae858e83f077d7 100644
--- a/src/storage/storage_backend_scsi.c
+++ b/src/storage/storage_backend_scsi.c
@@ -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;
}