---
 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:
- *    <transaction id> <free metadata space in sectors>
- *    <free data space in sectors> <held metadata root>
+ *    <transaction id> <used metadata sectors>/<total metadata sectors>
+ *    <used data sectors>/<total data sectors> <held metadata root>
  */
 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);