Before we go to add new flags to pass through the json helpers, convert the existing control flags to bit flags.
Signed-off-by: Dan Williams <dan.j.willi...@intel.com> --- daxctl/list.c | 17 ++++++++++++++--- ndctl/list.c | 25 ++++++++++++++++++------- ndctl/namespace.c | 3 ++- util/json.c | 54 ++++++++++++++++++++++++++--------------------------- util/json.h | 14 ++++++++++---- 5 files changed, 70 insertions(+), 43 deletions(-) diff --git a/daxctl/list.c b/daxctl/list.c index 3e3f822b0ea1..e213df138f07 100644 --- a/daxctl/list.c +++ b/daxctl/list.c @@ -28,6 +28,17 @@ static struct { bool idle; } list; +static unsigned long listopts_to_flags(void) +{ + unsigned long flags = 0; + + if (list.devs) + flags |= UTIL_JSON_DAX; + if (list.idle) + flags |= UTIL_JSON_IDLE; + return flags; +} + static struct { const char *dev; int region_id; @@ -102,15 +113,15 @@ int cmd_list(int argc, const char **argv, void *ctx) } jregion = util_daxctl_region_to_json(region, - list.devs, param.dev, list.idle); + param.dev, listopts_to_flags()); if (!jregion) { fail("\n"); continue; } json_object_array_add(jregions, jregion); } else if (list.devs) - jdevs = util_daxctl_devs_to_list(region, - jdevs, param.dev, list.idle); + jdevs = util_daxctl_devs_to_list(region, jdevs, + param.dev, listopts_to_flags()); } if (jregions) diff --git a/ndctl/list.c b/ndctl/list.c index ad710ed70de5..7ecfcc91b0ec 100644 --- a/ndctl/list.c +++ b/ndctl/list.c @@ -39,6 +39,19 @@ static struct { bool media_errors; } list; +static unsigned long listopts_to_flags(void) +{ + unsigned long flags = 0; + + if (list.idle) + flags |= UTIL_JSON_IDLE; + if (list.media_errors) + flags |= UTIL_JSON_MEDIA_ERRORS; + if (list.dax) + flags |= UTIL_JSON_DAX; + return flags; +} + static struct { const char *bus; const char *region; @@ -112,8 +125,7 @@ static struct json_object *list_namespaces(struct ndctl_region *region, jnamespaces); } - jndns = util_namespace_to_json(ndns, list.idle, list.dax, - list.media_errors); + jndns = util_namespace_to_json(ndns, listopts_to_flags()); if (!jndns) { fail("\n"); continue; @@ -132,7 +144,7 @@ static struct json_object *list_namespaces(struct ndctl_region *region, } static struct json_object *region_to_json(struct ndctl_region *region, - bool include_media_errors) + unsigned long flags) { struct json_object *jregion = json_object_new_object(); struct json_object *jobj, *jbbs, *jmappings = NULL; @@ -219,8 +231,7 @@ static struct json_object *region_to_json(struct ndctl_region *region, json_object_object_add(jregion, "state", jobj); } - jbbs = util_region_badblocks_to_json(region, include_media_errors, - &bb_count); + jbbs = util_region_badblocks_to_json(region, &bb_count, flags); if (bb_count) { jobj = json_object_new_int(bb_count); if (!jobj) { @@ -229,7 +240,7 @@ static struct json_object *region_to_json(struct ndctl_region *region, } json_object_object_add(jregion, "badblock_count", jobj); } - if (include_media_errors && jbbs) + if ((flags & UTIL_JSON_MEDIA_ERRORS) && jbbs) json_object_object_add(jregion, "badblocks", jbbs); list_namespaces(region, jregion, NULL, false); @@ -435,7 +446,7 @@ int cmd_list(int argc, const char **argv, void *ctx) jregions); } - jregion = region_to_json(region, list.media_errors); + jregion = region_to_json(region, listopts_to_flags()); if (!jregion) { fail("\n"); continue; diff --git a/ndctl/namespace.c b/ndctl/namespace.c index 778a65d02c2a..b28936cfd3ec 100644 --- a/ndctl/namespace.c +++ b/ndctl/namespace.c @@ -397,7 +397,8 @@ static int setup_namespace(struct ndctl_region *region, error("%s: failed to enable\n", ndctl_namespace_get_devname(ndns)); } else { - struct json_object *jndns = util_namespace_to_json(ndns, 0, 1, 0); + struct json_object *jndns = util_namespace_to_json(ndns, + UTIL_JSON_DAX); if (jndns) printf("%s\n", json_object_to_json_string_ext(jndns, diff --git a/util/json.c b/util/json.c index a9b733a76f05..1863bca10121 100644 --- a/util/json.c +++ b/util/json.c @@ -161,7 +161,8 @@ struct json_object *util_daxctl_dev_to_json(struct daxctl_dev *dev) } struct json_object *util_daxctl_devs_to_list(struct daxctl_region *region, - struct json_object *jdevs, const char *ident, bool include_idle) + struct json_object *jdevs, const char *ident, + unsigned long flags) { struct daxctl_dev *dev; @@ -171,7 +172,7 @@ struct json_object *util_daxctl_devs_to_list(struct daxctl_region *region, if (!util_daxctl_dev_filter(dev, ident)) continue; - if (!include_idle && !daxctl_dev_get_size(dev)) + if (!(flags & UTIL_JSON_IDLE) && !daxctl_dev_get_size(dev)) continue; if (!jdevs) { @@ -193,7 +194,7 @@ struct json_object *util_daxctl_devs_to_list(struct daxctl_region *region, } struct json_object *util_daxctl_region_to_json(struct daxctl_region *region, - bool include_devs, const char *ident, bool include_idle) + const char *ident, unsigned long flags) { unsigned long align; struct json_object *jregion, *jobj; @@ -232,10 +233,10 @@ struct json_object *util_daxctl_region_to_json(struct daxctl_region *region, json_object_object_add(jregion, "align", jobj); } - if (!include_devs) + if (!(flags & UTIL_JSON_DAX)) return jregion; - jobj = util_daxctl_devs_to_list(region, NULL, ident, include_idle); + jobj = util_daxctl_devs_to_list(region, NULL, ident, flags); if (jobj) json_object_object_add(jregion, "devices", jobj); @@ -246,20 +247,20 @@ struct json_object *util_daxctl_region_to_json(struct daxctl_region *region, } struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, - bool include_media_errors, unsigned int *bb_count) + unsigned int *bb_count, unsigned long flags) { struct json_object *jbb = NULL, *jbbs = NULL, *jobj; struct badblock *bb; int bbs = 0; - if (include_media_errors) { + if (flags & UTIL_JSON_MEDIA_ERRORS) { jbbs = json_object_new_array(); if (!jbbs) return NULL; } ndctl_region_badblock_foreach(region, bb) { - if (include_media_errors) { + if (flags & UTIL_JSON_MEDIA_ERRORS) { jbb = json_object_new_object(); if (!jbb) goto err_array; @@ -294,7 +295,7 @@ struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, unsigned long long dev_begin, unsigned long long dev_size, - bool include_media_errors, unsigned int *bb_count) + unsigned int *bb_count, unsigned long flags) { struct json_object *jbb = NULL, *jbbs = NULL, *jobj; unsigned long long region_begin, dev_end, offset; @@ -307,7 +308,7 @@ static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, dev_end = dev_begin + dev_size - 1; - if (include_media_errors) { + if (flags & UTIL_JSON_MEDIA_ERRORS) { jbbs = json_object_new_array(); if (!jbbs) return NULL; @@ -335,7 +336,7 @@ static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, offset = (begin - dev_begin) >> 9; len = (end - begin + 1) >> 9; - if (include_media_errors) { + if (flags & UTIL_JSON_MEDIA_ERRORS) { /* add to json */ jbb = json_object_new_object(); if (!jbb) @@ -369,7 +370,7 @@ static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, } static struct json_object *util_pfn_badblocks_to_json(struct ndctl_pfn *pfn, - bool include_media_errors, unsigned int *bb_count) + unsigned int *bb_count, unsigned long flags) { struct ndctl_region *region = ndctl_pfn_get_region(pfn); unsigned long long pfn_begin, pfn_size; @@ -383,7 +384,7 @@ static struct json_object *util_pfn_badblocks_to_json(struct ndctl_pfn *pfn, return NULL; return dev_badblocks_to_json(region, pfn_begin, pfn_size, - include_media_errors, bb_count); + bb_count, flags); } static void util_btt_badblocks_to_json(struct ndctl_btt *btt, @@ -409,11 +410,11 @@ static void util_btt_badblocks_to_json(struct ndctl_btt *btt, * FIXME: switch to native BTT badblocks representation * when / if the kernel provides it. */ - dev_badblocks_to_json(region, begin, size, false, bb_count); + dev_badblocks_to_json(region, begin, size, bb_count, 0); } static struct json_object *util_dax_badblocks_to_json(struct ndctl_dax *dax, - bool include_media_errors, unsigned int *bb_count) + unsigned int *bb_count, unsigned long flags) { struct ndctl_region *region = ndctl_dax_get_region(dax); unsigned long long dax_begin, dax_size; @@ -427,12 +428,11 @@ static struct json_object *util_dax_badblocks_to_json(struct ndctl_dax *dax, return NULL; return dev_badblocks_to_json(region, dax_begin, dax_size, - include_media_errors, bb_count); + bb_count, flags); } struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, - bool include_idle, bool include_dax, - bool include_media_errors) + unsigned long flags) { struct json_object *jndns = json_object_new_object(); struct json_object *jobj, *jbbs = NULL; @@ -526,10 +526,10 @@ struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, if (!jobj) goto err; json_object_object_add(jndns, "uuid", jobj); - if (include_dax) { + if (flags & UTIL_JSON_DAX) { dax_region = ndctl_dax_get_daxctl_region(dax); - jobj = util_daxctl_region_to_json(dax_region, - true, NULL, include_idle); + jobj = util_daxctl_region_to_json(dax_region, NULL, + flags); if (jobj) json_object_object_add(jndns, "daxregion", jobj); } @@ -576,17 +576,15 @@ struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, } if (pfn) - jbbs = util_pfn_badblocks_to_json(pfn, include_media_errors, - &bb_count); + jbbs = util_pfn_badblocks_to_json(pfn, &bb_count, flags); else if (dax) - jbbs = util_dax_badblocks_to_json(dax, include_media_errors, - &bb_count); + jbbs = util_dax_badblocks_to_json(dax, &bb_count, flags); else if (btt) util_btt_badblocks_to_json(btt, &bb_count); else jbbs = util_region_badblocks_to_json( - ndctl_namespace_get_region(ndns), - include_media_errors, &bb_count); + ndctl_namespace_get_region(ndns), &bb_count, + flags); if (bb_count) { jobj = json_object_new_int(bb_count); @@ -597,7 +595,7 @@ struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, json_object_object_add(jndns, "badblock_count", jobj); } - if (include_media_errors && jbbs) + if ((flags & UTIL_JSON_MEDIA_ERRORS) && jbbs) json_object_object_add(jndns, "badblocks", jbbs); return jndns; diff --git a/util/json.h b/util/json.h index 966478466313..19d5ffc4376e 100644 --- a/util/json.h +++ b/util/json.h @@ -16,23 +16,29 @@ #include <stdbool.h> #include <ndctl/libndctl.h> +enum util_json_flags { + UTIL_JSON_IDLE = (1 << 0), + UTIL_JSON_MEDIA_ERRORS = (1 << 1), + UTIL_JSON_DAX = (1 << 2), +}; + struct json_object; void util_display_json_array(FILE *f_out, struct json_object *jarray, int jflag); struct json_object *util_bus_to_json(struct ndctl_bus *bus); struct json_object *util_dimm_to_json(struct ndctl_dimm *dimm); struct json_object *util_mapping_to_json(struct ndctl_mapping *mapping); struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, - bool include_idle, bool include_dax, bool include_media_errs); + unsigned long flags); struct daxctl_region; struct daxctl_dev; struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, - bool include_media_errors, unsigned int *bb_count); + unsigned int *bb_count, unsigned long flags); struct json_object *util_daxctl_region_to_json(struct daxctl_region *region, - bool include_devs, const char *ident, bool include_idle); + const char *ident, unsigned long flags); struct json_object *util_daxctl_dev_to_json(struct daxctl_dev *dev); struct json_object *util_daxctl_devs_to_list(struct daxctl_region *region, struct json_object *jdevs, const char *ident, - bool include_idle); + unsigned long flags); #ifdef HAVE_NDCTL_SMART struct json_object *util_dimm_health_to_json(struct ndctl_dimm *dimm); #else _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm