Use x/y status line to report utilisation like existing targets. --- Documentation/device-mapper/thin-provisioning.txt | 13 ++++++----- drivers/md/dm-thin-metadata.c | 12 +++++++++++ drivers/md/dm-thin-metadata.h | 3 ++ drivers/md/dm-thin.c | 24 +++++++++++++++++----- 4 files changed, 41 insertions(+), 11 deletions(-) Index: linux/Documentation/device-mapper/thin-provisioning.txt =================================================================== --- linux.orig/Documentation/device-mapper/thin-provisioning.txt +++ linux/Documentation/device-mapper/thin-provisioning.txt @@ -187,17 +187,18 @@ i) Constructor ii) Status - - + / + / + transaction id: A 64-bit number used by userspace to help synchronise with metadata from volume managers. - free data space in sectors: - If this drops below the pool's low water mark a dm event will - be sent to userspace. This event is edge-triggered and it - will occur only once after each resume so volume manager writers + used data sectors / total data sectors + If the number of free sectors drops below the pool's low water mark a + dm event will be sent to userspace. This event is edge-triggered and + it will occur only once after each resume so volume manager writers should register for the event and then check the target's status. held metadata root: Index: linux/drivers/md/dm-thin-metadata.c =================================================================== --- linux.orig/drivers/md/dm-thin-metadata.c +++ linux/drivers/md/dm-thin-metadata.c @@ -1296,6 +1296,18 @@ int dm_pool_get_free_metadata_block_coun return r; } +int dm_pool_get_metadata_dev_size(struct dm_pool_metadata *pmd, + dm_block_t *result) +{ + int r; + + down_read(&pmd->root_lock); + r = dm_sm_get_nr_blocks(pmd->metadata_sm, result); + up_read(&pmd->root_lock); + + return r; +} + int dm_pool_get_data_block_size(struct dm_pool_metadata *pmd, sector_t *result) { down_read(&pmd->root_lock); Index: linux/drivers/md/dm-thin-metadata.h =================================================================== --- linux.orig/drivers/md/dm-thin-metadata.h +++ linux/drivers/md/dm-thin-metadata.h @@ -150,6 +150,9 @@ int dm_pool_get_free_block_count(struct int dm_pool_get_free_metadata_block_count(struct dm_pool_metadata *pmd, dm_block_t *result); +int dm_pool_get_metadata_dev_size(struct dm_pool_metadata *pmd, + dm_block_t *result); + int dm_pool_get_data_block_size(struct dm_pool_metadata *pmd, sector_t *result); int dm_pool_get_data_dev_size(struct dm_pool_metadata *pmd, dm_block_t *result); Index: linux/drivers/md/dm-thin.c =================================================================== --- linux.orig/drivers/md/dm-thin.c +++ linux/drivers/md/dm-thin.c @@ -1943,8 +1943,8 @@ static int pool_message(struct dm_target /* * Status line is: - * - * + * / + * / */ static int pool_status(struct dm_target *ti, status_type_t type, char *result, unsigned maxlen) @@ -1954,6 +1954,8 @@ static int pool_status(struct dm_target uint64_t transaction_id; dm_block_t nr_free_blocks_data; dm_block_t nr_free_blocks_metadata; + dm_block_t nr_blocks_data; + dm_block_t nr_blocks_metadata; dm_block_t held_root; char buf[BDEVNAME_SIZE]; char buf2[BDEVNAME_SIZE]; @@ -1972,18 +1974,30 @@ static int pool_status(struct dm_target if (r) return r; + r = dm_pool_get_metadata_dev_size(pool->pmd, &nr_blocks_metadata); + if (r) + return r; + r = dm_pool_get_free_block_count(pool->pmd, &nr_free_blocks_data); if (r) return r; + r = dm_pool_get_data_dev_size(pool->pmd, &nr_blocks_data); + if (r) + return r; + r = dm_pool_get_held_metadata_root(pool->pmd, &held_root); if (r) return r; - DMEMIT("%llu %llu %llu ", (unsigned long long)transaction_id, - (unsigned long long)nr_free_blocks_metadata * pool->sectors_per_block, - (unsigned long long)nr_free_blocks_data * pool->sectors_per_block); + DMEMIT("%llu %llu/%llu %llu/%llu", (unsigned long long)transaction_id, + (unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata) * + pool->sectors_per_block, + (unsigned long long)nr_blocks_metadata * pool->sectors_per_block, + (unsigned long long)(nr_blocks_data - nr_free_blocks_data) * + pool->sectors_per_block, + (unsigned long long)nr_blocks_data * pool->sectors_per_block); if (held_root) DMEMIT("%llu", held_root);