This patch adds support to the ndctl tool for validating that the
namespace alignment is valid.
Signed-off-by: Oliver O'Halloran <oohall(a)gmail.com>
---
v3: Fail validation if an alignment is specified, but pfn mode is
not supported.
---
ndctl/namespace.c | 37 +++++++++++++++++++++++++++++--------
1 file changed, 29 insertions(+), 8 deletions(-)
diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index 5d672810a712..25e0a87676e4 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -541,8 +541,23 @@ static int validate_namespace_options(struct ndctl_region *region,
}
if (param.align) {
- if (p->mode != NDCTL_NS_MODE_MEMORY &&
- p->mode != NDCTL_NS_MODE_DAX) {
+ int i, alignments;
+
+ switch (p->mode) {
+ case NDCTL_NS_MODE_MEMORY:
+ if (!pfn) {
+ error("Kernel does not support setting an alignment in fsdax mode\n");
+ return -EINVAL;
+ }
+
+ alignments = ndctl_pfn_get_num_alignments(pfn);
+ break;
+
+ case NDCTL_NS_MODE_DAX:
+ alignments = ndctl_dax_get_num_alignments(dax);
+ break;
+
+ default:
error("%s mode does not support setting an alignment\n",
p->mode == NDCTL_NS_MODE_SAFE
? "sector" : "raw");
@@ -550,13 +565,19 @@ static int validate_namespace_options(struct ndctl_region *region,
}
p->align = parse_size64(param.align);
+ for (i = 0; i < alignments; i++) {
+ uint64_t a;
- switch (p->align) {
- case SZ_4K:
- case SZ_2M:
- case SZ_1G:
- break;
- default:
+ if (p->mode == NDCTL_NS_MODE_MEMORY)
+ a = ndctl_pfn_get_supported_alignment(pfn, i);
+ else
+ a = ndctl_dax_get_supported_alignment(dax, i);
+
+ if (p->align == a)
+ break;
+ }
+
+ if (i >= alignments) {
error("unsupported align: %s\n", param.align);
return -ENXIO;
}
--
2.20.1