]> xenbits.xensource.com Git - libvirt.git/commitdiff
virutil: Introduce virGetSCSIHostNumber
authorJohn Ferlan <jferlan@redhat.com>
Mon, 6 Oct 2014 18:18:11 +0000 (14:18 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 29 Oct 2014 01:25:26 +0000 (21:25 -0400)
Create/use virGetSCSIHostNumber to replace the static getHostNumber

Removed the "if (result &&" since result is now required to be non NULL
on input.

src/libvirt_private.syms
src/storage/storage_backend_scsi.c
src/util/virutil.c
src/util/virutil.h

index 888f559407605b22da2ca01cfd7d189de533e14e..a99c2859a61a68e0bb54bf325ecf66a5bb13d8b8 100644 (file)
@@ -2160,6 +2160,7 @@ virGetGroupList;
 virGetGroupName;
 virGetHostname;
 virGetListenFDs;
+virGetSCSIHostNumber;
 virGetSelfLastChanged;
 virGetUnprivSGIOSysfsPath;
 virGetUserCacheDirectory;
index 16ed3283ceebe71c49718c8bbb616661ede5a7ea..d9f3ff27eb7b84c61c04efa5853d9d027ea2ee49 100644 (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);
index 519796928c372b60dbcab1493df820c58995ab29..5e73d9e97a35789558ce0caf644075f1c42ce3a9 100644 (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,
index 54f11488f8e1fe999dc4e3bc47cfc95459151cb8..442c9986b432319dba1c1ec409ff96b6c549d642 100644 (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,