Fix for bz #566685.
authorBenjamin Marzinski <bmarzins@sourceware.org>
Thu, 2 Sep 2010 08:07:15 +0000 (10:07 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 2 Sep 2010 08:07:15 +0000 (10:07 +0200)
Multipathd now will reload the device if it notices that the
priorities have changed during the checkerloop.

multipathd/main.c

index 6ee7903..e167b8b 100644 (file)
@@ -47,6 +47,7 @@
 #include <print.h>
 #include <configure.h>
 #include <prio.h>
+#include <pgpolicies.h>
 
 #include "main.h"
 #include "pidfile.h"
@@ -917,10 +918,33 @@ retry_count_tick(vector mpvec)
        }
 }
 
+int update_path_groups(struct multipath *mpp, struct vectors *vecs)
+{
+       int i;
+       struct path * pp;
+
+       update_mpp_paths(mpp, vecs->pathvec);
+       vector_foreach_slot (mpp->paths, pp, i)
+               pathinfo(pp, conf->hwtable, DI_PRIO);
+       setup_map(mpp);
+       mpp->action = ACT_RELOAD;
+       if (domap(mpp) <= 0) {
+               condlog(0, "%s: failed to update map : %s", mpp->alias,
+                               strerror(errno));
+               return 1;
+       }
+       dm_lib_release();
+       setup_multipath(vecs, mpp);
+       sync_map_state(mpp);
+
+       return 0;
+}
+
 void
 check_path (struct vectors * vecs, struct path * pp)
 {
        int newstate;
+       int oldpriority;
 
        if (!pp->mpp)
                return;
@@ -1030,12 +1054,16 @@ check_path (struct vectors * vecs, struct path * pp)
         * path prio refreshing
         */
        condlog(4, "path prio refresh");
+       oldpriority = pp->priority;
        pathinfo(pp, conf->hwtable, DI_PRIO);
 
        /*
         * pathgroup failback policy
         */
-       if (need_switch_pathgroup(pp->mpp, 0)) {
+       if (pp->priority != oldpriority &&
+           pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio)
+               update_path_groups(pp->mpp, vecs);
+       else if (need_switch_pathgroup(pp->mpp, 0)) {
                if (pp->mpp->pgfailback > 0 &&
                    pp->mpp->failback_tick <= 0)
                        pp->mpp->failback_tick =