]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
storage: Make the adapter name be consistent with node device driver
authorOsier Yang <jyang@redhat.com>
Mon, 25 Mar 2013 16:43:37 +0000 (00:43 +0800)
committerOsier Yang <jyang@redhat.com>
Mon, 8 Apr 2013 10:41:06 +0000 (18:41 +0800)
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.

docs/formatstorage.html.in
src/storage/storage_backend_scsi.c

index 7892b9456a88b46d929b96441d8ad61edb31ff05..eba364746bba3cb70b740d7a7f691ea6b5cb0d4f 100644 (file)
       <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)
index c1c163ec3e3ef176135ddc472ccc64a5bfe35739..f3ca4640374b0632900ce5e0e4ae858e83f077d7 100644 (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;
 }