On Wednesday 28 October 2020 12:32:49 AM IST Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Add two regression tests to make sure that FICLONERANGE and the splice > based copy_file_range actually flush all data and metadata to disk > before the call ends. > Looks good to me. Reviewed-by: Chandan Babu R <chandanrlinux@xxxxxxxxx> > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > tests/generic/947 | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/947.out | 15 ++++++ > tests/generic/948 | 90 ++++++++++++++++++++++++++++++++++++++ > tests/generic/948.out | 9 ++++ > tests/generic/group | 2 + > 5 files changed, 233 insertions(+) > create mode 100755 tests/generic/947 > create mode 100644 tests/generic/947.out > create mode 100755 tests/generic/948 > create mode 100644 tests/generic/948.out > > > diff --git a/tests/generic/947 b/tests/generic/947 > new file mode 100755 > index 00000000..d2adf745 > --- /dev/null > +++ b/tests/generic/947 > @@ -0,0 +1,117 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0-or-later > +# Copyright (c) 2020, Oracle. All Rights Reserved. > +# > +# FS QA Test No. 947 > +# > +# Make sure that reflink forces the log out if we open the file with O_SYNC or > +# set FS_XFLAG_SYNC on the file. We test that it actually forced the log by > +# using dm-error to shut down the fs without flushing the log and then > +# remounting to check file contents. > + > +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.* > + _dmerror_unmount > + _dmerror_cleanup > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/reflink > +. ./common/dmerror > + > +# real QA test starts here > +_supported_fs generic > +_require_dm_target error > +_require_scratch_reflink > +_require_xfs_io_command "chattr" "s" > +_require_cp_reflink > + > +rm -f $seqres.full > + > +# Format filesystem and set up quota limits > +_scratch_mkfs > $seqres.full > +_require_metadata_journaling $SCRATCH_DEV > +_dmerror_init > +_dmerror_mount > + > +# Test that O_SYNC actually results in file data being written even if the > +# fs immediately dies > +echo "test o_sync write" > +$XFS_IO_PROG -x -f -s -c "pwrite -S 0x58 0 1m -b 1m" $SCRATCH_MNT/0 >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/0 | _filter_scratch > + > +# Set up initial files for reflink test > +$XFS_IO_PROG -f -c 'pwrite -S 0x58 0 1m -b 1m' $SCRATCH_MNT/a >> $seqres.full > +$XFS_IO_PROG -f -c 'pwrite -S 0x59 0 1m -b 1m' $SCRATCH_MNT/c >> $seqres.full > +_cp_reflink $SCRATCH_MNT/a $SCRATCH_MNT/e > +_cp_reflink $SCRATCH_MNT/c $SCRATCH_MNT/d > +touch $SCRATCH_MNT/b > +sync > + > +# Test that reflink forces dirty data/metadata to disk when destination file > +# opened with O_SYNC > +echo "test reflink flag not set o_sync" > +$XFS_IO_PROG -x -s -c "reflink $SCRATCH_MNT/a" $SCRATCH_MNT/b >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/b | _filter_scratch > + > +# Test that reflink to a shared file forces dirty data/metadata to disk when > +# destination is opened with O_SYNC > +echo "test reflink flag already set o_sync" > +$XFS_IO_PROG -x -s -c "reflink $SCRATCH_MNT/a" $SCRATCH_MNT/d >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/d | _filter_scratch > + > +# Set up the two files with chattr +S > +rm -f $SCRATCH_MNT/b $SCRATCH_MNT/d > +_cp_reflink $SCRATCH_MNT/c $SCRATCH_MNT/d > +touch $SCRATCH_MNT/b > +chattr +S $SCRATCH_MNT/b $SCRATCH_MNT/d > +sync > + > +# Test that reflink forces dirty data/metadata to disk when destination file > +# has the sync iflag set > +echo "test reflink flag not set iflag" > +$XFS_IO_PROG -x -c "reflink $SCRATCH_MNT/a" $SCRATCH_MNT/b >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/b | _filter_scratch > + > +# Test that reflink to a shared file forces dirty data/metadata to disk when > +# destination file has the sync iflag set > +echo "test reflink flag already set iflag" > +$XFS_IO_PROG -x -c "reflink $SCRATCH_MNT/a" $SCRATCH_MNT/d >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/d | _filter_scratch > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/947.out b/tests/generic/947.out > new file mode 100644 > index 00000000..05ba10d1 > --- /dev/null > +++ b/tests/generic/947.out > @@ -0,0 +1,15 @@ > +QA output created by 947 > +test o_sync write > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/0 > +test reflink flag not set o_sync > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/b > +test reflink flag already set o_sync > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/d > +test reflink flag not set iflag > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/b > +test reflink flag already set iflag > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/d > diff --git a/tests/generic/948 b/tests/generic/948 > new file mode 100755 > index 00000000..83fe414b > --- /dev/null > +++ b/tests/generic/948 > @@ -0,0 +1,90 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0-or-later > +# Copyright (c) 2020, Oracle. All Rights Reserved. > +# > +# FS QA Test No. 948 > +# > +# Make sure that copy_file_range forces the log out if we open the file with > +# O_SYNC or set FS_XFLAG_SYNC on the file. We test that it actually forced the > +# log by using dm-error to shut down the fs without flushing the log and then > +# remounting to check file contents. > + > +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.* > + _dmerror_unmount > + _dmerror_cleanup > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/dmerror > + > +# real QA test starts here > +_supported_fs generic > +_require_dm_target error > +_require_xfs_io_command "chattr" "s" > + > +rm -f $seqres.full > + > +# Format filesystem and set up quota limits > +_scratch_mkfs > $seqres.full > +_require_metadata_journaling $SCRATCH_DEV > +_dmerror_init > +_dmerror_mount > + > +# Test that O_SYNC actually results in file data being written even if the > +# fs immediately dies > +echo "test o_sync write" > +$XFS_IO_PROG -x -f -s -c "pwrite -S 0x58 0 1m -b 1m" $SCRATCH_MNT/0 >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/0 | _filter_scratch > + > +# Set up initial files for copy test > +$XFS_IO_PROG -f -c 'pwrite -S 0x58 0 1m -b 1m' $SCRATCH_MNT/a >> $seqres.full > +touch $SCRATCH_MNT/b > +sync > + > +# Test that unaligned copy file range forces dirty data/metadata to disk when > +# destination file opened with O_SYNC > +echo "test unaligned copy range o_sync" > +$XFS_IO_PROG -x -s -c "copy_range -s 13 -d 13 -l 1048550 $SCRATCH_MNT/a" $SCRATCH_MNT/b >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/b | _filter_scratch > + > +# Set up dest file with chattr +S > +rm -f $SCRATCH_MNT/b > +touch $SCRATCH_MNT/b > +chattr +S $SCRATCH_MNT/b > +sync > + > +# Test that unaligned copy file range forces dirty data/metadata to disk when > +# destination file has the sync iflag set > +echo "test unaligned copy range iflag" > +$XFS_IO_PROG -x -c "copy_range -s 13 -d 13 -l 1048550 $SCRATCH_MNT/a" $SCRATCH_MNT/b >> $seqres.full > +_dmerror_load_error_table > +_dmerror_unmount > +_dmerror_load_working_table > +_dmerror_mount > +md5sum $SCRATCH_MNT/a $SCRATCH_MNT/b | _filter_scratch > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/948.out b/tests/generic/948.out > new file mode 100644 > index 00000000..eec6c0dc > --- /dev/null > +++ b/tests/generic/948.out > @@ -0,0 +1,9 @@ > +QA output created by 948 > +test o_sync write > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/0 > +test unaligned copy range o_sync > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +2a715d2093b5aca82783a0c5943ac0b8 SCRATCH_MNT/b > +test unaligned copy range iflag > +310f146ce52077fcd3308dcbe7632bb2 SCRATCH_MNT/a > +2a715d2093b5aca82783a0c5943ac0b8 SCRATCH_MNT/b > diff --git a/tests/generic/group b/tests/generic/group > index 8054d874..cf4fdc23 100644 > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -615,3 +615,5 @@ > 610 auto quick prealloc zero > 611 auto quick attr > 612 auto quick clone > +947 auto quick rw clone > +948 auto quick rw copy_range > > -- chandan