|
|
@@ -959,7 +959,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result)
|
|
|
* table reload).
|
|
|
*/
|
|
|
if (!free_blocks) {
|
|
|
- DMWARN("%s: no free space available.",
|
|
|
+ DMWARN("%s: no free data space available.",
|
|
|
dm_device_name(pool->pool_md));
|
|
|
spin_lock_irqsave(&pool->lock, flags);
|
|
|
pool->no_free_space = 1;
|
|
|
@@ -969,8 +969,16 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result)
|
|
|
}
|
|
|
|
|
|
r = dm_pool_alloc_data_block(pool->pmd, result);
|
|
|
- if (r)
|
|
|
+ if (r) {
|
|
|
+ if (r == -ENOSPC &&
|
|
|
+ !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) &&
|
|
|
+ !free_blocks) {
|
|
|
+ DMWARN("%s: no free metadata space available.",
|
|
|
+ dm_device_name(pool->pool_md));
|
|
|
+ set_pool_mode(pool, PM_READ_ONLY);
|
|
|
+ }
|
|
|
return r;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|