In preparation for expanded device-dax unit tests, convert the existing
implementation to be entirely C-based.

Signed-off-by: Dan Williams <[email protected]>
---
 test/Makefile.am   |   13 ++++-
 test/device-dax.c  |  128 ++++++++++++++++++++++++++++++++++++++++++++++------
 test/device-dax.sh |   40 ----------------
 3 files changed, 124 insertions(+), 57 deletions(-)
 delete mode 100755 test/device-dax.sh

diff --git a/test/Makefile.am b/test/Makefile.am
index ab566148e1f4..d13c138bb28a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -20,7 +20,7 @@ TESTS +=\
        pmem-ns \
        dax-dev \
        dax.sh \
-       device-dax.sh \
+       device-dax \
        mmap.sh
 
 check_PROGRAMS +=\
@@ -57,4 +57,13 @@ dax_dev_LDADD = $(LIBNDCTL_LIB)
 dax_pmd_SOURCES = dax-pmd.c
 mmap_SOURCES = mmap.c
 dax_errors_SOURCES = dax-errors.c
-device_dax_SOURCES = device-dax.c
+device_dax_SOURCES = \
+               device-dax.c \
+               dax-dev.c \
+               core.c \
+               ../ndctl/builtin-xaction-namespace.c \
+               ../ndctl/util/json.c
+device_dax_LDADD = \
+               $(LIBNDCTL_LIB) \
+               $(JSON_LIBS) \
+               ../libutil.a
diff --git a/test/device-dax.c b/test/device-dax.c
index addf93f59252..7b624ea5bc8f 100644
--- a/test/device-dax.c
+++ b/test/device-dax.c
@@ -1,32 +1,130 @@
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <fcntl.h>
-#include <linux/falloc.h>
 #include <stdio.h>
-#include <string.h>
 #include <errno.h>
 #include <unistd.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <linux/falloc.h>
+#include <linux/version.h>
+#include <ndctl/libndctl.h>
+#include <daxctl/libdaxctl.h>
+#include <ccan/array_size/array_size.h>
+
+#include <ndctl/builtin.h>
+#include <test.h>
+
+static int create_namespace(int argc, const char **argv, struct ndctl_ctx *ctx)
+{
+       builtin_xaction_namespace_reset();
+       return cmd_create_namespace(argc, argv, ctx);
+}
+
+static int reset_device_dax(struct ndctl_namespace *ndns)
+{
+       struct ndctl_ctx *ctx = ndctl_namespace_get_ctx(ndns);
+       const char *argv[] = {
+               "__func__", "-v", "-m", "raw", "-f", "-e", "",
+       };
+       int argc = ARRAY_SIZE(argv);
+
+       argv[argc - 1] = ndctl_namespace_get_devname(ndns);
+       return create_namespace(argc, argv, ctx);
+}
+
+static int setup_device_dax(struct ndctl_namespace *ndns)
+{
+       struct ndctl_ctx *ctx = ndctl_namespace_get_ctx(ndns);
+       const char *argv[] = {
+               "__func__", "-v", "-m", "dax", "-M", "dev", "-f", "-e", "",
+       };
+       int argc = ARRAY_SIZE(argv);
+
+       argv[argc - 1] = ndctl_namespace_get_devname(ndns);
+       return create_namespace(argc, argv, ctx);
+}
 
-int main(int argc, char *argv[])
+static int test_device_dax(int loglevel, struct ndctl_test *test,
+               struct ndctl_ctx *ctx)
 {
-       char *buf;
-       int fd;
+       int fd, rc, *p;
+       char *buf, path[100];
+       struct ndctl_dax *dax;
+       struct daxctl_dev *dev;
+       struct ndctl_namespace *ndns;
+       struct daxctl_region *dax_region;
+
+       if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 7, 0)))
+               return 77;
+
+       ndctl_set_log_priority(ctx, loglevel);
 
