libmultipath: Remove duplicate calls to path_offline()
authorHannes Reinecke <hare@suse.de>
Thu, 27 May 2010 11:53:43 +0000 (13:53 +0200)
committerHannes Reinecke <hare@suse.de>
Wed, 18 May 2011 07:48:05 +0000 (09:48 +0200)
When calling pathinfo() path_offline() is called several times
in a row, which is quite unnecessary.

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/discovery.c
multipathd/main.c

index 077e0cc..a612fb8 100644 (file)
@@ -796,11 +796,6 @@ get_state (struct path * pp, int daemon)
                }
        }
        checker_clear_message(c);
-       state = path_offline(pp);
-       if (state != PATH_UP) {
-               condlog(3, "%s: path inaccessible", pp->dev);
-               return state;
-       }
        if (daemon)
                checker_set_async(c);
        if (!conf->checker_timeout)
@@ -819,12 +814,6 @@ get_prio (struct path * pp)
        if (!pp)
                return 0;
 
-       path_state = path_offline(pp);
-       if (path_state != PATH_UP) {
-               pp->priority = PRIO_UNDEF;
-               return 0;
-       }
-
        if (!pp->prio) {
                select_prio(pp);
                if (!pp->prio) {
@@ -874,6 +863,8 @@ get_uid (struct path * pp)
 extern int
 pathinfo (struct path *pp, vector hwtable, int mask)
 {
+       int path_state;
+
        condlog(3, "%s: mask = 0x%x", pp->dev, mask);
 
        /*
@@ -882,6 +873,8 @@ pathinfo (struct path *pp, vector hwtable, int mask)
        if (mask & DI_SYSFS && sysfs_pathinfo(pp))
                return 1;
 
+       path_state = path_offline(pp);
+
        /*
         * fetch info not available through sysfs
         */
@@ -897,7 +890,7 @@ pathinfo (struct path *pp, vector hwtable, int mask)
        if (mask & DI_SERIAL)
                get_geometry(pp);
 
-       if (pp->bus == SYSFS_BUS_SCSI &&
+       if (path_state == PATH_UP && pp->bus == SYSFS_BUS_SCSI &&
            scsi_ioctl_pathinfo(pp, mask))
                goto blank;
 
@@ -906,23 +899,32 @@ pathinfo (struct path *pp, vector hwtable, int mask)
                goto blank;
 
        if (mask & DI_CHECKER) {
-               pp->state = get_state(pp, 0);
-               if (pp->state == PATH_UNCHECKED || pp->state == PATH_WILD)
-                       goto blank;
+               if (path_state == PATH_UP) {
+                       pp->state = get_state(pp, 0);
+                       if (pp->state == PATH_UNCHECKED ||
+                           pp->state == PATH_WILD)
+                               goto blank;
+               } else {
+                       condlog(3, "%s: path inaccessible", pp->dev);
+                       pp->state = path_state;
+               }
        }
 
         /*
          * Retrieve path priority, even for PATH_DOWN paths if it has never
          * been successfully obtained before.
          */
-       if (mask & DI_PRIO &&
-           (pp->state != PATH_DOWN || pp->priority == PRIO_UNDEF)) {
-               if (!strlen(pp->wwid))
-                       get_uid(pp);
-               get_prio(pp);
+       if ((mask & DI_PRIO) && path_state == PATH_UP) {
+               if (pp->state != PATH_DOWN || pp->priority == PRIO_UNDEF) {
+                       if (!strlen(pp->wwid))
+                               get_uid(pp);
+                       get_prio(pp);
+               } else {
+                       pp->priority = PRIO_UNDEF;
+               }
        }
 
-       if (mask & DI_WWID && !strlen(pp->wwid))
+       if (path_state == PATH_UP && (mask & DI_WWID) && !strlen(pp->wwid))
                get_uid(pp);
 
        return 0;
index 2584aec..6008d77 100644 (file)
@@ -1003,7 +1003,9 @@ check_path (struct vectors * vecs, struct path * pp)
         */
        pp->tick = conf->checkint;
 
-       newstate = get_state(pp, 1);
+       newstate = path_offline(pp);
+       if (newstate == PATH_UP)
+               newstate = get_state(pp, 1);
 
        if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) {
                condlog(2, "%s: unusable path", pp->dev);