--- drivers/md/dm-thin-metadata.c | 12 ++++++++++++ drivers/md/dm-thin-metadata.h | 3 +++ drivers/md/dm-thin.c | 24 +++++++++++++++++++----- 3 files changed, 34 insertions(+), 5 deletions(-) Index: linux/drivers/md/dm-thin-metadata.c =================================================================== --- linux.orig/drivers/md/dm-thin-metadata.c +++ linux/drivers/md/dm-thin-metadata.c @@ -1326,6 +1326,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 @@ -153,6 +153,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 @@ -2043,8 +2043,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) @@ -2054,6 +2054,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]; @@ -2072,18 +2074,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 * (THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT), - (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);