[dm-devel] [PATCH] multipatd: display the host WWNN fields.

s90006763 sunao.sun at huawei.com
Thu Oct 18 01:28:39 UTC 2018


When the iSCSI path information is displayed using the multipath command, the host WWNN in the path information is not fully displayed, as follows:
Multipathd show paths format "%N%R"
Host WWNN host WWPN
[undef] iqn.xxx-xx.com.xx:oceanstor:xxxx:: xx:x.x.x.x
[undef] iqn.xxx-xx.com.xx:oceanstor:xxxx:: xx:x.x.x.x

 This patch solves this problem and gets the complete display of host WWNN related fields,as follows:
 Multipathd show paths format "%N%R"
 Host WWNN host WWPN
 Iqn.xx-x.com.redhat:86329 iqn.xxx-xx.com.xx:oceanstor:xxxx:: xx:x.x.x.x
 Iqn.xx-x.com.redhat:86329 iqn.xxx-xx.com.xx:oceanstor:xxxx:: xx:x.x.x.x
---
 libmultipath/discovery.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++
 libmultipath/print.c     |  4 ++-
 libmultipath/structs.h   |  1 +
 3 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 873035e5..a974c358 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -404,6 +404,71 @@ sysfs_get_tgt_nodename (struct path *pp, char * node)
 	return 0;
 }
 
+int
+sysfs_get_host_nodename (struct path *pp, char * node)
+{
+	const char *hostname, *value;
+	struct udev_device *parent, *hostdev;
+	int host, tgtid = -1;
+
+	parent = udev_device_get_parent_with_subsystem_devtype(pp->udev, "scsi", "scsi_host");
+	if (!parent)
+		return 1;
+	
+	/* Check for FibreChannel */
+	value = udev_device_get_sysname(parent);
+	if (sscanf(value, "host%d",
+		   &host) == 1) {
+		hostdev = udev_device_new_from_subsystem_sysname(udev,
+				"fc_host", value);
+		if (hostdev) {
+			condlog(0, "SCSI host %d -> "
+				"FC host %d",
+				pp->sg_id.host_no, host);
+			value = udev_device_get_sysattr_value(hostdev,
+							      "node_name");
+			if (value) {
+				strncpy(node, value, NODE_NAME_SIZE);
+				udev_device_unref(hostdev);
+				return 0;
+			} else
+				udev_device_unref(hostdev);
+		}
+	}
+
+	/* Check for iSCSI */
+	parent = pp->udev;
+	hostname = NULL;
+	while (parent) {
+		hostname = udev_device_get_sysname(parent);
+		if (hostname && sscanf(hostname , "session%d", &tgtid) == 1)
+			break;
+		parent = udev_device_get_parent(parent);
+		hostname = NULL;
+		tgtid = -1;
+	}
+	if (parent && hostname) {
+		hostdev = udev_device_new_from_subsystem_sysname(udev,
+				"iscsi_session", hostname);
+		if (hostdev) {
+			const char *value;
+
+			value = udev_device_get_sysattr_value(hostdev, "initiatorname");
+			if (value) {
+				strncpy(node, value, NODE_NAME_SIZE);
+				udev_device_unref(hostdev);
+				return 0;
+			}
+			else
+				udev_device_unref(hostdev);
+		}
+	}
+	
+	/* Unknown SCSI transport. Keep fingers crossed */
+	pp->sg_id.proto_id = SCSI_PROTOCOL_UNSPEC;
+	return 0;
+}
+
 int sysfs_get_host_adapter_name(const struct path *pp, char *adapter_name)
 {
 	int proto_id;
@@ -1191,6 +1256,11 @@ scsi_sysfs_pathinfo (struct path * pp, vector hwtable)
 			pp->sg_id.channel,
 			pp->sg_id.scsi_id,
 			pp->sg_id.lun);
+	/*
+	 * host node name
+	 */
+	if(sysfs_get_host_nodename(pp, pp->host_node_name))
+		return PATHINFO_FAILED;
 
 	/*
 	 * target node name
diff --git a/libmultipath/print.c b/libmultipath/print.c
index 7b610b94..d512ce19 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -554,7 +554,9 @@ out:
 int
 snprint_host_wwnn (char * buff, size_t len, const struct path * pp)
 {
-	return snprint_host_attr(buff, len, pp, "node_name");
+	if (pp->host_node_name[0] == '\0')
+		return snprintf(buff, len, "[undef]");
+	return snprint_str(buff, len, pp->host_node_name);
 }
 
 int
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index 0a2623a0..63bd3941 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -253,6 +253,7 @@ struct path {
 	char product_id[PATH_PRODUCT_SIZE];
 	char rev[PATH_REV_SIZE];
 	char serial[SERIAL_SIZE];
+	char host_node_name[NODE_NAME_SIZE];
 	char tgt_node_name[NODE_NAME_SIZE];
 	unsigned long long size;
 	unsigned int checkint;
-- 
2.12.0.windows.1





More information about the dm-devel mailing list