diff mbox

[ndctl,6/7] ndctl, {enable,disable}-region: filter by type

Message ID 148375335820.38836.1562013725964258644.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dan Williams Jan. 7, 2017, 1:42 a.m. UTC
Allow the region to be selected by type. For example, disable all pmem:

	ndctl disable-region -t pmem all

One case this is useful for is scripting the bring-up of individual
namespaces rather than the default of all at once and in parallel. For
example:

* blacklist the nd_pmem module
* disable all pmem regions
* load the nd_pmem module
* individually enable pmem regions

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 ndctl/builtin-xable-region.c |   31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)
diff mbox

Patch

diff --git a/ndctl/builtin-xable-region.c b/ndctl/builtin-xable-region.c
index 50cbdef5b339..0d46192fe6a4 100644
--- a/ndctl/builtin-xable-region.c
+++ b/ndctl/builtin-xable-region.c
@@ -6,11 +6,16 @@ 
 #include <util/parse-options.h>
 #include <ndctl/libndctl.h>
 
-static const char *region_bus;
+static struct {
+	const char *bus;
+	const char *type;
+} param;
 
 static const struct option region_options[] = {
-	OPT_STRING('b', "bus", &region_bus, "bus-id",
+	OPT_STRING('b', "bus", &param.bus, "bus-id",
 			"<region> must be on a bus with an id/provider of <bus-id>"),
+	OPT_STRING('t', "type", &param.type, "region-type",
+			"<region> must be of the specified type"),
 	OPT_END(),
 };
 
@@ -33,6 +38,20 @@  static const char *parse_region_options(int argc, const char **argv,
 		usage_with_options(u, region_options);
 		return NULL; /* we won't return from usage_with_options() */
 	}
+
+	if (param.type) {
+		if (strcmp(param.type, "pmem") == 0)
+			/* pass */;
+		else if (strcmp(param.type, "blk") == 0)
+			/* pass */;
+		else {
+			error("unknown region type '%s', should be 'pmem' or 'blk'\n",
+					param.type);
+			usage_with_options(u, region_options);
+			return NULL;
+		}
+	}
+
 	return argv[0];
 }
 
@@ -47,10 +66,14 @@  static int do_xable_region(const char *region_arg,
 		goto out;
 
         ndctl_bus_foreach(ctx, bus) {
-		if (!util_bus_filter(bus, region_bus))
+		if (!util_bus_filter(bus, param.bus))
 			continue;
 
 		ndctl_region_foreach(bus, region) {
+			const char *type = ndctl_region_get_type_name(region);
+
+			if (param.type && strcmp(param.type, type) != 0)
+				continue;
 			if (!util_region_filter(region, region_arg))
 				continue;
 			if (xable_fn(region) == 0)
@@ -60,7 +83,7 @@  static int do_xable_region(const char *region_arg,
 
 	rc = success;
  out:
-	region_bus = NULL;
+	param.bus = NULL;
 	return rc;
 }