From: Bruce Johnston <bjohn...@redhat.com>

Add a new dmsetup message called config, which will return
useful configuration information for the vdo volume and
the uds index associated with it. The output is a YAML
string, and contains a version number to allow future
additions to the content.

Signed-off-by: Bruce Johnston <bjohn...@redhat.com>
Signed-off-by: Matthew Sakai <msa...@redhat.com>
---
 .../admin-guide/device-mapper/vdo.rst         |  7 ++-
 drivers/md/dm-vdo/dm-vdo-target.c             |  5 +-
 drivers/md/dm-vdo/message-stats.c             | 48 +++++++++++++++++++
 drivers/md/dm-vdo/message-stats.h             |  1 +
 4 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/device-mapper/vdo.rst 
b/Documentation/admin-guide/device-mapper/vdo.rst
index c69ac186863a..a14e6d3e787c 100644
--- a/Documentation/admin-guide/device-mapper/vdo.rst
+++ b/Documentation/admin-guide/device-mapper/vdo.rst
@@ -251,7 +251,12 @@ The messages are:
                by the vdostats userspace program to interpret the output
                buffer.
 
-        dump:
+       config:
+               Outputs useful vdo configuration information. Mostly used
+               by users who want to recreate a similar VDO volume and
+               want to know the creation configuration used.
+
+       dump:
                Dumps many internal structures to the system log. This is
                not always safe to run, so it should only be used to debug
                a hung vdo. Optional parameters to specify structures to
diff --git a/drivers/md/dm-vdo/dm-vdo-target.c 
b/drivers/md/dm-vdo/dm-vdo-target.c
index af77084969e0..ed1d775de0d3 100644
--- a/drivers/md/dm-vdo/dm-vdo-target.c
+++ b/drivers/md/dm-vdo/dm-vdo-target.c
@@ -1105,6 +1105,9 @@ static int vdo_message(struct dm_target *ti, unsigned int 
argc, char **argv,
        if ((argc == 1) && (strcasecmp(argv[0], "stats") == 0)) {
                vdo_write_stats(vdo, result_buffer, maxlen);
                result = 1;
+       } else if ((argc == 1) && (strcasecmp(argv[0], "config") == 0)) {
+               vdo_write_config(vdo, &result_buffer, &maxlen);
+               result = 1;
        } else {
                result = vdo_status_to_errno(process_vdo_message(vdo, argc, 
argv));
        }
@@ -2832,7 +2835,7 @@ static void vdo_resume(struct dm_target *ti)
 static struct target_type vdo_target_bio = {
        .features = DM_TARGET_SINGLETON,
        .name = "vdo",
-       .version = { 9, 0, 0 },
+       .version = { 9, 1, 0 },
        .module = THIS_MODULE,
        .ctr = vdo_ctr,
        .dtr = vdo_dtr,
diff --git a/drivers/md/dm-vdo/message-stats.c 
b/drivers/md/dm-vdo/message-stats.c
index 2802cf92922b..75dfcd7c5f63 100644
--- a/drivers/md/dm-vdo/message-stats.c
+++ b/drivers/md/dm-vdo/message-stats.c
@@ -4,6 +4,7 @@
  */
 
 #include "dedupe.h"
+#include "indexer.h"
 #include "logger.h"
 #include "memory-alloc.h"
 #include "message-stats.h"
@@ -430,3 +431,50 @@ int vdo_write_stats(struct vdo *vdo, char *buf, unsigned 
int maxlen)
        vdo_free(stats);
        return VDO_SUCCESS;
 }
+
+static void write_index_memory(u32 mem, char **buf, unsigned int *maxlen)
+{
+       char *prefix = "memorySize : ";
+
+       /* Convert index memory to fractional value */
+       if (mem == (u32)UDS_MEMORY_CONFIG_256MB)
+               write_string(prefix, "0.25, ", NULL, buf, maxlen);
+       else if (mem == (u32)UDS_MEMORY_CONFIG_512MB)
+               write_string(prefix, "0.50, ", NULL, buf, maxlen);
+       else if (mem == (u32)UDS_MEMORY_CONFIG_768MB)
+               write_string(prefix, "0.75, ", NULL, buf, maxlen);
+       else
+               write_u32(prefix, mem, ", ", buf, maxlen);
+}
+
+static void write_index_config(struct index_config *config, char **buf,
+                              unsigned int *maxlen)
+{
+       write_string("index :  ", "{ ", NULL, buf, maxlen);
+       /* index mem size */
+       write_index_memory(config->mem, buf, maxlen);
+       /* whether the index is sparse or not */
+       write_bool("isSparse : ", config->sparse, ", ", buf, maxlen);
+       write_string(NULL, "}", ", ", buf, maxlen);
+}
+
+int vdo_write_config(struct vdo *vdo, char **buf, unsigned int *maxlen)
+{
+       struct vdo_config *config = &vdo->states.vdo.config;
+
+       write_string(NULL, "{ ", NULL, buf, maxlen);
+       /* version */
+       write_u32("version : ", 1, ", ", buf, maxlen);
+       /* physical size */
+       write_block_count_t("physicalSize : ", config->physical_blocks * 
VDO_BLOCK_SIZE, ", ",
+                           buf, maxlen);
+       /* logical size */
+       write_block_count_t("logicalSize : ", config->logical_blocks * 
VDO_BLOCK_SIZE, ", ",
+                           buf, maxlen);
+       /* slab size */
+       write_block_count_t("slabSize : ", config->slab_size, ", ", buf, 
maxlen);
+       /* index config */
+       write_index_config(&vdo->geometry.index_config, buf, maxlen);
+       write_string(NULL, "}", NULL, buf, maxlen);
+       return VDO_SUCCESS;
+}
diff --git a/drivers/md/dm-vdo/message-stats.h 
b/drivers/md/dm-vdo/message-stats.h
index f7fceca9acab..f9c95eff569d 100644
--- a/drivers/md/dm-vdo/message-stats.h
+++ b/drivers/md/dm-vdo/message-stats.h
@@ -8,6 +8,7 @@
 
 #include "types.h"
 
+int vdo_write_config(struct vdo *vdo, char **buf, unsigned int *maxlen);
 int vdo_write_stats(struct vdo *vdo, char *buf, unsigned int maxlen);
 
 #endif /* VDO_MESSAGE_STATS_H */
-- 
2.45.2


Reply via email to