multipath: make tgt_node_name work for iscsi devices
Benjamin Marzinski
maintainerPATCH 1/1 multipath: make tgt_node_name work for iscsi devices
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.
--- libmultipath/discovery.c | 20 ++++++++++++++++++-- libmultipath/structs.h | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-)
libmultipath/discovery.c +18 -2
@@ -210,10 +210,11 @@ sysfs_get_size (struct sysfs_device * de }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_devi } 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, s/* * 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)) {
libmultipath/structs.h +1 -1
@@ -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
Christophe Varoqui
AppliedQuoted 5 lines · Benjamin Marzinski
tgt_node_namewasn't displaying anything for iscsi devices. With this change, if multipath can't get thenode_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.
Applied.
Quoted 67 lines
Signed-off-by Benjamin Marzinski <[email protected]>--- libmultipath/discovery.c | 20 ++++++++++++++++++-- libmultipath/structs.h | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-)Index:
multipath-tools-111219/libmultipath/discovery.c
===================================================================libmultipath/discovery.c +18
-2@@ -210,10 +210,11 @@ sysfs_get_size (struct sysfs_device * de }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_devi } 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, s/* * 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:
multipath-tools-111219/libmultipath/structs.h
===================================================================libmultipath/structs.h +1
-1@@ -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