Try bypassed PGs too before failing. --- diff/drivers/md/dm-mpath.c 2004-10-29 15:39:38.000000000 +0100 +++ source/drivers/md/dm-mpath.c 2004-10-29 15:39:44.000000000 +0100 @@ -208,11 +208,19 @@ { struct priority_group *pg; struct path *path = NULL; + unsigned bypass = 1; - if (m->nr_valid_paths) { - /* loop through priority groups until we find a valid path. */ + if (!m->nr_valid_paths) + goto out; + + /* + * Loop through priority groups until we find a valid path. + * First time we skip PGs marked 'bypass'. + * Second time we only try the ones we skipped. + */ + do { list_for_each_entry (pg, &m->priority_groups, list) { - if (pg->bypass) + if (pg->bypass == bypass) continue; path = pg->ps.type->select_path(&pg->ps, &m->current_count); @@ -222,10 +230,11 @@ if (m->current_pg != pg) __switch_pg(m, path); - break; + goto out; } - } + } while (bypass--); +out: m->current_path = path; }