File ndctl-namespace-Handle-create-namespace-in-label-less-mode.patch of Package ndctl.16556
From 7966c92c9da72b0640eec1341bdee959ce746957 Mon Sep 17 00:00:00 2001
From: Dan Williams <dan.j.williams@intel.com>
Date: Sat, 27 Jul 2019 14:40:36 -0700
Subject: [PATCH] ndctl/namespace: Handle 'create-namespace' in label-less mode
Patch-mainline: v66
Git-commit: 7966c92c9da72b0640eec1341bdee959ce746957
A common confusion with ndctl is that 'create-namespace' does not work
in the label-less case. In the label-less case there is no capacity to
allocate as the size if already hard-coded by the region boundary.
However, users typically do something like the following in the
label-less case:
# ndctl list
{
"dev":"namespace1.0",
"mode":"raw",
"size":"127.00 GiB (136.37 GB)",
"sector_size":512,
"blockdev":"pmem1"
}
# ndctl destroy-namespace namespace1.0 -f
destroyed 1 namespace
# ndctl create-namespace
failed to create namespace: Resource temporarily unavailable
In other words they destroy the raw mode namespace that they don't want,
and seek to create a new default configuration namespace. Since there is
no "available_capacity" in the label-less case the 'create' attempt
fails.
Fix this by recognizing that the user wants a default sized namespace
and just reconfigure the raw namespace.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
ndctl/namespace.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index 58a9e3c53474..a654460ce4c5 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -791,9 +791,13 @@ static int namespace_create(struct ndctl_region *region)
return -EAGAIN;
}
- available = ndctl_region_get_max_available_extent(region);
- if (available == ULLONG_MAX)
- available = ndctl_region_get_available_size(region);
+ if (ndctl_region_get_nstype(region) == ND_DEVICE_NAMESPACE_IO)
+ available = ndctl_region_get_size(region);
+ else {
+ available = ndctl_region_get_max_available_extent(region);
+ if (available == ULLONG_MAX)
+ available = ndctl_region_get_available_size(region);
+ }
if (!available || p.size > available) {
debug("%s: insufficient capacity size: %llx avail: %llx\n",
devname, p.size, available);
--
2.22.0