dm mpath: delay retry of bypassed pg
authorMike Christie <michaelc@cs.wisc.edu>
Sat, 2 Jun 2012 23:29:45 +0000 (00:29 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Sat, 2 Jun 2012 23:29:45 +0000 (00:29 +0100)
If I/O needs retrying and only bypassed priority groups are available,
set the pg_init_delay_retry flag to wait before retrying.

If, for example, the reason for the bypass is that the controller is
getting reset or there is a firmware upgrade happening, retrying right
away would cause a flood of log messages and retries for what could be a
few seconds or even several minutes.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Acked-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-mpath.c

index c35160786cf4ea93945ce7730ee37e2731902444..2469ba68dc2bad6e48d9cc9f1261d7d6eec3e84f 100644 (file)
@@ -329,14 +329,18 @@ static void __choose_pgpath(struct multipath *m, size_t nr_bytes)
        /*
         * Loop through priority groups until we find a valid path.
         * First time we skip PGs marked 'bypassed'.
-        * Second time we only try the ones we skipped.
+        * Second time we only try the ones we skipped, but set
+        * pg_init_delay_retry so we do not hammer controllers.
         */
        do {
                list_for_each_entry(pg, &m->priority_groups, list) {
                        if (pg->bypassed == bypassed)
                                continue;
-                       if (!__choose_path_in_pg(m, pg, nr_bytes))
+                       if (!__choose_path_in_pg(m, pg, nr_bytes)) {
+                               if (!bypassed)
+                                       m->pg_init_delay_retry = 1;
                                return;
+                       }
                }
        } while (bypassed--);