File ndctl-namespace-Handle-create-namespace-in-label-less-mode.patch of Package ndctl.12473
From patchwork Sat Jul 27 21:40:36 2019
X-Patchwork-Submitter: Dan Williams <dan.j.williams@intel.com>
X-Patchwork-Id: 11062719
Subject: [ndctl PATCH v2 14/26] ndctl/namespace: Handle 'create-namespace'
in label-less mode
From: Dan Williams <dan.j.williams@intel.com>
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>
---
ndctl/namespace.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index 58fec194ab94..e5a2b1341cdb 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -837,9 +837,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);