diff options
author | Mike Snitzer <snitzer@redhat.com> | 2013-12-03 12:20:57 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2013-12-10 16:35:04 -0500 |
commit | 4a02b34e0cf1d0d0dd3737702841da4bf615a50a (patch) | |
tree | d76dc3c0238b676eafd3eb942f04ac5d5ce965b6 /drivers/md/dm-thin.c | |
parent | fafc7a815e40255d24e80a1cb7365892362fa398 (diff) |
dm thin: switch to read-only mode if metadata space is exhausted
Switch the thin pool to read-only mode in alloc_data_block() if
dm_pool_alloc_data_block() fails because the pool's metadata space is
exhausted.
Differentiate between data and metadata space in messages about no
free space available.
This issue was noticed with the device-mapper-test-suite using:
dmtest run --suite thin-provisioning -n /exhausting_metadata_space_causes_fail_mode/
The quantity of errors logged in this case must be reduced.
before patch:
device-mapper: thin: 253:4: reached low water mark for metadata device: sending event.
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: space map common: dm_tm_shadow_block() failed
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: space map common: dm_tm_shadow_block() failed
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: space map common: dm_tm_shadow_block() failed
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: space map common: dm_tm_shadow_block() failed
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: space map common: dm_tm_shadow_block() failed
<snip ... these repeat for a _very_ long while ... >
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: thin: 253:4: commit failed: error = -28
device-mapper: thin: 253:4: switching pool to read-only mode
after patch:
device-mapper: thin: 253:4: reached low water mark for metadata device: sending event.
device-mapper: space map metadata: unable to allocate new metadata block
device-mapper: thin: 253:4: no free metadata space available.
device-mapper: thin: 253:4: switching pool to read-only mode
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Acked-by: Joe Thornber <ejt@redhat.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/md/dm-thin.c')
-rw-r--r-- | drivers/md/dm-thin.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 24327adc925c..44ee489f4a6e 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -959,7 +959,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | |||
959 | * table reload). | 959 | * table reload). |
960 | */ | 960 | */ |
961 | if (!free_blocks) { | 961 | if (!free_blocks) { |
962 | DMWARN("%s: no free space available.", | 962 | DMWARN("%s: no free data space available.", |
963 | dm_device_name(pool->pool_md)); | 963 | dm_device_name(pool->pool_md)); |
964 | spin_lock_irqsave(&pool->lock, flags); | 964 | spin_lock_irqsave(&pool->lock, flags); |
965 | pool->no_free_space = 1; | 965 | pool->no_free_space = 1; |
@@ -969,8 +969,16 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | |||
969 | } | 969 | } |
970 | 970 | ||
971 | r = dm_pool_alloc_data_block(pool->pmd, result); | 971 | r = dm_pool_alloc_data_block(pool->pmd, result); |
972 | if (r) | 972 | if (r) { |
973 | if (r == -ENOSPC && | ||
974 | !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && | ||
975 | !free_blocks) { | ||
976 | DMWARN("%s: no free metadata space available.", | ||
977 | dm_device_name(pool->pool_md)); | ||
978 | set_pool_mode(pool, PM_READ_ONLY); | ||
979 | } | ||
973 | return r; | 980 | return r; |
981 | } | ||
974 | 982 | ||
975 | return 0; | 983 | return 0; |
976 | } | 984 | } |