[ndctl,36/36] ndctl/test: Regression test misaligned namespaces
diff mbox series

Message ID 158300779557.2141307.1119464097611805912.stgit@dwillia2-desk3.amr.corp.intel.com
State New
Headers show
Series
  • Multiple topics / backlog for v68
Related show

Commit Message

Dan Williams Feb. 29, 2020, 8:23 p.m. UTC
The kernel is now requiring that namespace creation results in
cross-arch compatible namespaces by default. However, it must also
continue to support previously valid, but misaligned, namespaces. Use
the write-infoblock utility to create "legacy" configurations and
validate that the kernel still accepts it along with other corner case
configurations.

Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Cc: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 test/Makefile.am |    1 
 test/align.sh    |  118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+)
 create mode 100755 test/align.sh

Patch
diff mbox series

diff --git a/test/Makefile.am b/test/Makefile.am
index cce60c5221fd..1d24a65ded8b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -54,6 +54,7 @@  TESTS +=\
 	dax-dev \
 	dax-ext4.sh \
 	dax-xfs.sh \
+	align.sh \
 	device-dax \
 	device-dax-fio.sh \
 	daxctl-devices.sh \
diff --git a/test/align.sh b/test/align.sh
new file mode 100755
index 000000000000..0129255610ab
--- /dev/null
+++ b/test/align.sh
@@ -0,0 +1,118 @@ 
+#!/bin/bash -x
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2015-2020 Intel Corporation. All rights reserved.
+
+. $(dirname $0)/common
+
+rc=77
+cleanup() {
+	echo "align.sh: failed at line $1"
+	if [ "x$region" != "x" -a x$save_align != "x" ]; then
+		echo $save_align > $region_path/align
+	fi
+
+	if [ "x$ns1" != "x" ]; then
+		$NDCTL destroy-namespace -f $ns1
+	fi
+	if [ "x$ns2" != "x" ]; then
+		$NDCTL destroy-namespace -f $ns2
+	fi
+
+	exit $rc
+}
+
+is_aligned() {
+	val=$1
+	align=$2
+
+	if [ $((val & (align - 1))) -eq 0 ]; then
+		return 0
+	fi
+	return 1
+}
+
+set -e
+trap 'err $LINENO cleanup' ERR
+
+region=$($NDCTL list -R -b ACPI.NFIT | jq -r '.[] | [select(.available_size == .size)] | .[0].dev')
+
+if [ "x$region" = "xnull"  ]; then
+	unset $region
+	echo "unable to find empty region"
+	false
+fi
+
+region_path="/sys/bus/nd/devices/$region"
+save_align=$(cat $region_path/align)
+
+# check that the region is 1G aligned
+resource=$(cat $region_path/resource)
+is_aligned $resource $((1 << 30)) || (echo "need a 1GB aligned namespace to test alignment conditions" && false)
+
+rc=1
+
+# check that start-aligned, but end-misaligned namespaces can be created
+# and probed
+echo 4096 > $region_path/align
+SIZE=$(((1<<30) + (8<<10)))
+json=$($NDCTL create-namespace -r $region -s $SIZE -m fsdax -a 4K)
+eval $(json2var <<< "$json")
+$NDCTL disable-namespace $dev
+$NDCTL enable-namespace $dev
+ns1=$dev
+
+# check that start-misaligned namespaces can't be created until the
+# region alignment is set to a compatible value.
+# Note the namespace capacity alignment requirement in this case is
+# SUBSECTION_SIZE (2M) as the data alignment can be satisfied with
+# metadata padding.
+json=$($NDCTL create-namespace -r $region -s $SIZE -m fsdax -a 4K -f) || status="failed"
+if [ $status != "failed" ]; then
+	echo "expected namespace creation failure"
+	eval $(json2var <<< "$json")
+	$NDCTL destroy-namespace -f $dev
+	false
+fi
+
+# check that start-misaligned namespaces can't be probed. Since the
+# kernel does not support creating this misalignment, force it with a
+# custom info-block
+json=$($NDCTL create-namespace -r $region -s $SIZE -m raw)
+eval $(json2var <<< "$json")
+
+$NDCTL disable-namespace $dev
+$NDCTL write-infoblock $dev -a 4K
+$NDCTL enable-namespace $dev || status="failed"
+
+if [ $status != "failed" ]; then
+	echo "expected namespace enable failure"
+	$NDCTL destroy-namespace -f $dev
+	false
+fi
+ns2=$dev
+
+# check that namespace with proper inner padding can be enabled, even
+# though non-zero start_pad namespaces don't support dax
+$NDCTL write-infoblock $ns2 -a 4K -O 8K
+$NDCTL enable-namespace $ns2
+$NDCTL destroy-namespace $ns2 -f
+unset ns2
+
+# check that all namespace alignments can be created with the region
+# alignment at a compatible value
+SIZE=$((2 << 30))
+echo $((16 << 20)) > $region_path/align
+for i in $((1 << 30)) $((2 << 20)) $((4 << 10))
+do
+	json=$($NDCTL create-namespace -r $region -s $SIZE -m fsdax -a $i)
+	eval $(json2var <<< "$json")
+	ns2=$dev
+	$NDCTL disable-namespace $dev
+	$NDCTL enable-namespace $dev
+	$NDCTL destroy-namespace $dev -f
+	unset ns2
+done
+
+# final cleanup
+$NDCTL destroy-namespace $ns1 -f
+exit 0