multipath: patch checker consolidation
authorBenjamin Marzinski <bmarzins@redhat.com>
Thu, 25 Mar 2010 05:44:17 +0000 (00:44 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 25 Mar 2010 19:18:23 +0000 (20:18 +0100)
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>
libmultipath/checkers/tur.c
libmultipath/discovery.c
libmultipath/discovery.h
multipathd/main.c

index e06dc52..47107a2 100644 (file)
@@ -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:
index e7c8ead..cf8cb35 100644 (file)
@@ -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
index dd9671e..ec3a358 100644 (file)
@@ -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);
index 8754144..5bf20bb 100644 (file)
@@ -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;