Vishal Verma <vishal.l.verma(a)intel.com> writes:
When a --region=all option is supplied to ndctl-create-namespace, it
happily ignores it, since create-namespace has historically only created
one namespace per invocation.
This can be cumbersome, so change create-namespace to create namespaces
greedily. When --region=all is specified, or if a --region option is
absent (same as 'all' from a filtering standpoint), create namespaces on
all regions.
Cumbersome? Like, in the same way partitioning a disk is cumbersome? I
don't understand what the problem is, I guess. If you want N namespaces
of the same type/size/align, then script it. Why does there have to be
a command for that? I definitely think that changing the behavior of
create-namespace is a non-starter.
Cheers,
Jeff
Note that this does has two important implications:
1. The user-facing behavior of create-namespace changes in a potentially
surprising way. It may be undesirable for an unadorned 'ndctl
create-namespace' command to suddenly start creating lots of namespaces.
2. Error handling becomes a bit inconsistent. As with all commands
accepting an 'all' option, error reporting becomes a bit tenuous. With
this change, we will continue to create namespaces so long as we don't
hit an error, but if we do, we bail and exit. Because of the special
ENOSPC detection and handling around this, it can be easy to construct a
scenario where en existing namespace on the last region in the scan list
happens to report an error exit, but if the existing namespace was in a
region at the start of the scan list, it gets passed over as a "just try
the next region"
RFC comment: Maybe the solution is to keep the create-namespace
semantics unchanged, and introduce a new command - 'create-namespaces'
or 'create-names-ace-greedy' with the new behavior. I'm not sure if
users will care deeply about either of the two points above, hence
sending this as an RFC.
Link:
https://github.com/pmem/ndctl/issues/106
Reported-by: Steve Scargal <steve.scargall(a)intel.com>
Cc: Jeff Moyer <jmoyer(a)redhat.com>
Cc: Dan Williams <dan.j.williams(a)intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma(a)intel.com>
---
ndctl/namespace.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index af20a42..856ad82 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -1365,9 +1365,12 @@ static int do_xaction_namespace(const char *namespace,
rc = namespace_create(region);
if (rc == -EAGAIN)
continue;
- if (rc == 0)
- *processed = 1;
- return rc;
+ if (rc == 0) {
+ (*processed)++;
+ continue;
+ } else {
+ return rc;
+ }
}
ndctl_namespace_foreach_safe(region, ndns, _n) {
ndns_name = ndctl_namespace_get_devname(ndns);
@@ -1487,6 +1490,8 @@ int cmd_create_namespace(int argc, const char **argv, struct
ndctl_ctx *ctx)
rc = do_xaction_namespace(NULL, ACTION_CREATE, ctx, &created);
}
+ fprintf(stderr, "created %d namespace%s\n", created,
+ created == 1 ? "" : "s");
if (rc < 0 || (!namespace && created < 1)) {
fprintf(stderr, "failed to %s namespace: %s\n", namespace
? "reconfigure" : "create", strerror(-rc));