diff mbox series

generic: Verify the inheritance behavior of FS_XFLAG_DAX flag in various combinations

Message ID 20200708082544.21624-1-yangx.jy@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show
Series generic: Verify the inheritance behavior of FS_XFLAG_DAX flag in various combinations | expand

Commit Message

Xiao Yang July 8, 2020, 8:25 a.m. UTC
Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
---

Note: this patch depends on the following patches:
https://www.spinics.net/lists/fstests/msg14252.html
https://www.spinics.net/lists/fstests/msg14272.html

 tests/generic/605     | 169 ++++++++++++++++++++++++++++++++++++++++++
 tests/generic/605.out |   2 +
 tests/generic/group   |   1 +
 3 files changed, 172 insertions(+)
 create mode 100644 tests/generic/605
 create mode 100644 tests/generic/605.out

Comments

Darrick J. Wong July 8, 2020, 3:47 p.m. UTC | #1
On Wed, Jul 08, 2020 at 04:25:44PM +0800, Xiao Yang wrote:
> Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
> ---
> 
> Note: this patch depends on the following patches:
> https://www.spinics.net/lists/fstests/msg14252.html
> https://www.spinics.net/lists/fstests/msg14272.html

You might want to add this test onto that series then...

> 
>  tests/generic/605     | 169 ++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/605.out |   2 +
>  tests/generic/group   |   1 +
>  3 files changed, 172 insertions(+)
>  create mode 100644 tests/generic/605
>  create mode 100644 tests/generic/605.out
> 
> diff --git a/tests/generic/605 b/tests/generic/605
> new file mode 100644
> index 00000000..c44271e8
> --- /dev/null
> +++ b/tests/generic/605
> @@ -0,0 +1,169 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2020 Fujitsu.  All Rights Reserved.
> +#
> +# FS QA Test 605
> +#
> +# Verify the inheritance behavior of FS_XFLAG_DAX flag in various combinations.
> +# 1) New files and directories automatically inherit FS_XFLAG_DAX from their parent directory.
> +# 2) cp operation make files and directories inherit the FS_XFLAG_DAX from new parent directory.
> +# 3) mv operation make files and directories preserve the FS_XFLAG_DAX from old parent directory.
> +# In addition, setting/clearing FS_XFLAG_DAX flag is not impacted by dax mount 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.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +_supported_fs generic
> +_supported_os Linux
> +_require_scratch_dax_mountopt "dax=always"

Do you actually need this?  I'd hate to leave this test out of reach for
people who don't have pmem or can't simulate it reliably.  We
deliberately left this flag separate from S_DAX so that the ondisk
metadata flag would always have consistent behavior no matter what
hardware is underneath.

OTOH I guess you're also trying to check that the FS_XFLAG_DAX behavior
is the same with all the dax= mount options applied.  Since this is one
of the 'silence is golden' tests, how about dropping this requirement
and running the test_xflag_inheritance* functions once with no dax
options at all; then we see if the fs will mount with dax=always, and if
so, run all those tests again with each of the dax= mount options?

The rest looks good to me.

--D

