diff options
Diffstat (limited to '0061-RHBZ-620479-find-rport.patch')
-rw-r--r-- | 0061-RHBZ-620479-find-rport.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/0061-RHBZ-620479-find-rport.patch b/0061-RHBZ-620479-find-rport.patch new file mode 100644 index 0000000..e238dae --- /dev/null +++ b/0061-RHBZ-620479-find-rport.patch @@ -0,0 +1,77 @@ +diff -urp multipath-tools-0.4.9-23.el6-Snapshot8/libmultipath/discovery.c multipath-tools-0.4.9-23.el6-findrport/libmultipath/discovery.c +--- multipath-tools-0.4.9-23.el6-Snapshot8/libmultipath/discovery.c 2010-07-30 15:06:10.000000000 +0900 ++++ multipath-tools-0.4.9-23.el6-findrport/libmultipath/discovery.c 2010-07-30 18:02:47.000000000 +0900 +@@ -10,6 +10,7 @@ + #include <sys/stat.h> + #include <dirent.h> + #include <errno.h> ++#include <libgen.h> + + #include "checkers.h" + #include "vector.h" +@@ -229,6 +230,41 @@ sysfs_get_fc_nodename (struct sysfs_devi + return 1; + } + ++static int ++find_rport_id(struct path *pp) ++{ ++ char attr_path[SYSFS_PATH_SIZE]; ++ char *dir, *base; ++ int host, channel, rport_id = -1; ++ ++ if (safe_sprintf(attr_path, ++ "/class/fc_transport/target%i:%i:%i", ++ pp->sg_id.host_no, pp->sg_id.channel, ++ pp->sg_id.scsi_id)) { ++ condlog(0, "attr_path too small for target"); ++ return 1; ++ } ++ ++ if (sysfs_resolve_link(attr_path, SYSFS_PATH_SIZE)) ++ return -1; ++ ++ condlog(4, "target%d:%d:%d -> path %s", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id, attr_path); ++ dir = attr_path; ++ do { ++ base = basename(dir); ++ dir = dirname(dir); ++ ++ if (sscanf((const char *)base, "rport-%d:%d-%d", &host, &channel, &rport_id) == 3) ++ break; ++ } while (strcmp((const char *)dir, "/")); ++ ++ if (rport_id < 0) ++ return -1; ++ ++ condlog(4, "target%d:%d:%d -> rport_id %d", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id, rport_id); ++ return rport_id; ++} ++ + int + sysfs_set_scsi_tmo (struct multipath *mpp) + { +@@ -236,15 +272,21 @@ sysfs_set_scsi_tmo (struct multipath *mp + struct path *pp; + int i; + char value[11]; ++ int rport_id; + + if (!mpp->dev_loss && !mpp->fast_io_fail) + return 0; + vector_foreach_slot(mpp->paths, pp, i) { ++ rport_id = find_rport_id(pp); ++ if (rport_id < 0) { ++ condlog(0, "failed to find rport_id for target%d:%d:%d", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id); ++ return 1; ++ } + if (safe_snprintf(attr_path, SYSFS_PATH_SIZE, + "/class/fc_remote_ports/rport-%d:%d-%d", + pp->sg_id.host_no, pp->sg_id.channel, +- pp->sg_id.scsi_id)) { +- condlog(0, "attr_path '/class/fc_remote_ports/rport-%d:%d-%d' too large", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id); ++ rport_id)) { ++ condlog(0, "attr_path '/class/fc_remote_ports/rport-%d:%d-%d' too large", pp->sg_id.host_no, pp->sg_id.channel, rport_id); + return 1; + } + if (mpp->dev_loss){ |