diff mbox series

[4/4] ndctl/namespace: Validate alignment from the {pfn|dax} seed

Message ID 20181119080056.13386-4-oohall@gmail.com (mailing list archive)
State New, archived
Headers show
Series [1/4] libndctl: Use the supported_alignment attribute | expand

Commit Message

Oliver O'Halloran Nov. 19, 2018, 8 a.m. UTC
This patch adds support to the ndctl tool for validating that the
namespace alignment is valid.

Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
---
 ndctl/namespace.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

Comments

Dan Williams Nov. 25, 2018, 8:18 p.m. UTC | #1
On Mon, Nov 19, 2018 at 12:11 AM Oliver O'Halloran <oohall@gmail.com> wrote:
>
> This patch adds support to the ndctl tool for validating that the
> namespace alignment is valid.
>
> Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
> ---
>  ndctl/namespace.c | 32 ++++++++++++++++++++++++--------
>  1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/ndctl/namespace.c b/ndctl/namespace.c
> index 1e04f32c0e95..6f8dca288527 100644
> --- a/ndctl/namespace.c
> +++ b/ndctl/namespace.c
> @@ -537,8 +537,18 @@ 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:
> +                       alignments = ndctl_pfn_get_num_alignments(pfn);
> +                       break;
> +
> +               case NDCTL_NS_MODE_DAX:
> +                       alignments = ndctl_dax_get_num_alignments(dax);
> +                       break;
> +

This needs to be reworked after addressing the patch-2 comment because
the "(!pfn || !ndctl_pfn_has_align(pfn)))" was handling the
"memory-mode without pfn device" case.
diff mbox series

Patch

diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index 1e04f32c0e95..6f8dca288527 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -537,8 +537,18 @@  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:
+			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 +556,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;
 		}