diff options
| author | Joe Thornber <ejt@redhat.com> | 2013-12-04 16:58:19 -0500 |
|---|---|---|
| committer | Mike Snitzer <snitzer@redhat.com> | 2013-12-10 16:35:13 -0500 |
| commit | 9b7aaa64f96f7ca280d75326fca42f42017b89ef (patch) | |
| tree | a0028aeb56bc229e9bc7b1dfcecbb3f03d213131 /drivers/md/persistent-data | |
| parent | 5383ef3a929a1366e2ced45cd6d74be7aa2a2281 (diff) | |
dm thin: allow pool in read-only mode to transition to read-write mode
A thin-pool may be in read-only mode because the pool's data or metadata
space was exhausted. To allow for recovery, by adding more space to the
pool, we must allow a pool to transition from PM_READ_ONLY to PM_WRITE
mode. Otherwise, running out of space will render the pool permanently
read-only.
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/md/persistent-data')
| -rw-r--r-- | drivers/md/persistent-data/dm-block-manager.c | 6 | ||||
| -rw-r--r-- | drivers/md/persistent-data/dm-block-manager.h | 7 |
2 files changed, 10 insertions, 3 deletions
diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c index a7e8bf296388..064a3c271baa 100644 --- a/drivers/md/persistent-data/dm-block-manager.c +++ b/drivers/md/persistent-data/dm-block-manager.c | |||
| @@ -626,6 +626,12 @@ void dm_bm_set_read_only(struct dm_block_manager *bm) | |||
| 626 | } | 626 | } |
| 627 | EXPORT_SYMBOL_GPL(dm_bm_set_read_only); | 627 | EXPORT_SYMBOL_GPL(dm_bm_set_read_only); |
| 628 | 628 | ||
| 629 | void dm_bm_set_read_write(struct dm_block_manager *bm) | ||
| 630 | { | ||
| 631 | bm->read_only = false; | ||
| 632 | } | ||
| 633 | EXPORT_SYMBOL_GPL(dm_bm_set_read_write); | ||
| 634 | |||
| 629 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor) | 635 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor) |
| 630 | { | 636 | { |
| 631 | return crc32c(~(u32) 0, data, len) ^ init_xor; | 637 | return crc32c(~(u32) 0, data, len) ^ init_xor; |
diff --git a/drivers/md/persistent-data/dm-block-manager.h b/drivers/md/persistent-data/dm-block-manager.h index 9a82083a66b6..13cd58e1fe69 100644 --- a/drivers/md/persistent-data/dm-block-manager.h +++ b/drivers/md/persistent-data/dm-block-manager.h | |||
| @@ -108,9 +108,9 @@ int dm_bm_unlock(struct dm_block *b); | |||
| 108 | int dm_bm_flush_and_unlock(struct dm_block_manager *bm, | 108 | int dm_bm_flush_and_unlock(struct dm_block_manager *bm, |
| 109 | struct dm_block *superblock); | 109 | struct dm_block *superblock); |
| 110 | 110 | ||
| 111 | /* | 111 | /* |
| 112 | * Request data be prefetched into the cache. | 112 | * Request data is prefetched into the cache. |
| 113 | */ | 113 | */ |
| 114 | void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b); | 114 | void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b); |
| 115 | 115 | ||
| 116 | /* | 116 | /* |
| @@ -125,6 +125,7 @@ void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b); | |||
| 125 | * be returned if you do. | 125 | * be returned if you do. |
| 126 | */ | 126 | */ |
| 127 | void dm_bm_set_read_only(struct dm_block_manager *bm); | 127 | void dm_bm_set_read_only(struct dm_block_manager *bm); |
| 128 | void dm_bm_set_read_write(struct dm_block_manager *bm); | ||
| 128 | 129 | ||
| 129 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor); | 130 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor); |
| 130 | 131 | ||