> +_require_scratch_dax_iflag
> +_require_xfs_io_command "lsattr"
> +
> +check_xflag()
> +{
> +	local target=$1
> +	local exp_xflag=$2
> +
> +	if [ $exp_xflag -eq 0 ]; then
> +		_test_inode_flag dax $target && echo "$target has unexpected FS_XFLAG_DAX flag"
> +	else
> +		_test_inode_flag dax $target || echo "$target doen't have expected FS_XFLAG_DAX flag"
> +	fi
> +}
> +
> +test_xflag_inheritance1()
> +{
> +	mkdir -p a
> +	$XFS_IO_PROG -c "chattr +x" a
> +	mkdir -p a/b/c
> +	touch a/b/c/d
> +
> +	check_xflag a 1
> +	check_xflag a/b 1
> +	check_xflag a/b/c 1
> +	check_xflag a/b/c/d 1
> +
> +	rm -rf a
> +}
> +
> +test_xflag_inheritance2()
> +{
> +	mkdir -p a/b
> +	$XFS_IO_PROG -c "chattr +x" a
> +	mkdir -p a/b/c a/d
> +	touch a/b/c/e a/d/f
> +
> +	check_xflag a 1
> +	check_xflag a/b 0
> +	check_xflag a/b/c 0
> +	check_xflag a/b/c/e 0
> +	check_xflag a/d 1
> +	check_xflag a/d/f 1
> +
> +	rm -rf a
> +}
> +
> +test_xflag_inheritance3()
> +{
> +	mkdir -p a/b
> +	$XFS_IO_PROG -c "chattr +x" a/b
> +	mkdir -p a/b/c a/d
> +	touch a/b/c/e a/d/f
> +
> +	check_xflag a 0
> +	check_xflag a/b 1
> +	check_xflag a/b/c 1
> +	check_xflag a/b/c/e 1
> +	check_xflag a/d 0
> +	check_xflag a/d/f 0
> +
> +	rm -rf a
> +}
> +
> +test_xflag_inheritance4()
> +{
> +	mkdir -p a
> +	$XFS_IO_PROG -c "chattr +x" a
> +	mkdir -p a/b/c
> +	$XFS_IO_PROG -c "chattr -x" a/b
> +	mkdir -p a/b/c/d a/b/e
> +	touch a/b/c/d/f a/b/e/g
> +
> +	check_xflag a 1
> +	check_xflag a/b 0
> +	check_xflag a/b/c 1
> +	check_xflag a/b/c/d 1
> +	check_xflag a/b/c/d/f 1
> +	check_xflag a/b/e 0
> +	check_xflag a/b/e/g 0
> +
> +	rm -rf a
> +}
> +
> +test_xflag_inheritance5()
> +{
> +	mkdir -p a b
> +	$XFS_IO_PROG -c "chattr +x" a
> +	mkdir -p a/c a/d b/e b/f
> +	touch a/g b/h
> +
> +	cp -r a/c b/
> +	cp -r b/e a/
> +	cp -r a/g b/
> +	mv a/d b/
> +	mv b/f a/
> +	mv b/h a/
> +
> +	check_xflag b/c 0
> +	check_xflag b/d 1
> +	check_xflag a/e 1
> +	check_xflag a/f 0
> +	check_xflag b/g 0
> +	check_xflag a/h 0
> +
> +	rm -rf a b
> +}
> +
> +do_tests()
> +{
> +	# Mount with various dax options
> +	for dax_option in "dax=always" "dax=inode" "dax=never"; do
> +		_scratch_mount "-o $dax_option"
> +		cd $SCRATCH_MNT
> +
> +		for i in $(seq 1 5); do
> +			test_xflag_inheritance${i}
> +		done
> +
> +		cd - > /dev/null
> +		_scratch_unmount
> +	done
> +}
> +
> +_scratch_mkfs >> $seqres.full 2>&1
> +
> +do_tests
> +
> +# success, all done
> +echo "Silence is golden"
> +status=0
> +exit
> diff --git a/tests/generic/605.out b/tests/generic/605.out
> new file mode 100644
> index 00000000..1ae20049
> --- /dev/null
> +++ b/tests/generic/605.out
> @@ -0,0 +1,2 @@
> +QA output created by 605
> +Silence is golden
> diff --git a/tests/generic/group b/tests/generic/group
> index 676e0d2e..a8451862 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -607,3 +607,4 @@
>  602 auto quick encrypt
>  603 auto attr quick dax
>  604 auto attr quick dax
> +605 auto attr quick dax
> -- 
> 2.21.0
> 
> 
>
Xiao Yang July 9, 2020, 1:13 a.m. UTC | #2
On 2020/7/8 23:47, Darrick J. Wong wrote:
> On Wed, Jul 08, 2020 at 04:25:44PM +0800, Xiao Yang wrote:
>> Signed-off-by: Xiao Yang<yangx.jy@cn.fujitsu.com>
>> ---
>>
>> Note: this patch depends on the following patches:
>> https://www.spinics.net/lists/fstests/msg14252.html
>> https://www.spinics.net/lists/fstests/msg14272.html
> You might want to add this test onto that series then...
Hi Darrick,

Do you perfer to squash these new tests into the first patch set and 
then send the v5 patch set?
BTW: I thought the first patch set will be pushed recently so I sent new 
tests separately.

