@@ -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)
@@ -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;
@@ -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,
@@ -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;
@@ -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
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.williams@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(-)