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> <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>
+
 
     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:
- *    <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)
@@ -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);
