On Wed, Jan 16, 2019 at 8:49 PM Oliver O'Halloran <[email protected]> wrote:
>
> 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);

So apparently I forgot to run the `make check` on v3 because this
completely breaks the unit tests.

The problem is that the tests rely on a sed script to parse the JSON
blob into shell variables. That works when the JSON blob only contains
scalars (and strings with no spaces), but it chokes when confronted
with a JSON array. I can't think of any simple ways to fix it other
than using a real JSON parser (jq?). Should I drop this patch for now?
I don't mind doing a real fix if you don't mind waiting a bit longer
:)

Oliver

> +
>         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