]> xenbits.xensource.com Git - libvirt.git/commitdiff
virutil: Introduce virGetSCSIHostNameByParentaddr
authorJohn Ferlan <jferlan@redhat.com>
Mon, 6 Oct 2014 20:18:23 +0000 (16:18 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 29 Oct 2014 01:25:32 +0000 (21:25 -0400)
Create the function from the code in getAdapterName() in order to return
the "host#" name for the provided parentaddr values.

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

index a99c2859a61a68e0bb54bf325ecf66a5bb13d8b8..9d5c814181e7640637c8e9abb9d06570728368eb 100644 (file)
@@ -2160,6 +2160,7 @@ virGetGroupList;
 virGetGroupName;
 virGetHostname;
 virGetListenFDs;
+virGetSCSIHostNameByParentaddr;
 virGetSCSIHostNumber;
 virGetSelfLastChanged;
 virGetUnprivSGIOSysfsPath;
index d9f3ff27eb7b84c61c04efa5853d9d027ea2ee49..02160bc048e0ef7ffe78b0ebeafc91832886f908 100644 (file)
@@ -519,22 +519,15 @@ getAdapterName(virStoragePoolSourceAdapter adapter)
 
     if (adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
         if (adapter.data.scsi_host.has_parent) {
+            virDevicePCIAddress addr = adapter.data.scsi_host.parentaddr;
             unsigned int unique_id = adapter.data.scsi_host.unique_id;
 
-            if (virAsprintf(&parentaddr, "%04x:%02x:%02x.%01x",
-                            adapter.data.scsi_host.parentaddr.domain,
-                            adapter.data.scsi_host.parentaddr.bus,
-                            adapter.data.scsi_host.parentaddr.slot,
-                            adapter.data.scsi_host.parentaddr.function) < 0)
+            if (!(name = virGetSCSIHostNameByParentaddr(addr.domain,
+                                                        addr.bus,
+                                                        addr.slot,
+                                                        addr.function,
+                                                        unique_id)))
                 goto cleanup;
-            if (!(name = virFindSCSIHostByPCI(NULL, parentaddr,
-                                              unique_id))) {
-                virReportError(VIR_ERR_XML_ERROR,
-                               _("Failed to find scsi_host using PCI '%s' "
-                                 "and unique_id='%u'"),
-                               parentaddr, unique_id);
-                goto cleanup;
-            }
         } else {
             ignore_value(VIR_STRDUP(name, adapter.data.scsi_host.name));
         }
index 5e73d9e97a35789558ce0caf644075f1c42ce3a9..3e7f7a2ad00f5f5e8082ee359a939cb33193f535 100644 (file)
@@ -1884,6 +1884,45 @@ virGetSCSIHostNumber(const char *adapter_name,
     return 0;
 }
 
+/* virGetSCSIHostNameByParentaddr:
+ * @domain: The domain from the scsi_host parentaddr
+ * @bus: The bus from the scsi_host parentaddr
+ * @slot: The slot from the scsi_host parentaddr
+ * @function: The function from the scsi_host parentaddr
+ * @unique_id: The unique id value for parentaddr
+ *
+ * Generate a parentaddr and find the scsi_host host# for
+ * the provided parentaddr PCI address fields.
+ *
+ * Returns the "host#" string which must be free'd by
+ * the caller or NULL on error
+ */
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain,
+                               unsigned int bus,
+                               unsigned int slot,
+                               unsigned int function,
+                               unsigned int unique_id)
+{
+    char *name = NULL;
+    char *parentaddr = NULL;
+
+    if (virAsprintf(&parentaddr, "%04x:%02x:%02x.%01x",
+                    domain, bus, slot, function) < 0)
+        goto cleanup;
+    if (!(name = virFindSCSIHostByPCI(NULL, parentaddr, unique_id))) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Failed to find scsi_host using PCI '%s' "
+                         "and unique_id='%u'"),
+                       parentaddr, unique_id);
+        goto cleanup;
+    }
+
+ cleanup:
+    VIR_FREE(parentaddr);
+    return name;
+}
+
 /* virReadFCHost:
  * @sysfs_prefix: "fc_host" sysfs path, defaults to SYSFS_FC_HOST_PATH
  * @host: Host number, E.g. 5 of "fc_host/host5"
@@ -2262,6 +2301,17 @@ virGetSCSIHostNumber(const char *adapter_name ATTRIBUTE_UNUSED,
     return NULL;
 }
 
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain ATTRIBUTE_UNUSED,
+                               unsigned int bus ATTRIBUTE_UNUSED,
+                               unsigned int slot ATTRIBUTE_UNUSED,
+                               unsigned int function ATTRIBUTE_UNUSED,
+                               unsigned int unique_id 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 442c9986b432319dba1c1ec409ff96b6c549d642..f31bf8893658f4aabfed3f82f104983c3940744c 100644 (file)
@@ -177,6 +177,12 @@ int
 virGetSCSIHostNumber(const char *adapter_name,
                      unsigned int *result)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+char *
+virGetSCSIHostNameByParentaddr(unsigned int domain,
+                               unsigned int bus,
+                               unsigned int slot,
+                               unsigned int function,
+                               unsigned int unique_id);
 int virReadFCHost(const char *sysfs_prefix,
                   int host,
                   const char *entry,