There are also (FCP) HBAs that appear on a bus different from PCI.

Complements v0.6.0 commit
01ab2a468ea2 ("libmultipath: Add additional path wildcards").

With that we can easily get the full FCP addressing triplet
(HBA, WWPN, LUN) from multipath tools without additional tools
and correlation:

$ multipathd -k'show paths format "%w|%i|%a|%r"'
uuid                             |hcil       |host adapter|target WWPN
36005076400820293e8000000000000a0|1:0:3:160  |0.0.5080    |0x500507680b25c449
36005076400820293e8000000000000a0|1:0:4:160  |0.0.5080    |0x500507680b25c448
36005076400820293e8000000000000a0|58:0:3:160 |0.0.50c0    |0x500507680b26c449
36005076400820293e8000000000000a0|58:0:4:160 |0.0.50c0    |0x500507680b26c448

                                              ^^^^^^^^
                                   instead of [undef]

As a side effect this patch theoretically also enables group by
host adapter for s390x based on v0.6.0 commit a28e61e5cc9a
("Crafted ordering of child paths for round robin path selector").

Reviewed-by: Benjamin Block <[email protected]>
Signed-off-by: Steffen Maier <[email protected]>
---
 libmultipath/discovery.c | 41 +++++++++++++++++++++++++++++++++++++++-
 libmultipath/discovery.h |  1 +
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 7d939ae08004..bb4913d9b75f 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -497,8 +497,12 @@ int sysfs_get_host_adapter_name(const struct path *pp, 
char *adapter_name)
                return sysfs_get_iscsi_ip_address(pp, adapter_name);
 
        /* fetch adapter pci name for other protocols
+        * or try to get s390x channel subsystem FCP device bus-ID [zfcp]
         */
-       return sysfs_get_host_pci_name(pp, adapter_name);
+       if (sysfs_get_host_pci_name(pp, adapter_name))
+               return sysfs_get_host_ccw_name(pp, adapter_name);
+       else
+               return 0;
 }
 
 int sysfs_get_host_pci_name(const struct path *pp, char *pci_name)
@@ -545,6 +549,41 @@ int sysfs_get_host_pci_name(const struct path *pp, char 
*pci_name)
        return 1;
 }
 
+int sysfs_get_host_ccw_name(const struct path *pp, char *ccw_name)
+{
+       struct udev_device *hostdev, *parent;
+       char host_name[HOST_NAME_LEN];
+       const char *value;
+
+       if (!pp || !ccw_name)
+               return 1;
+
+       sprintf(host_name, "host%d", pp->sg_id.host_no);
+       hostdev = udev_device_new_from_subsystem_sysname(udev,
+                       "scsi_host", host_name);
+       if (!hostdev)
+               return 1;
+
+       parent = udev_device_get_parent_with_subsystem_devtype(hostdev, "ccw",
+                                                              NULL);
+       if (parent) {
+               /* s390x ccw FCP device found
+                */
+               value = udev_device_get_sysname(parent);
+
+               if (!value) {
+                       udev_device_unref(hostdev);
+                       return 1;
+               }
+
+               strncpy(ccw_name, value, SLOT_NAME_SIZE);
+               udev_device_unref(hostdev);
+               return 0;
+       }
+       udev_device_unref(hostdev);
+       return 1;
+}
+
 int sysfs_get_iscsi_ip_address(const struct path *pp, char *ip_address)
 {
        struct udev_device *hostdev;
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 095657bb9de4..0a58c725d700 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -44,6 +44,7 @@ int store_pathinfo (vector pathvec, struct config *conf,
                    struct path **pp_ptr);
 int sysfs_set_scsi_tmo (struct multipath *mpp, unsigned int checkint);
 int sysfs_get_timeout(const struct path *pp, unsigned int *timeout);
+int sysfs_get_host_ccw_name(const struct path *pp, char *ccw_name);
 int sysfs_get_host_pci_name(const struct path *pp, char *pci_name);
 int sysfs_get_iscsi_ip_address(const struct path *pp, char *ip_address);
 int sysfs_get_host_adapter_name(const struct path *pp,

base-commit: d9d7ae9e2125116b465b4ff4d98ce65fe0eac3cc
-- 
2.27.0

--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to