This patch adds support to the ndctl tool for validating that the
namespace alignment is valid.

Signed-off-by: Oliver O'Halloran <[email protected]>
---
 ndctl/namespace.c | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index b27cc6967a68..44fc91232ecb 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -537,8 +537,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");
@@ -546,13 +561,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

_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to