multipath: make tgt_node_name work for iscsi devices
authorBenjamin Marzinski <bmarzins@redhat.com>
Fri, 13 Jan 2012 04:14:56 +0000 (22:14 -0600)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sat, 14 Jan 2012 11:16:47 +0000 (12:16 +0100)
tgt_node_name wasn't displaying anything for iscsi devices. With this
change, if multipath can't get the node_name, it will check
sys/devices/platform/hostX/sessionY/iscsi_session/sessionY/targetname
and if this is available, it will get the node name from there.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/discovery.c
libmultipath/structs.h

index 298c2d3bba719937850639e50f90b513d4b47c30..6594ace2b1299ed4b9d631b79150623f6256d044 100644 (file)
@@ -210,10 +210,11 @@ sysfs_get_size (struct sysfs_device * dev, unsigned long long * size)
 }
 
 int
-sysfs_get_fc_nodename (struct sysfs_device * dev, char * node,
+sysfs_get_tgt_nodename (struct sysfs_device * dev, char * node,
                       unsigned int host, unsigned int channel,
                       unsigned int target)
 {
+       unsigned int checkhost, session;
        char attr_path[SYSFS_PATH_SIZE];
        size_t len;
 
@@ -225,6 +226,21 @@ sysfs_get_fc_nodename (struct sysfs_device * dev, char * node,
        }
 
        len = sysfs_attr_get_value(attr_path, "node_name", node, NODE_NAME_SIZE);
+       if (len)
+               return 0;
+
+       if (sscanf(dev->devpath, "/devices/platform/host%u/session%u/",
+                  &checkhost, &session) != 2)
+               return 1;
+       if (checkhost != host)
+               return 1;
+       if (safe_sprintf(attr_path, "/devices/platform/host%u/session%u/iscsi_session/session%u", host, session, session)) {
+               condlog(0, "attr_path too small");
+               return 1;
+       }
+
+       len = sysfs_attr_get_value(attr_path, "targetname", node,
+                                  NODE_NAME_SIZE);
        if (!len)
                return 1;
 
@@ -562,7 +578,7 @@ scsi_sysfs_pathinfo (struct path * pp, struct sysfs_device * parent)
        /*
         * target node name
         */
-       if(!sysfs_get_fc_nodename(parent, pp->tgt_node_name,
+       if(!sysfs_get_tgt_nodename(parent, pp->tgt_node_name,
                                 pp->sg_id.host_no,
                                 pp->sg_id.channel,
                                 pp->sg_id.scsi_id)) {
index 97caa31ac23f8947c0c76d5c87967c22cba7d378..85a7a50c0c9c5b9fdb8c1f8ff4c18002ed5bc8df 100644 (file)
@@ -5,7 +5,7 @@
 
 #define WWID_SIZE              128
 #define SERIAL_SIZE            65
-#define NODE_NAME_SIZE         65
+#define NODE_NAME_SIZE         224
 #define PATH_STR_SIZE          16
 #define PARAMS_SIZE            1024
 #define FILE_NAME_SIZE         256