|
@@ -1425,6 +1425,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode)
|
|
|
break;
|
|
|
|
|
|
case PM_WRITE:
|
|
|
+ dm_pool_metadata_read_write(pool->pmd);
|
|
|
pool->process_bio = process_bio;
|
|
|
pool->process_discard = process_discard;
|
|
|
pool->process_prepared_mapping = process_prepared_mapping;
|
|
@@ -1641,12 +1642,19 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti)
|
|
|
struct pool_c *pt = ti->private;
|
|
|
|
|
|
/*
|
|
|
- * We want to make sure that degraded pools are never upgraded.
|
|
|
+ * We want to make sure that a pool in PM_FAIL mode is never upgraded.
|
|
|
*/
|
|
|
enum pool_mode old_mode = pool->pf.mode;
|
|
|
enum pool_mode new_mode = pt->adjusted_pf.mode;
|
|
|
|
|
|
- if (old_mode > new_mode)
|
|
|
+ /*
|
|
|
+ * If we were in PM_FAIL mode, rollback of metadata failed. We're
|
|
|
+ * not going to recover without a thin_repair. So we never let the
|
|
|
+ * pool move out of the old mode. On the other hand a PM_READ_ONLY
|
|
|
+ * may have been due to a lack of metadata or data space, and may
|
|
|
+ * now work (ie. if the underlying devices have been resized).
|
|
|
+ */
|
|
|
+ if (old_mode == PM_FAIL)
|
|
|
new_mode = old_mode;
|
|
|
|
|
|
pool->ti = ti;
|