diff options
author | Benjamin Marzinski <bmarzins@redhat.com> | 2010-03-25 00:44:17 -0500 |
---|---|---|
committer | Christophe Varoqui <christophe.varoqui@opensvc.com> | 2010-03-25 20:18:23 +0100 |
commit | e276a4eb7aff698a9a070b582d3b56d41c35c89e (patch) | |
tree | 68f36b9216d0ecc726ec245371c2bccee0f5320f | |
parent | 6ec48625e68f66e993178348a4a1e7916ac1222d (diff) | |
download | multipath-tools-e276a4eb7aff698a9a070b582d3b56d41c35c89e.tar.gz multipath-tools-e276a4eb7aff698a9a070b582d3b56d41c35c89e.tar.bz2 multipath-tools-e276a4eb7aff698a9a070b582d3b56d41c35c89e.zip |
multipath: patch checker consolidation
This patch does two things. First, it allows the tur checker to retry when it
fails with DID_TRANSPORT_DISRUPTED. Second, it makes both calls to check a path
use get_state, do avoid duplicated code.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
-rw-r--r-- | libmultipath/checkers/tur.c | 1 | ||||
-rw-r--r-- | libmultipath/discovery.c | 36 | ||||
-rw-r--r-- | libmultipath/discovery.h | 1 | ||||
-rw-r--r-- | multipathd/main.c | 20 |
4 files changed, 24 insertions, 34 deletions
diff --git a/libmultipath/checkers/tur.c b/libmultipath/checkers/tur.c index e06dc52..47107a2 100644 --- a/libmultipath/checkers/tur.c +++ b/libmultipath/checkers/tur.c @@ -69,7 +69,6 @@ libcheck_check (struct checker * c) case DID_NO_CONNECT: case DID_BAD_TARGET: case DID_ABORT: - case DID_TRANSPORT_DISRUPTED: case DID_TRANSPORT_FAILFAST: break; default: diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index e7c8ead..cf8cb35 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -741,38 +741,41 @@ cciss_ioctl_pathinfo (struct path * pp, int mask) return 0; } -static int -get_state (struct path * pp) +int +get_state (struct path * pp, int daemon) { struct checker * c = &pp->checker; - int sysfs_state; + int state; condlog(3, "%s: get_state", pp->dev); if (!checker_selected(c)) { + if (daemon) + pathinfo(pp, conf->hwtable, DI_SYSFS); select_checker(pp); if (!checker_selected(c)) { condlog(3, "%s: No checker selected", pp->dev); - return 1; + return PATH_UNCHECKED; } checker_set_fd(c, pp->fd); if (checker_init(c, pp->mpp?&pp->mpp->mpcontext:NULL)) { condlog(3, "%s: checker init failed", pp->dev); - return 1; + return PATH_UNCHECKED; } } - sysfs_state = path_offline(pp); - if (sysfs_state != PATH_UP) { + state = path_offline(pp); + if (state != PATH_UP) { condlog(3, "%s: path inaccessible", pp->dev); - pp->state = sysfs_state; - return 0; + return state; } - pp->state = checker_check(c); - condlog(3, "%s: state = %i", pp->dev, pp->state); - if (pp->state == PATH_DOWN && strlen(checker_message(c))) + if (daemon) + checker_set_async(c); + state = checker_check(c); + condlog(3, "%s: state = %i", pp->dev, state); + if (state == PATH_DOWN && strlen(checker_message(c))) condlog(3, "%s: checker msg is \"%s\"", pp->dev, checker_message(c)); - return 0; + return state; } static int @@ -857,8 +860,11 @@ pathinfo (struct path *pp, vector hwtable, int mask) cciss_ioctl_pathinfo(pp, mask)) goto blank; - if (mask & DI_CHECKER && get_state(pp)) - goto blank; + if (mask & DI_CHECKER) { + pp->state = get_state(pp, 0); + if (pp->state == PATH_UNCHECKED || pp->state == PATH_WILD) + goto blank; + } /* * Retrieve path priority, even for PATH_DOWN paths if it has never diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h index dd9671e..ec3a358 100644 --- a/libmultipath/discovery.h +++ b/libmultipath/discovery.h @@ -30,6 +30,7 @@ int path_discovery (vector pathvec, struct config * conf, int flag); int do_tur (char *); int devt2devname (char *, char *); int path_offline (struct path *); +int get_state (struct path * pp, int daemon); int pathinfo (struct path *, vector hwtable, int mask); struct path * store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag); diff --git a/multipathd/main.c b/multipathd/main.c index 8754144..5bf20bb 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -934,25 +934,9 @@ check_path (struct vectors * vecs, struct path * pp) */ pp->tick = conf->checkint; - if (!checker_selected(&pp->checker)) { - pathinfo(pp, conf->hwtable, DI_SYSFS); - select_checker(pp); - } - if (!checker_selected(&pp->checker)) { - condlog(0, "%s: checker is not set", pp->dev); - return; - } - /* - * Set checker in async mode. - * Honored only by checker implementing the said mode. - */ - checker_set_async(&pp->checker); - - newstate = path_offline(pp); - if (newstate == PATH_UP) - newstate = checker_check(&pp->checker); + newstate = get_state(pp, 1); - if (newstate < 0) { + if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) { condlog(2, "%s: unusable path", pp->dev); pathinfo(pp, conf->hwtable, 0); return; |