-       if (argc < 2) {
-               perror("argc invalid");
-               return -EINVAL;
+       ndns = ndctl_get_test_dev(ctx);
+       if (!ndns) {
+               fprintf(stderr, "%s: failed to find suitable namespace\n",
+                               __func__);
+               return 77;
        }
 
-       fd = open(argv[1], O_RDWR);
+       rc = setup_device_dax(ndns);
+       if (rc < 0) {
+               fprintf(stderr, "%s: failed device-dax setup\n",
+                               ndctl_namespace_get_devname(ndns));
+               return rc;
+       }
+
+       dax = ndctl_namespace_get_dax(ndns);
+       dax_region = ndctl_dax_get_daxctl_region(dax);
+       dev = daxctl_dev_get_first(dax_region);
+       if (!dev) {
+               fprintf(stderr, "%s: failed to find device-dax instance\n",
+                               ndctl_namespace_get_devname(ndns));
+               return -ENXIO;
+       }
+
+       sprintf(path, "/dev/%s", daxctl_dev_get_devname(dev));
+
+       fd = open(path, O_RDWR);
        if (fd < 0) {
-               perror("fd");
-               return 1;
+               fprintf(stderr, "%s: failed to open device-dax instance\n",
+                               daxctl_dev_get_devname(dev));
+               return -ENXIO;
        }
 
        buf = mmap(NULL, 2UL << 20, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-       *((int *) (buf + (1UL << 20))) = 0;
+       p = (int *) (buf + (1UL << 20));
+       *p = 0;
+
+       rc = reset_device_dax(ndns);
+       if (rc < 0) {
+               fprintf(stderr, "%s: failed to reset device-dax instance\n",
+                               ndctl_namespace_get_devname(ndns));
+               return rc;
+       }
 
        close(fd);
        return 0;
 }
+
+int __attribute__((weak)) main(int argc, char *argv[])
+{
+       struct ndctl_test *test = ndctl_test_new(0);
+       struct ndctl_ctx *ctx;
+       int rc;
+
+       if (!test) {
+               fprintf(stderr, "failed to initialize test\n");
+               return EXIT_FAILURE;
+       }
+
+       rc = ndctl_new(&ctx);
+       if (rc < 0)
+               return ndctl_test_result(test, rc);
+
+       rc = test_device_dax(LOG_DEBUG, test, ctx);
+       ndctl_unref(ctx);
+       return ndctl_test_result(test, rc);
+}
diff --git a/test/device-dax.sh b/test/device-dax.sh
deleted file mode 100755
index 6bc724fe7c95..000000000000
--- a/test/device-dax.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-NDCTL="../ndctl/ndctl"
-json2var="s/[{}\",]//g; s/:/=/g; s/\]//g"
-rc=77
-
-err() {
-       rc=$?
-       echo "device-dax: failed at line $1"
-       exit $rc
-}
-
-eval $(uname -r | awk -F. '{print "maj="$1 ";" "min="$2}')
-if [ $maj -lt 4 ]; then
-       echo "kernel $maj.$min lacks device-dax"
-       exit $rc
-elif [ $maj -eq 4 -a $min -lt 7 ]; then
-       echo "kernel $maj.$min lacks device-dax"
-       exit $rc
-fi
-
-set -e -x
-trap 'err $LINENO' ERR
-
-dev=$(./dax-dev)
-json=$($NDCTL list -N -n $dev)
-eval $(echo $json | sed -e "$json2var")
-
-# setup a device-dax configuration
-json=$($NDCTL create-namespace -v -m dax -M dev -f -e $dev)
-eval $(echo $json | sed -e "$json2var")
-[ $mode != "dax" ] && echo "fail: $LINENO" &&  exit 1
-
-./device-dax /dev/$chardev
-
-# revert namespace to raw mode
-json=$($NDCTL create-namespace -v -m raw -f -e $dev)
-eval $(echo $json | sed -e "$json2var")
-[ $mode != "memory" ] && echo "fail: $LINENO" &&  exit 1
-
-exit 0

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

Reply via email to