diff --git a/common/xfs b/common/xfs
index 79dab058..abfd8a15 100644
--- a/common/xfs
+++ b/common/xfs
@@ -700,6 +700,16 @@ _require_xfs_mkfs_ciname()
 		|| _notrun "need case-insensitive naming support in mkfs.xfs"
 }
 
+# this test requires mkfs.xfs have configuration file support
+_require_xfs_mkfs_cfgfile()
+{
+	echo > /tmp/a
+	_scratch_mkfs_xfs_supported -c options=/tmp/a >/dev/null 2>&1
+	res=$?
+	rm -rf /tmp/a
+	test $res -eq 0 || _notrun "need configuration file support in mkfs.xfs"
+}
+
 # XFS_DEBUG requirements
 _require_xfs_debug()
 {
diff --git a/tests/xfs/716 b/tests/xfs/716
new file mode 100755
index 00000000..d8ee7350
--- /dev/null
+++ b/tests/xfs/716
@@ -0,0 +1,219 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020 Oracle.  All Rights Reserved.
+#
+# FS QA Test 716
+#
+# Feed valid mkfs config files to the mkfs parser to ensure that they are
+# recognized as valid.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap '_cleanup; exit $status' 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.* $def_cfgfile $fsimg
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_test
+_require_scratch_nocheck
+_require_xfs_mkfs_cfgfile
+
+def_cfgfile=$TEST_DIR/a
+fsimg=$TEST_DIR/a.img
+rm -rf $def_cfgfile $fsimg
+truncate -s 20t $fsimg
+
+test_mkfs_config() {
+	local cfgfile="$1"
+	if [ -z "$cfgfile" ] || [ "$cfgfile" = "-" ]; then
+		cfgfile=$def_cfgfile
+		cat > $cfgfile
+	fi
+	$MKFS_XFS_PROG -c options=$cfgfile -f -N $fsimg >> $seqres.full 2> $tmp.err
+	cat $tmp.err | _filter_test_dir
+}
+
+echo Simplest config file
+cat > $def_cfgfile << ENDL
+[metadata]
+crc = 0
+ENDL
+test_mkfs_config $def_cfgfile
+
+echo Piped-in config file
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = 1
+ENDL
+
+echo Full line comment
+test_mkfs_config << ENDL
+# This is a full line comment.
+[metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ # This is a full line comment.
+[metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+#This is a full line comment.
+[metadata]
+crc = 0
+ENDL
+
+echo End of line comment
+test_mkfs_config << ENDL
+[metadata]
+crc = 0 ; This is an eol comment.
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = 0 ;This is an eol comment.
+ENDL
+
+echo Multiple directives
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+finobt = 0
+ENDL
+
+echo Multiple sections
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+
+[inode]
+sparse = 0
+ENDL
+
+echo No directives at all
+test_mkfs_config << ENDL
+[metadata]
+ENDL
+
+echo Space around the section name
+test_mkfs_config << ENDL
+ [metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata] 
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [metadata] 
+crc = 0
+ENDL
+
+echo Single space around the key/value directive
+test_mkfs_config << ENDL
+[metadata]
+ crc=0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc =0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc= 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc=0 
+ENDL
+
+echo Two spaces around the key/value directive
+test_mkfs_config << ENDL
+[metadata]
+ crc =0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+ crc= 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+ crc=0 
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc =0 
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc= 0 
+ENDL
+
+echo Three spaces around the key/value directive
+test_mkfs_config << ENDL
+[metadata]
+ crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+ crc= 0 
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = 0 
+ENDL
+
+echo Four spaces around the key/value directive
+test_mkfs_config << ENDL
+[metadata]
+ crc = 0 
+ENDL
+
+echo Arbitrary spaces and tabs
+test_mkfs_config << ENDL
+[metadata]
+	  crc 	  	=   	  	 0	  	 	  
+ENDL
+
+echo ambiguous comment/section names
+test_mkfs_config << ENDL
+[metadata]
+#[data]
+crc = 0
+ENDL
+
+echo ambiguous comment/variable names
+test_mkfs_config << ENDL
+[metadata]
+#foo = 0 ; is this a comment or a key '#foo' ?
+ENDL
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/716.out b/tests/xfs/716.out
new file mode 100644
index 00000000..4c6e9fad
--- /dev/null
+++ b/tests/xfs/716.out
@@ -0,0 +1,16 @@
+QA output created by 716
+Simplest config file
+Piped-in config file
+Full line comment
+End of line comment
+Multiple directives
+Multiple sections
+No directives at all
+Space around the section name
+Single space around the key/value directive
+Two spaces around the key/value directive
+Three spaces around the key/value directive
+Four spaces around the key/value directive
+Arbitrary spaces and tabs
+ambiguous comment/section names
+ambiguous comment/variable names
diff --git a/tests/xfs/717 b/tests/xfs/717
new file mode 100755
index 00000000..031d59f1
--- /dev/null
+++ b/tests/xfs/717
@@ -0,0 +1,195 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020 Oracle.  All Rights Reserved.
+#
+# FS QA Test 717
+#
+# Feed invalid mkfs config files to the mkfs parser to ensure that they are
+# recognized as invalid.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap '_cleanup; exit $status' 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.* $def_cfgfile $fsimg
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_test
+_require_scratch_nocheck
+_require_xfs_mkfs_cfgfile
+
+def_cfgfile=$TEST_DIR/a
+fsimg=$TEST_DIR/a.img
+rm -rf $def_cfgfile $fsimg
+truncate -s 20t $fsimg
+
+test_mkfs_config() {
+	local cfgfile="$1"
+	if [ -z "$cfgfile" ] || [ "$cfgfile" = "-" ]; then
+		cfgfile=$def_cfgfile
+		cat > $cfgfile
+	fi
+	$MKFS_XFS_PROG -c options=$cfgfile -f -N $fsimg >> $seqres.full 2> $tmp.err
+	if [ $? -eq 0 ]; then
+		echo "Test passed, should have failed! Config file parameters:"
+		cat $cfgfile
+	fi
+}
+
+echo Spaces in a section name
+test_mkfs_config << ENDL
+[meta data]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[meta	data]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[ metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata ]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[ metadata ]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[ metadata] 
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata ] 
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [ metadata]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [metadata ]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [ metadata ]
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [metadata ] 
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+ [ metadata ] 
+crc = 0
+ENDL
+test_mkfs_config << ENDL
+   	 		 	 [	  	 		metadata		  	  	    	  ] 	 	 	    	
+crc = 0
+ENDL
+
+echo Spaces in the middle of a key name
+test_mkfs_config << ENDL
+[metadata]
+c rc = 0
+ENDL
+
+echo Invalid value
+test_mkfs_config << ENDL
+[metadata]
+crc = waffles
+ENDL
+
+echo Nonexistent sections
+test_mkfs_config << ENDL
+[goober]
+crc = 0
+ENDL
+
+echo Nonexistent keys
+test_mkfs_config << ENDL
+[metadata]
+goober = 0
+ENDL
+
+echo Only zero or one
+test_mkfs_config << ENDL
+[metadata]
+crc = 50
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = -1
+ENDL
+
+echo sysctl style files
+test_mkfs_config << ENDL
+metadata.crc = 1
+ENDL
+
+echo binaries
+test_mkfs_config $MKFS_XFS_PROG 2>&1 | sed -e "s#$MKFS_XFS_PROG#MKFS_XFS_PROG#g"
+
+echo respecified options
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+crc = 1
+ENDL
+
+echo respecified sections
+test_mkfs_config << ENDL
+[metadata]
+crc = 0
+[metadata]
+crc = 1
+ENDL
+
+echo ambiguous comment/section names
+test_mkfs_config << ENDL
+[meta#data]
+crc = 0
+ENDL
+
+echo ambiguous comment/variable names
+test_mkfs_config << ENDL
+[metadata]
+fo#o = 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+foo#=# 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+foo =# 0
+ENDL
+test_mkfs_config << ENDL
+[metadata]
+crc = 0;This is an eol comment.
+ENDL
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/717.out b/tests/xfs/717.out
new file mode 100644
index 00000000..61fff561
--- /dev/null
+++ b/tests/xfs/717.out
@@ -0,0 +1,13 @@
+QA output created by 717
+Spaces in a section name
+Spaces in the middle of a key name
+Invalid value
+Nonexistent sections
+Nonexistent keys
+Only zero or one
+sysctl style files
+binaries
+respecified options
+respecified sections
+ambiguous comment/section names
+ambiguous comment/variable names
diff --git a/tests/xfs/718 b/tests/xfs/718
new file mode 100755
index 00000000..e2beca41
--- /dev/null
+++ b/tests/xfs/718
@@ -0,0 +1,65 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020 Oracle.  All Rights Reserved.
+#
+# FS QA Test 718
+#
+# Test formatting with a well known config file.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap '_cleanup; exit $status' 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.* $def_cfgfile $fsimg
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_test
+_require_scratch_nocheck
+_require_xfs_mkfs_cfgfile
+
+echo "Silence is golden"
+
+def_cfgfile=$TEST_DIR/a
+fsimg=$TEST_DIR/a.img
+rm -rf $def_cfgfile $fsimg
+truncate -s 20t $fsimg
+
+cat > $def_cfgfile << ENDL
+[metadata]
+crc = 1
+rmapbt = 1
+reflink = 1
+
+[inode]
+sparse = 1
+ENDL
+
+$MKFS_XFS_PROG -c options=$def_cfgfile -f $SCRATCH_DEV > $tmp.mkfs
+cat $tmp.mkfs >> $seqres.full
+grep -q 'crc=1' $tmp.mkfs || echo 'v5 not enabled'
+grep -q 'rmapbt=1' $tmp.mkfs || echo 'rmap not enabled'
+grep -q 'reflink=1' $tmp.mkfs || echo 'reflink not enabled'
+grep -q 'sparse=1' $tmp.mkfs || echo 'sparse inodes not enabled'
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/718.out b/tests/xfs/718.out
new file mode 100644
index 00000000..1dad5ab3
--- /dev/null
+++ b/tests/xfs/718.out
@@ -0,0 +1,2 @@
+QA output created by 718
+Silence is golden
diff --git a/tests/xfs/719 b/tests/xfs/719
new file mode 100755
index 00000000..15ff3f27
--- /dev/null
+++ b/tests/xfs/719
@@ -0,0 +1,62 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020 Oracle.  All Rights Reserved.
+#
+# FS QA Test 719
+#
+# Test formatting with a config file that contains conflicting options.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap '_cleanup; exit $status' 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.* $def_cfgfile
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_test
+_require_scratch_nocheck
+_require_xfs_mkfs_cfgfile
+
+echo "Silence is golden"
+
+def_cfgfile=$TEST_DIR/a
+rm -rf $def_cfgfile
+
+cat > $def_cfgfile << ENDL
+[metadata]
+crc = 0
+rmapbt = 1
+reflink = 1
+
+[inode]
+sparse = 1
+ENDL
+
+$MKFS_XFS_PROG -c options=$def_cfgfile -f $SCRATCH_DEV > $tmp.mkfs 2>&1
+if [ $? -eq 0 ]; then
+	echo "mkfs.xfs did not fail!"
+	cat $tmp.mkfs
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/719.out b/tests/xfs/719.out
new file mode 100644
index 00000000..25585fa0
--- /dev/null
+++ b/tests/xfs/719.out
@@ -0,0 +1,2 @@
+QA output created by 719
+Silence is golden
diff --git a/tests/xfs/720 b/tests/xfs/720
new file mode 100755
index 00000000..a917e9a6
--- /dev/null
+++ b/tests/xfs/720
@@ -0,0 +1,64 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2020 Oracle.  All Rights Reserved.
+#
+# FS QA Test 720
+#
+# Test formatting with conflicts between the config file and the cli.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap '_cleanup; exit $status' 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.* $def_cfgfile
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_test
+_require_scratch_nocheck
+_require_xfs_mkfs_cfgfile
+
+cfgfile=$TEST_DIR/a
+rm -rf $cfgfile
+
+# disable crc in config file, enable rmapbt (which requires crc=1) in cli
+cat > $cfgfile << ENDL
+[metadata]
+crc = 0
+ENDL
+
+$MKFS_XFS_PROG -c options=$cfgfile -f -m rmapbt=1 $SCRATCH_DEV > $tmp.mkfs 2>&1
+cat $tmp.mkfs >> $seqres.full
+grep 'rmapbt not supported without CRC support' $tmp.mkfs
+
+# enable rmapbt (which requires crc=1) in config file, disable crc in cli
+cat > $cfgfile << ENDL
+[metadata]
+rmapbt = 1
+ENDL
+
+$MKFS_XFS_PROG -c options=$cfgfile -f -m crc=0 $SCRATCH_DEV > $tmp.mkfs 2>&1
+cat $tmp.mkfs >> $seqres.full
+grep 'rmapbt not supported without CRC support' $tmp.mkfs
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/720.out b/tests/xfs/720.out
new file mode 100644
index 00000000..1d2cf2ef
--- /dev/null
+++ b/tests/xfs/720.out
@@ -0,0 +1,3 @@
+QA output created by 720
+rmapbt not supported without CRC support
+rmapbt not supported without CRC support
diff --git a/tests/xfs/group b/tests/xfs/group
index b89c0a4e..4d558e22 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -519,3 +519,8 @@
 519 auto quick reflink
 520 auto quick reflink
 521 auto quick realtime growfs
+716 auto quick mkfs
+717 auto quick mkfs
+718 auto quick mkfs
+719 auto quick mkfs
+720 auto quick mkfs
