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;
 }
 
