aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2012-06-02 19:29:45 -0400
committerAlasdair G Kergon <agk@redhat.com>2012-06-02 19:29:45 -0400
commitf220fd4efb334a772f9a14b2372175f38d89355e (patch)
treeeeca11526d28f47e7595c66079621e4bfb1e827c
parent1fbdd2b3a3cf77f77b0cdf25dd969241ea2c0ce1 (diff)
dm mpath: delay retry of bypassed pg
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>
-rw-r--r--drivers/md/dm-mpath.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index c35160786cf4..2469ba68dc2b 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -329,14 +329,18 @@ static void __choose_pgpath(struct multipath *m, size_t nr_bytes)
329 /* 329 /*
330 * Loop through priority groups until we find a valid path. 330 * Loop through priority groups until we find a valid path.
331 * First time we skip PGs marked 'bypassed'. 331 * First time we skip PGs marked 'bypassed'.
332 * Second time we only try the ones we skipped. 332 * Second time we only try the ones we skipped, but set
333 * pg_init_delay_retry so we do not hammer controllers.
333 */ 334 */
334 do { 335 do {
335 list_for_each_entry(pg, &m->priority_groups, list) { 336 list_for_each_entry(pg, &m->priority_groups, list) {
336 if (pg->bypassed == bypassed) 337 if (pg->bypassed == bypassed)
337 continue; 338 continue;
338 if (!__choose_path_in_pg(m, pg, nr_bytes)) 339 if (!__choose_path_in_pg(m, pg, nr_bytes)) {
340 if (!bypassed)
341 m->pg_init_delay_retry = 1;
339 return; 342 return;
343 }
340 } 344 }
341 } while (bypassed--); 345 } while (bypassed--);
342 346