>>   tests/generic/605     | 169 ++++++++++++++++++++++++++++++++++++++++++
>>   tests/generic/605.out |   2 +
>>   tests/generic/group   |   1 +
>>   3 files changed, 172 insertions(+)
>>   create mode 100644 tests/generic/605
>>   create mode 100644 tests/generic/605.out
>>
>> diff --git a/tests/generic/605 b/tests/generic/605
>> new file mode 100644
>> index 00000000..c44271e8
>> --- /dev/null
>> +++ b/tests/generic/605
>> @@ -0,0 +1,169 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2020 Fujitsu.  All Rights Reserved.
>> +#
>> +# FS QA Test 605
>> +#
>> +# Verify the inheritance behavior of FS_XFLAG_DAX flag in various combinations.
>> +# 1) New files and directories automatically inherit FS_XFLAG_DAX from their parent directory.
>> +# 2) cp operation make files and directories inherit the FS_XFLAG_DAX from new parent directory.
>> +# 3) mv operation make files and directories preserve the FS_XFLAG_DAX from old parent directory.
>> +# In addition, setting/clearing FS_XFLAG_DAX flag is not impacted by dax mount 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.*
>> +}
>> +
>> +# get standard environment, filters and checks
>> +. ./common/rc
>> +. ./common/filter
>> +
>> +# remove previous $seqres.full before test
>> +rm -f $seqres.full
>> +
>> +_supported_fs generic
>> +_supported_os Linux
>> +_require_scratch_dax_mountopt "dax=always"
> Do you actually need this?  I'd hate to leave this test out of reach for
> people who don't have pmem or can't simulate it reliably.  We
> deliberately left this flag separate from S_DAX so that the ondisk
> metadata flag would always have consistent behavior no matter what
> hardware is underneath.

I considered FS_XFLAG_DAX doesn't depends on pmem but not sure how to 
cover all cases.
PS: I wanted to remove_require_scratch_dax_mountopt and make user to 
specify the dax option by MOUNT_OPTIONS before.

> OTOH I guess you're also trying to check that the FS_XFLAG_DAX behavior
> is the same with all the dax= mount options applied.  Since this is one
> of the 'silence is golden' tests, how about dropping this requirement
> and running the test_xflag_inheritance* functions once with no dax
> options at all; then we see if the fs will mount with dax=always, and if
> so, run all those tests again with each of the dax= mount options?

Good suggestion, I will try to rewrite this part.

