When multipath is not set to group_by_prio, different paths in a pathgroup can have different priorities. If there is a problem getting the priority of an active path, its priority will be set to PRIO_UNDEF. This will change the priority of the whole pathgroup, even though it's likely that this is simply a temporary error. Instead, do not count PRIO_UNDEF paths towards to priority of the path group, unless there are no paths that have an actual priority. This will not effect the priority of multipath devices with group_by_prio, since all paths in a pathgroup will have the same priority.
Reviewed-by: Martin Wilck <mwi...@suse.com> Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com> --- libmultipath/switchgroup.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libmultipath/switchgroup.c b/libmultipath/switchgroup.c index 6fdfcfa7..b1e1f39b 100644 --- a/libmultipath/switchgroup.c +++ b/libmultipath/switchgroup.c @@ -12,6 +12,7 @@ void path_group_prio_update(struct pathgroup *pgp) int i; int priority = 0; int marginal = 0; + int defined_prios = 0; struct path * pp; pgp->enabled_paths = 0; @@ -24,12 +25,17 @@ void path_group_prio_update(struct pathgroup *pgp) marginal++; if (pp->state == PATH_UP || pp->state == PATH_GHOST) { - priority += pp->priority; + if (pp->priority != PRIO_UNDEF) { + defined_prios++; + priority += pp->priority; + } pgp->enabled_paths++; } } - if (pgp->enabled_paths) - pgp->priority = priority / pgp->enabled_paths; + if (defined_prios) + pgp->priority = priority / defined_prios; + else if (pgp->enabled_paths) + pgp->priority = PRIO_UNDEF; else pgp->priority = 0; if (marginal && marginal == i) -- 2.17.2 -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel