Add the list of supported alignemnts to PFN and DAX namespaces. Also add the
list of supported sector sizes to BTT namespaces.

Signed-off-by: Oliver O'Halloran <[email protected]>
---
Not sure the namespace JSON blob are the best place to put these. The
region might be better, but slightly less accessable to users.
---
 util/json.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/util/json.c b/util/json.c
index 77c96fb53c27..6c66033bd312 100644
--- a/util/json.c
+++ b/util/json.c
@@ -303,6 +303,38 @@ struct json_object *util_daxctl_devs_to_list(struct 
daxctl_region *region,
        return jdevs;
 }
 
+#define _SZ(get_max, get_elem, type) \
+static struct json_object *type##_build_size_array(struct type *arg)   \
+{                                                              \
+       struct json_object *arr = json_object_new_array();      \
+       int i;                                                  \
+                                                               \
+       if (!arr)                                               \
+               return NULL;                                    \
+                                                               \
+       for (i = 0; i < get_max(arg); i++) {                    \
+               struct json_object *jobj;                       \
+               int64_t align;                                  \
+                                                               \
+               align = get_elem(arg, i);                       \
+               jobj = json_object_new_int64(align);            \
+               if (!jobj)                                      \
+                       goto err;                               \
+               json_object_array_add(arr, jobj);               \
+       }                                                       \
+                                                               \
+       return arr;                                             \
+err:                                                           \
+       json_object_put(arr);                                   \
+       return NULL;                                            \
+}
+#define SZ(type, kind) _SZ(ndctl_##type##_get_num_##kind##s, \
+                          ndctl_##type##_get_supported_##kind, ndctl_##type)
+SZ(pfn, alignment)
+SZ(dax, alignment)
+SZ(btt, sector_size)
+//SZ(namespace, sector_size)
+
 struct json_object *util_daxctl_region_to_json(struct daxctl_region *region,
                const char *ident, unsigned long flags)
 {
@@ -739,7 +771,7 @@ struct json_object *util_namespace_to_json(struct 
ndctl_namespace *ndns,
 {
        struct json_object *jndns = json_object_new_object();
        enum ndctl_pfn_loc loc = NDCTL_PFN_LOC_NONE;
-       struct json_object *jobj, *jbbs = NULL;
+       struct json_object *jobj, *jbbs = NULL, *size_array = NULL;
        const char *locations[] = {
                [NDCTL_PFN_LOC_NONE] = "none",
                [NDCTL_PFN_LOC_RAM] = "mem",
@@ -749,6 +781,7 @@ struct json_object *util_namespace_to_json(struct 
ndctl_namespace *ndns,
        unsigned int sector_size = UINT_MAX;
        enum ndctl_namespace_mode mode;
        const char *bdev = NULL, *name;
+       const char *size_array_name;
        unsigned int bb_count = 0;
        struct ndctl_btt *btt;
        struct ndctl_pfn *pfn;
@@ -936,6 +969,19 @@ struct json_object *util_namespace_to_json(struct 
ndctl_namespace *ndns,
                        json_object_object_add(jndns, "numa_node", jobj);
        }
 
+       if (pfn) {
+               size_array_name = "supported_alignments";
+               size_array = ndctl_pfn_build_size_array(pfn);
+       } else if (dax) {
+               size_array_name = "supported_alignments";
+               size_array = ndctl_dax_build_size_array(dax);
+       } else if (btt) {
+               size_array_name = "supported sector sizes";
+               size_array = ndctl_btt_build_size_array(btt);
+       }
+       if (size_array)
+               json_object_object_add(jndns, size_array_name, size_array);
+
        if (pfn)
                jbbs = util_pfn_badblocks_to_json(pfn, &bb_count, flags);
        else if (dax)
-- 
2.20.1

_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to