Best Regards,
Xiao Yang
> The rest looks good to me.
>
> --D
>
>> +_require_scratch_dax_iflag
>> +_require_xfs_io_command "lsattr"
>> +
>> +check_xflag()
>> +{
>> +	local target=$1
>> +	local exp_xflag=$2
>> +
>> +	if [ $exp_xflag -eq 0 ]; then
>> +		_test_inode_flag dax $target&&  echo "$target has unexpected FS_XFLAG_DAX flag"
>> +	else
>> +		_test_inode_flag dax $target || echo "$target doen't have expected FS_XFLAG_DAX flag"
>> +	fi
>> +}
>> +
>> +test_xflag_inheritance1()
>> +{
>> +	mkdir -p a
>> +	$XFS_IO_PROG -c "chattr +x" a
>> +	mkdir -p a/b/c
>> +	touch a/b/c/d
>> +
>> +	check_xflag a 1
>> +	check_xflag a/b 1
>> +	check_xflag a/b/c 1
>> +	check_xflag a/b/c/d 1
>> +
>> +	rm -rf a
>> +}
>> +
>> +test_xflag_inheritance2()
>> +{
>> +	mkdir -p a/b
>> +	$XFS_IO_PROG -c "chattr +x" a
>> +	mkdir -p a/b/c a/d
>> +	touch a/b/c/e a/d/f
>> +
>> +	check_xflag a 1
>> +	check_xflag a/b 0
>> +	check_xflag a/b/c 0
>> +	check_xflag a/b/c/e 0
>> +	check_xflag a/d 1
>> +	check_xflag a/d/f 1
>> +
>> +	rm -rf a
>> +}
>> +
>> +test_xflag_inheritance3()
>> +{
>> +	mkdir -p a/b
>> +	$XFS_IO_PROG -c "chattr +x" a/b
>> +	mkdir -p a/b/c a/d
>> +	touch a/b/c/e a/d/f
>> +
>> +	check_xflag a 0
>> +	check_xflag a/b 1
>> +	check_xflag a/b/c 1
>> +	check_xflag a/b/c/e 1
>> +	check_xflag a/d 0
>> +	check_xflag a/d/f 0
>> +
>> +	rm -rf a
>> +}
>> +
>> +test_xflag_inheritance4()
>> +{
>> +	mkdir -p a
>> +	$XFS_IO_PROG -c "chattr +x" a
>> +	mkdir -p a/b/c
>> +	$XFS_IO_PROG -c "chattr -x" a/b
>> +	mkdir -p a/b/c/d a/b/e
>> +	touch a/b/c/d/f a/b/e/g
>> +
>> +	check_xflag a 1
>> +	check_xflag a/b 0
>> +	check_xflag a/b/c 1
>> +	check_xflag a/b/c/d 1
>> +	check_xflag a/b/c/d/f 1
>> +	check_xflag a/b/e 0
>> +	check_xflag a/b/e/g 0
>> +
>> +	rm -rf a
>> +}
>> +
>> +test_xflag_inheritance5()
>> +{
>> +	mkdir -p a b
>> +	$XFS_IO_PROG -c "chattr +x" a
>> +	mkdir -p a/c a/d b/e b/f
>> +	touch a/g b/h
>> +
>> +	cp -r a/c b/
>> +	cp -r b/e a/
>> +	cp -r a/g b/
>> +	mv a/d b/
>> +	mv b/f a/
>> +	mv b/h a/
>> +
>> +	check_xflag b/c 0
>> +	check_xflag b/d 1
>> +	check_xflag a/e 1
>> +	check_xflag a/f 0
>> +	check_xflag b/g 0
>> +	check_xflag a/h 0
>> +
>> +	rm -rf a b
>> +}
>> +
>> +do_tests()
>> +{
>> +	# Mount with various dax options
>> +	for dax_option in "dax=always" "dax=inode" "dax=never"; do
>> +		_scratch_mount "-o $dax_option"
>> +		cd $SCRATCH_MNT
>> +
>> +		for i in $(seq 1 5); do
>> +			test_xflag_inheritance${i}
>> +		done
>> +
>> +		cd ->  /dev/null
>> +		_scratch_unmount
>> +	done
>> +}
>> +
>> +_scratch_mkfs>>  $seqres.full 2>&1
>> +
>> +do_tests
>> +
>> +# success, all done
>> +echo "Silence is golden"
>> +status=0
>> +exit
>> diff --git a/tests/generic/605.out b/tests/generic/605.out
>> new file mode 100644
>> index 00000000..1ae20049
>> --- /dev/null
>> +++ b/tests/generic/605.out
>> @@ -0,0 +1,2 @@
>> +QA output created by 605
>> +Silence is golden
>> diff --git a/tests/generic/group b/tests/generic/group
>> index 676e0d2e..a8451862 100644
>> --- a/tests/generic/group
>> +++ b/tests/generic/group
>> @@ -607,3 +607,4 @@
>>   602 auto quick encrypt
>>   603 auto attr quick dax
>>   604 auto attr quick dax
>> +605 auto attr quick dax
>> -- 
>> 2.21.0
>>
>>
>>
>
> .
>
diff mbox series

Patch

