--- multipathd/main.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) Index: multipath-tools/multipathd/main.c =================================================================== --- multipath-tools.orig/multipathd/main.c +++ multipath-tools/multipathd/main.c @@ -943,14 +943,41 @@ retry_count_tick(vector mpvec) } } -int update_path_groups(struct multipath *mpp, struct vectors *vecs) +int update_prio(struct path *pp, int refresh_all) +{ + int oldpriority; + struct pathgroup * pgp; + int i, j, changed = 0; + + if (refresh_all) { + vector_foreach_slot (pp->mpp->pg, pgp, i) { + vector_foreach_slot (pgp->paths, pp, j) { + oldpriority = pp->priority; + pathinfo(pp, conf->hwtable, DI_PRIO); + if (pp->priority != oldpriority) + changed = 1; + } + } + return changed; + } + oldpriority = pp->priority; + pathinfo(pp, conf->hwtable, DI_PRIO); + + if (pp->priority == oldpriority) + return 0; + return 1; +} + +int update_path_groups(struct multipath *mpp, struct vectors *vecs, int refresh) { int i; struct path * pp; update_mpp_paths(mpp, vecs->pathvec); - vector_foreach_slot (mpp->paths, pp, i) - pathinfo(pp, conf->hwtable, DI_PRIO); + if (!refresh) { + vector_foreach_slot (mpp->paths, pp, i) + pathinfo(pp, conf->hwtable, DI_PRIO); + } setup_map(mpp); mpp->action = ACT_RELOAD; if (domap(mpp) <= 0) { @@ -969,7 +996,6 @@ void check_path (struct vectors * vecs, struct path * pp) { int newstate; - int oldpriority; int new_path_up = 0; if (!pp->mpp) @@ -1072,12 +1098,11 @@ check_path (struct vectors * vecs, struc * path prio refreshing */ condlog(4, "path prio refresh"); - oldpriority = pp->priority; - pathinfo(pp, conf->hwtable, DI_PRIO); - if (pp->priority != oldpriority && - pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio) - update_path_groups(pp->mpp, vecs); - else if (need_switch_pathgroup(pp->mpp, new_path_up)) { + if (update_prio(pp, new_path_up) && + pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio && + pp->mpp->pgfailback != -FAILBACK_FOLLOWOVER) + update_path_groups(pp->mpp, vecs, !new_path_up); + else if (need_switch_pathgroup(pp->mpp, 0)) { if (pp->mpp->pgfailback > 0 && (new_path_up || pp->mpp->failback_tick <= 0)) pp->mpp->failback_tick =