Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:Test
multipath-tools
multipath-tools-update-dev_loss_tmo-handling
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File multipath-tools-update-dev_loss_tmo-handling of Package multipath-tools
commit 56f63c78a2f6446d283cfeb6884b6f730a712488 Author: Hannes Reinecke <hare@suse.de> Date: Wed Jan 21 14:44:48 2009 +0100 Update dev_loss_tmo handling The original implementation didn't update the hwe-specific settings and failed to detect the correct rport. So fixing it. Signed-off-by: Hannes Reinecke <hare@suse.de> diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index d8d1e30..c37247a 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -212,12 +212,10 @@ sysfs_get_fc_nodename (struct sysfs_device * dev, char * node, int sysfs_set_fc_values (struct path *pp, int dev_loss_tmo, int fast_io_fail_tmo) { + char *rport; char attr_path[SYSFS_PATH_SIZE]; - char host_path[SYSFS_PATH_SIZE]; char attr_value[NAME_SIZE]; - DIR *host_dir, *rport_dir; - struct dirent *host_ent, *rport_ent; - int host, channel, lun, port, num; + int host, num; int rport_channel = -1; int rport_id = -1; @@ -226,74 +224,48 @@ sysfs_set_fc_values (struct path *pp, int dev_loss_tmo, int fast_io_fail_tmo) return 0; } - if (safe_sprintf(host_path, "/sys/class/fc_host/host%i/device", - pp->sg_id.host_no)) { - condlog(0, "host_path too small"); - return 1; - } - if (!(host_dir = opendir(host_path))) { - condlog(3, "host %d not a FC HBA", pp->sg_id.host_no); + if (!pp->sysdev) { + condlog(3, "%s: no sysfs device set", pp->dev); return 0; } - while (rport_channel < 0 && rport_id < 0 && - (host_ent = readdir(host_dir))) { - if (sscanf(host_ent->d_name, "rport-%d:%d-%d", - &host, &port, &num) != 3) - continue; - - if (host != pp->sg_id.host_no) - continue; - - if (safe_sprintf(attr_path, "%s/%s", - host_path, host_ent->d_name)) { - condlog(0, "target_path too small"); - continue; - } - - if (!(rport_dir = opendir(attr_path))) { - condlog(1, "cannot open rport path '%s'", attr_path); - continue; - } - - while ((rport_ent = readdir(rport_dir))) { - if (sscanf(rport_ent->d_name, "target%d:%d:%d", - &host, &channel, &lun) != 3) - continue; - - if (host != pp->sg_id.host_no && - channel != pp->sg_id.channel && - lun != pp->sg_id.scsi_id) - continue; + condlog(4, "%s: checking rport for %s", pp->dev, + pp->sysdev ? pp->sysdev->devpath : NULL); - rport_channel = port; - rport_id = num; - break; - } + rport = strstr(pp->sysdev->devpath, "rport"); + if (!rport || sscanf(rport, "rport-%d:%d-%d/%*s", + &host, &rport_channel, &rport_id) != 3) { + condlog(3, "%s: Invalid devpath %s", + pp->dev, pp->sysdev->devpath); + return 1; } if (rport_channel < 0 && rport_id < 0) { - condlog(1, "No rport found"); + condlog(3, "%s: No rport found", pp->dev); return 0; } + condlog(4, "%s: using rport-%d:%d-%d for target%d:%d:%d", pp->dev, + host, rport_channel, rport_id, + pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id); + if (safe_sprintf(attr_path, "/class/fc_remote_ports/rport-%d:%d-%d", - pp->sg_id.host_no, rport_channel, rport_id)) { - condlog(0, "attr_path too small"); + host, rport_channel, rport_id)) { + condlog(1, "attr_path too small"); return 0; } + condlog(4, "%s: set dev_loss_tmo to %d, fast_io_fail to %d", + pp->dev, dev_loss_tmo, fast_io_fail_tmo); + if (dev_loss_tmo < 0) sprintf(attr_value, "%d", 0); else sprintf(attr_value, "%d", dev_loss_tmo); num = sysfs_attr_set_value(attr_path, "dev_loss_tmo", attr_value, strlen(attr_value)); - if (num > 0) - condlog(4, "%s: set dev_loss_tmo to %d", pp->dev, - dev_loss_tmo); - else + if (num <= 0) condlog(4, "%s: failed to set dev_loss_tmo (%d)", pp->dev, errno); @@ -303,10 +275,7 @@ sysfs_set_fc_values (struct path *pp, int dev_loss_tmo, int fast_io_fail_tmo) sprintf(attr_value, "%d", fast_io_fail_tmo); num = sysfs_attr_set_value(attr_path, "fast_io_fail_tmo", attr_value, strlen(attr_value)); - if (num > 0) - condlog(4, "%s: set fast_io_fail_tmo to %d", pp->dev, - fast_io_fail_tmo); - else + if (num <= 0) condlog(4, "%s: failed to set fast_io_fail_tmo (%d)", pp->dev, errno); diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c index 1632c9d..6cc7a93 100644 --- a/libmultipath/structs_vec.c +++ b/libmultipath/structs_vec.c @@ -479,12 +479,16 @@ verify_paths(struct multipath * mpp, struct vectors * vecs, vector rpvec) free_path(pp); } } else { - if (pp->hwe) - sysfs_set_fc_values(pp, pp->hwe->dev_loss_tmo, - pp->hwe->fast_io_fail_tmo); - else - sysfs_set_fc_values(pp, conf->dev_loss_tmo, - conf->fast_io_fail_tmo); + int dev_loss_tmo = conf->dev_loss_tmo; + int fast_io_fail_tmo = conf->fast_io_fail_tmo; + + if (pp->hwe && pp->hwe->dev_loss_tmo > 0) + dev_loss_tmo = pp->hwe->dev_loss_tmo; + if (pp->hwe && pp->hwe->fast_io_fail_tmo > 0) + fast_io_fail_tmo = pp->hwe->fast_io_fail_tmo; + + sysfs_set_fc_values(pp, dev_loss_tmo, + fast_io_fail_tmo); condlog(4, "%s: verified path %s dev_t %s", mpp->alias, pp->dev, pp->dev_t); }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor