new file mode 100755
@@ -0,0 +1,231 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2019 Intel, Corp. All Rights Reserved.
+#
+# FSQA Test No. 999 (temporary)
+#
+# Test setting of DAX flag
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+status=1 # failure is the default!
+
+dax_dir=$TEST_DIR/dax-dir
+dax_sub_dir=$TEST_DIR/dax-dir/dax-sub-dir
+dax_inh_file=$dax_dir/dax-inh-file
+dax_non_inh_file=$dax_dir/dax-non-inh-file
+non_dax=$TEST_DIR/non-dax
+dax_file=$TEST_DIR/dax-dir/dax-file
+dax_file_copy=$TEST_DIR/dax-file-copy
+dax_file_move=$TEST_DIR/dax-file-move
+data_file=$TEST_DIR/data-file
+
+_cleanup() {
+ rm -rf $TEST_DIR/*
+}
+
+trap "_cleanup ; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common/rc
+
+# real QA test starts here
+_supported_os Linux
+_require_xfs_io_command "lsattr"
+_require_xfs_io_command "statx"
+_require_test
+
+#
+# mnt_opt's we expect
+# ''
+# '-o dax=off'
+# '-o dax=iflag'
+# '-o dax'
+# '-o dax=always'
+function remount_w_option {
+ mnt_opt=$1
+ export MOUNT_OPTIONS=""
+ export TEST_FS_MOUNT_OPTS=""
+ _test_unmount
+ _test_mount $mnt_opt
+}
+
+function check_dax_mount_option {
+ mnt_opt=$1
+ _fs_options $TEST_DEV | grep -qw '$mnt_opt'
+ if [ "$?" == "0" ]; then
+ echo "FAILED: to mount FS with option '$mnt_opt'"
+ status=1; exit
+ fi
+}
+
+function check_xflag_dax {
+ xfs_io -c 'lsattr' $1 | awk -e '{ print $1 }' | grep 'x' &> /dev/null
+ if [ "$?" != "0" ]; then
+ echo "FAILED: Did NOT find FS_XFLAG_DAX on $1"
+ status=1; exit
+ fi
+}
+
+function check_s_dax {
+ attr=`xfs_io -c 'statx -r' $1 | grep 'stat.attributes' | awk -e '{ print $3 }'`
+ masked=$(( $attr & 0x2000 ))
+ if [ "$masked" != "8192" ]; then
+ echo "FAILED: Did NOT find S_DAX flag on $1"
+ status=1; exit
+ fi
+}
+
+function check_no_xflag_dax {
+ xfs_io -c 'lsattr' $1 | awk -e '{ print $1 }' | grep 'x' &> /dev/null
+ if [ "$?" == "0" ]; then
+ echo "FAILED: Found FS_XFLAG_DAX on $1"
+ status=1; exit
+ fi
+}
+
+function check_no_s_dax {
+ attr=`xfs_io -c 'statx -r' $1 | grep 'stat.attributes' | awk -e '{ print $3 }'`
+ masked=$(( $attr & 0x2000 ))
+ if [ "$masked" == "8192" ]; then
+ echo "FAILED: Found S_DAX flag on $1"
+ status=1; exit
+ fi
+}
+
+echo "running tests..."
+
+remount_w_option ""
+check_dax_mount_option "dax=iflag"
+
+echo " *** mark dax-dir as dax enabled"
+mkdir $dax_dir
+xfs_io -c 'chattr +x' $dax_dir
+check_xflag_dax $dax_dir
+
+echo " *** check file inheritance"
+touch $dax_inh_file
+check_xflag_dax $dax_inh_file
+check_s_dax $dax_inh_file
+
+echo " *** check directory inheritance"
+mkdir $dax_sub_dir
+check_xflag_dax $dax_sub_dir
+
+echo " *** check changing directory"
+xfs_io -c 'chattr -x' $dax_dir
+check_no_xflag_dax $dax_dir
+check_no_s_dax $dax_dir
+
+echo " *** check non file inheritance"
+touch $dax_non_inh_file
+check_no_xflag_dax $dax_non_inh_file
+check_no_s_dax $dax_non_inh_file
+
+echo " *** check that previous file stays enabled"
+check_xflag_dax $dax_inh_file
+check_s_dax $dax_inh_file
+
+echo " *** Reset the directory"
+xfs_io -c 'chattr +x' $dax_dir
+check_xflag_dax $dax_dir
+
+# Set up for next test
+touch $dax_file
+touch $non_dax
+
+#
+# inode flag
+# ./
+# + dax-dir/ X
+# + dax-sub-dir/ X
+# + dax-inh-file X
+# + dax-non-inh-file
+# + dax-file X
+# + non-dax
+#
+
+# check mount overrides
+# =====================
+
+echo " *** Check '-o dax'"
+remount_w_option "-o dax"
+check_dax_mount_option "dax=always"
+
+echo " *** non-dax inode but overrides to be effective"
+check_no_xflag_dax $non_dax
+check_s_dax $non_dax
+
+echo " *** Check for non-dax inode to be dax with mount option"
+check_no_xflag_dax $dax_non_inh_file
+check_s_dax $dax_non_inh_file
+
+
+echo " *** Check '-o dax=never'"
+remount_w_option "-o dax=never"
+check_dax_mount_option "dax=never"
+
+check_xflag_dax $dax_dir
+check_xflag_dax $dax_sub_dir
+check_xflag_dax $dax_inh_file
+check_no_s_dax $dax_inh_file
+check_no_xflag_dax $dax_non_inh_file
+check_no_s_dax $dax_non_inh_file
+check_no_xflag_dax $non_dax
+check_no_s_dax $non_dax
+check_xflag_dax $dax_file
+check_no_s_dax $dax_file
+
+
+echo " *** Check '-o dax=iflag'"
+remount_w_option "-o dax=iflag"
+check_dax_mount_option "dax=iflag"
+
+check_xflag_dax $dax_dir
+check_xflag_dax $dax_sub_dir
+check_xflag_dax $dax_inh_file
+check_s_dax $dax_inh_file
+check_no_xflag_dax $dax_non_inh_file
+check_no_s_dax $dax_non_inh_file
+check_no_xflag_dax $non_dax
+check_no_s_dax $non_dax
+check_xflag_dax $dax_file
+check_s_dax $dax_file
+
+
+# Check non-zero file operations
+# ==============================
+
+echo " *** Verify setting FS_XFLAG_DAX flag fails"
+$XFS_IO_PROG -f -c "pwrite 0 10000" $data_file > /dev/null
+xfs_io -c 'chattr +x' $data_file
+check_no_xflag_dax $data_file
+check_no_s_dax $data_file
+
+
+# Check inheritance on cp, mv
+# ===========================
+
+echo " *** check making 'data' dax with cp"
+cp $non_dax $dax_dir/conv-dax
+check_xflag_dax $dax_dir/conv-dax
+check_s_dax $dax_dir/conv-dax
+
+echo " *** check making 'data' non-dax with cp"
+rm -f $data_file
+cp $dax_dir/conv-dax $data_file
+check_no_xflag_dax $data_file
+check_no_s_dax $data_file
+
+echo " *** Moved files 'don't inherit'"
+mv $non_dax $dax_dir/move-dax
+check_no_xflag_dax $dax_dir/move-dax
+check_no_s_dax $dax_dir/move-dax
+
+echo " *** Check '-o dax=garbage'"
+remount_w_option "-o dax=garbage"
+
+status=0 ; exit
new file mode 100644
@@ -0,0 +1,21 @@
+QA output created by 999
+running tests...
+ *** mark dax-dir as dax enabled
+ *** check file inheritance
+ *** check directory inheritance
+ *** check changing directory
+ *** check non file inheritance
+ *** check that previous file stays enabled
+ *** Reset the directory
+ *** Check '-o dax'
+ *** non-dax inode but overrides to be effective
+ *** Check for non-dax inode to be dax with mount option
+ *** Check '-o dax=never'
+ *** Check '-o dax=iflag'
+ *** Verify setting FS_XFLAG_DAX flag fails
+xfs_io: cannot set flags on /mnt/xfstests_test/data-file: Invalid argument
+ *** check making 'data' dax with cp
+ *** check making 'data' non-dax with cp
+ *** Moved files 'don't inherit'
+ *** Check '-o dax=garbage'
+mount: /mnt/xfstests_test: wrong fs type, bad option, bad superblock on /dev/pmem0p1, missing codepage or helper program, or other error.
@@ -511,3 +511,4 @@
511 auto quick quota
512 auto quick acl attr
513 auto mount
+999 auto