aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-thin.c
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2014-02-14 18:10:55 -0500
committerMike Snitzer <snitzer@redhat.com>2014-03-04 11:17:51 -0500
commitcdc2b4158405f1975f9d5205096f08430eda1c0e (patch)
treec04121db0a4f02f49354dd9a1f5ed70aa67ca09f /drivers/md/dm-thin.c
parent2c945820cab96ebf265598d998e63ef22393d0d4 (diff)
dm thin: synchronize the pool mode during suspend
Commit b5330655 ("dm thin: handle metadata failures more consistently") increased potential for the pool's mode to be changed in response to metadata operation failures. When the pool mode is changed it isn't synchronized with the mode in pool_features stored in the target's context (ti->private) that is used as the basis for (re)establishing the pool mode during resume via bind_control_target. It is important that we synchronize the pool mode when it is changed otherwise the pool may experience and unexpected mode transition on the next resume (especially if there was no new table load). Signed-off-by: Mike Snitzer <snitzer@redhat.com> Acked-by: Joe Thornber <ejt@redhat.com>
Diffstat (limited to 'drivers/md/dm-thin.c')
-rw-r--r--drivers/md/dm-thin.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 7e84baccf0ad..dfa48ec7b8ea 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -1402,6 +1402,7 @@ static enum pool_mode get_pool_mode(struct pool *pool)
1402static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) 1402static void set_pool_mode(struct pool *pool, enum pool_mode new_mode)
1403{ 1403{
1404 int r; 1404 int r;
1405 struct pool_c *pt = pool->ti->private;
1405 enum pool_mode old_mode = pool->pf.mode; 1406 enum pool_mode old_mode = pool->pf.mode;
1406 1407
1407 switch (new_mode) { 1408 switch (new_mode) {
@@ -1448,6 +1449,11 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode)
1448 } 1449 }
1449 1450
1450 pool->pf.mode = new_mode; 1451 pool->pf.mode = new_mode;
1452 /*
1453 * The pool mode may have changed, sync it so bind_control_target()
1454 * doesn't cause an unexpected mode transition on resume.
1455 */
1456 pt->adjusted_pf.mode = new_mode;
1451} 1457}
1452 1458
1453/* 1459/*