diff --git a/tests/generic/605 b/tests/generic/605
new file mode 100644
index 00000000..c44271e8
--- /dev/null
+++ b/tests/generic/605
@@ -0,0 +1,169 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Fujitsu.  All Rights Reserved.
+#
+# FS QA Test 605
+#
+# Verify the inheritance behavior of FS_XFLAG_DAX flag in various combinations.
+# 1) New files and directories automatically inherit FS_XFLAG_DAX from their parent directory.
+# 2) cp operation make files and directories inherit the FS_XFLAG_DAX from new parent directory.
+# 3) mv operation make files and directories preserve the FS_XFLAG_DAX from old parent directory.
+# In addition, setting/clearing FS_XFLAG_DAX flag is not impacted by dax mount 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.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+_supported_fs generic
+_supported_os Linux
+_require_scratch_dax_mountopt "dax=always"
+_require_scratch_dax_iflag
+_require_xfs_io_command "lsattr"
+
+check_xflag()
+{
+	local target=$1
+	local exp_xflag=$2
+
+	if [ $exp_xflag -eq 0 ]; then
+		_test_inode_flag dax $target && echo "$target has unexpected FS_XFLAG_DAX flag"
+	else
+		_test_inode_flag dax $target || echo "$target doen't have expected FS_XFLAG_DAX flag"
+	fi
+}
+
+test_xflag_inheritance1()
+{
+	mkdir -p a
+	$XFS_IO_PROG -c "chattr +x" a
+	mkdir -p a/b/c
+	touch a/b/c/d
+
+	check_xflag a 1
+	check_xflag a/b 1
+	check_xflag a/b/c 1
+	check_xflag a/b/c/d 1
+
+	rm -rf a
+}
+
+test_xflag_inheritance2()
+{
+	mkdir -p a/b
+	$XFS_IO_PROG -c "chattr +x" a
+	mkdir -p a/b/c a/d
+	touch a/b/c/e a/d/f
+
+	check_xflag a 1
+	check_xflag a/b 0
+	check_xflag a/b/c 0
+	check_xflag a/b/c/e 0
+	check_xflag a/d 1
+	check_xflag a/d/f 1
+
+	rm -rf a
+}
+
+test_xflag_inheritance3()
+{
+	mkdir -p a/b
+	$XFS_IO_PROG -c "chattr +x" a/b
+	mkdir -p a/b/c a/d
+	touch a/b/c/e a/d/f
+
+	check_xflag a 0
+	check_xflag a/b 1
+	check_xflag a/b/c 1
+	check_xflag a/b/c/e 1
+	check_xflag a/d 0
+	check_xflag a/d/f 0
+
+	rm -rf a
+}
+
+test_xflag_inheritance4()
+{
+	mkdir -p a
+	$XFS_IO_PROG -c "chattr +x" a
+	mkdir -p a/b/c
+	$XFS_IO_PROG -c "chattr -x" a/b
+	mkdir -p a/b/c/d a/b/e
+	touch a/b/c/d/f a/b/e/g
+
+	check_xflag a 1
+	check_xflag a/b 0
+	check_xflag a/b/c 1
+	check_xflag a/b/c/d 1
+	check_xflag a/b/c/d/f 1
+	check_xflag a/b/e 0
+	check_xflag a/b/e/g 0
+
+	rm -rf a
+}
+
+test_xflag_inheritance5()
+{
+	mkdir -p a b
+	$XFS_IO_PROG -c "chattr +x" a
+	mkdir -p a/c a/d b/e b/f
+	touch a/g b/h
+
+	cp -r a/c b/
+	cp -r b/e a/
+	cp -r a/g b/
+	mv a/d b/
+	mv b/f a/
+	mv b/h a/
+
+	check_xflag b/c 0
+	check_xflag b/d 1
+	check_xflag a/e 1
+	check_xflag a/f 0
+	check_xflag b/g 0
+	check_xflag a/h 0
+
+	rm -rf a b
+}
+
+do_tests()
+{
+	# Mount with various dax options
+	for dax_option in "dax=always" "dax=inode" "dax=never"; do
+		_scratch_mount "-o $dax_option"
+		cd $SCRATCH_MNT
+
+		for i in $(seq 1 5); do
+			test_xflag_inheritance${i}
+		done
+
+		cd - > /dev/null
+		_scratch_unmount
+	done
+}
+
+_scratch_mkfs >> $seqres.full 2>&1
+
+do_tests
+
+# success, all done
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/generic/605.out b/tests/generic/605.out
new file mode 100644
index 00000000..1ae20049
--- /dev/null
+++ b/tests/generic/605.out
@@ -0,0 +1,2 @@ 
+QA output created by 605
+Silence is golden
diff --git a/tests/generic/group b/tests/generic/group
index 676e0d2e..a8451862 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -607,3 +607,4 @@ 
 602 auto quick encrypt
 603 auto attr quick dax
 604 auto attr quick dax
+605 auto attr quick dax