[dm-devel] [PATCH 1/2] libmultipath: support host adapter name lookup for s390x ccw bus
Steffen Maier
maier at linux.ibm.com
Wed Feb 9 19:47:12 UTC 2022
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 <bblock at linux.ibm.com>
Signed-off-by: Steffen Maier <maier at linux.ibm.com>
---
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
More information about the dm-devel
mailing list