diff --git a/ndctl/list.c b/ndctl/list.c
index 030d73f..32f679b 100644
--- a/ndctl/list.c
+++ b/ndctl/list.c
@@ -38,20 +38,7 @@ static struct {
 	bool firmware;
 } 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 | UTIL_JSON_DAX_DEVS;
-	if (list.human)
-		flags |= UTIL_JSON_HUMAN;
-	return flags;
-}
+static unsigned long list_flags;
 
 struct util_filter_params param;
 
@@ -64,8 +51,7 @@ do { \
 			VERSION, __func__, __LINE__, ##__VA_ARGS__); \
 } while (0)
 
-static struct json_object *region_to_json(struct ndctl_region *region,
-		unsigned long flags)
+static struct json_object *region_to_json(struct ndctl_region *region)
 {
 	struct json_object *jregion = json_object_new_object();
 	struct json_object *jobj, *jbbs, *jmappings = NULL;
@@ -83,13 +69,13 @@ static struct json_object *region_to_json(struct ndctl_region *region,
 		goto err;
 	json_object_object_add(jregion, "dev", jobj);
 
-	jobj = util_json_object_size(ndctl_region_get_size(region), flags);
+	jobj = util_json_object_size(ndctl_region_get_size(region), list_flags);
 	if (!jobj)
 		goto err;
 	json_object_object_add(jregion, "size", jobj);
 
 	jobj = util_json_object_size(ndctl_region_get_available_size(region),
-			flags);
+			list_flags);
 	if (!jobj)
 		goto err;
 	json_object_object_add(jregion, "available_size", jobj);
@@ -118,7 +104,8 @@ static struct json_object *region_to_json(struct ndctl_region *region,
 	iset = ndctl_region_get_interleave_set(region);
 	if (iset) {
 		jobj = util_json_object_hex(
-				ndctl_interleave_set_get_cookie(iset), flags);
+				ndctl_interleave_set_get_cookie(iset),
+				list_flags);
 		if (!jobj)
 			fail("\n");
 		else
@@ -147,7 +134,7 @@ static struct json_object *region_to_json(struct ndctl_region *region,
 			json_object_object_add(jregion, "mappings", jmappings);
 		}
 
-		jmapping = util_mapping_to_json(mapping, listopts_to_flags());
+		jmapping = util_mapping_to_json(mapping, list_flags);
 		if (!jmapping) {
 			fail("\n");
 			continue;
@@ -162,7 +149,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, &bb_count, flags);
+	jbbs = util_region_badblocks_to_json(region, &bb_count, list_flags);
 	if (bb_count) {
 		jobj = json_object_new_int(bb_count);
 		if (!jobj) {
@@ -171,7 +158,7 @@ static struct json_object *region_to_json(struct ndctl_region *region,
 		}
 		json_object_object_add(jregion, "badblock_count", jobj);
 	}
-	if ((flags & UTIL_JSON_MEDIA_ERRORS) && jbbs)
+	if ((list_flags & UTIL_JSON_MEDIA_ERRORS) && jbbs)
 		json_object_object_add(jregion, "badblocks", jbbs);
 
 	pd = ndctl_region_get_persistence_domain(region);
@@ -222,7 +209,7 @@ static void filter_namespace(struct ndctl_namespace *ndns,
 					lfa->jnamespaces);
 	}
 
-	jndns = util_namespace_to_json(ndns, lfa->flags);
+	jndns = util_namespace_to_json(ndns, list_flags);
 	if (!jndns) {
 		fail("\n");
 		return;
@@ -256,7 +243,7 @@ static bool filter_region(struct ndctl_region *region,
 					lfa->jregions);
 	}
 
-	jregion = region_to_json(region, lfa->flags);
+	jregion = region_to_json(region);
 	if (!jregion) {
 		fail("\n");
 		return false;
@@ -297,7 +284,7 @@ static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx)
 			json_object_object_add(lfa->jbus, "dimms", lfa->jdimms);
 	}
 
-	jdimm = util_dimm_to_json(dimm, lfa->flags);
+	jdimm = util_dimm_to_json(dimm, list_flags);
 	if (!jdimm) {
 		fail("\n");
 		return;
@@ -323,7 +310,7 @@ static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx)
 	if (list.firmware) {
 		struct json_object *jfirmware;
 
-		jfirmware = util_dimm_firmware_to_json(dimm, lfa->flags);
+		jfirmware = util_dimm_firmware_to_json(dimm, list_flags);
 		if (jfirmware)
 			json_object_object_add(jdimm, "firmware", jfirmware);
 	}
@@ -412,6 +399,18 @@ static int num_list_flags(void)
 	return list.buses + list.dimms + list.regions + list.namespaces;
 }
 
+static void init_list_flags(void)
+{
+	if (list.idle)
+		list_flags |= UTIL_JSON_IDLE;
+	if (list.media_errors)
+		list_flags |= UTIL_JSON_MEDIA_ERRORS;
+	if (list.dax)
+		list_flags |= UTIL_JSON_DAX | UTIL_JSON_DAX_DEVS;
+	if (list.human)
+		list_flags |= UTIL_JSON_HUMAN;
+}
+
 int cmd_list(int argc, const char **argv, void *ctx)
 {
 	const struct option options[] = {
@@ -470,12 +469,13 @@ int cmd_list(int argc, const char **argv, void *ctx)
 	if (num_list_flags() == 0)
 		list.namespaces = true;
 
+	init_list_flags();
+
 	fctx.filter_bus = filter_bus;
 	fctx.filter_dimm = list.dimms ? filter_dimm : NULL;
 	fctx.filter_region = filter_region;
 	fctx.filter_namespace = list.namespaces ? filter_namespace : NULL;
 	fctx.list = &lfa;
-	lfa.flags = listopts_to_flags();
 
 	rc = util_filter_walk(ctx, &fctx, &param);
 	if (rc)
diff --git a/util/filter.h b/util/filter.h
index effda24..c410df2 100644
--- a/util/filter.h
+++ b/util/filter.h
@@ -47,7 +47,6 @@ struct list_filter_arg {
 	struct json_object *jbuses;
 	struct json_object *jregion;
 	struct json_object *jbus;
-	unsigned long flags;
 };
 
 /*
