From 8ceac6e2f7411914730c2c1cfbd5cb52a896ba7c Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Mon, 21 Dec 2015 18:35:21 +1100 Subject: [PATCH] reflink: test CoW with blocksize < pagesize Test CoW operations when blocksize < pagesize and the only reflink block is in the middle of the page. Signed-off-by: Darrick J. Wong Signed-off-by: Dave Chinner --- common/reflink | 30 ++++++++ tests/generic/205 | 102 ++++++++++++++++++++++++++ tests/generic/205.out | 7 ++ tests/generic/206 | 102 ++++++++++++++++++++++++++ tests/generic/206.out | 7 ++ tests/generic/216 | 103 ++++++++++++++++++++++++++ tests/generic/216.out | 7 ++ tests/generic/217 | 103 ++++++++++++++++++++++++++ tests/generic/217.out | 7 ++ tests/generic/218 | 97 +++++++++++++++++++++++++ tests/generic/218.out | 7 ++ tests/generic/220 | 97 +++++++++++++++++++++++++ tests/generic/220.out | 7 ++ tests/generic/222 | 103 ++++++++++++++++++++++++++ tests/generic/222.out | 7 ++ tests/generic/227 | 103 ++++++++++++++++++++++++++ tests/generic/227.out | 7 ++ tests/generic/229 | 163 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/229.out | 83 +++++++++++++++++++++ tests/generic/238 | 163 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/238.out | 83 +++++++++++++++++++++ tests/generic/group | 10 +++ 22 files changed, 1398 insertions(+) create mode 100755 tests/generic/205 create mode 100644 tests/generic/205.out create mode 100755 tests/generic/206 create mode 100644 tests/generic/206.out create mode 100755 tests/generic/216 create mode 100644 tests/generic/216.out create mode 100755 tests/generic/217 create mode 100644 tests/generic/217.out create mode 100755 tests/generic/218 create mode 100644 tests/generic/218.out create mode 100755 tests/generic/220 create mode 100644 tests/generic/220.out create mode 100755 tests/generic/222 create mode 100644 tests/generic/222.out create mode 100755 tests/generic/227 create mode 100644 tests/generic/227.out create mode 100755 tests/generic/229 create mode 100644 tests/generic/229.out create mode 100755 tests/generic/238 create mode 100644 tests/generic/238.out diff --git a/common/reflink b/common/reflink index eab7f66b..de8e56db 100644 --- a/common/reflink +++ b/common/reflink @@ -183,3 +183,33 @@ _dedupe_range() { "$XFS_IO_PROG" $xfs_io_args -f -c "dedupe $file1 $offset1 $offset2 $len" "$file2" } + +# Create fs of certain blocksize on scratch device +# _scratch_mkfs_blocksized blocksize +_scratch_mkfs_blocksized() +{ + blocksize=$1 + + re='^[0-9]+$' + if ! [[ $blocksize =~ $re ]] ; then + _notrun "error: _scratch_mkfs_sized: block size \"$blocksize\" not an integer." + fi + + case $FSTYP in + xfs) + # don't override MKFS_OPTIONS that set a block size. + echo $MKFS_OPTIONS |egrep -q "b?size=" + if [ $? -eq 0 ]; then + _scratch_mkfs_xfs + else + _scratch_mkfs_xfs -b size=$blocksize + fi + ;; + ext2|ext3|ext4|ocfs2) + ${MKFS_PROG}.$FSTYP -F $MKFS_OPTIONS -b $blocksize $SCRATCH_DEV + ;; + *) + _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_blocksized" + ;; + esac +} diff --git a/tests/generic/205 b/tests/generic/205 new file mode 100755 index 00000000..525138a3 --- /dev/null +++ b/tests/generic/205 @@ -0,0 +1,102 @@ +#! /bin/bash +# FS QA Test No. 205 +# +# See what happens if we CoW blocks 2-4 of a page's worth of blocks when the +# second block is a regular block. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/205.out b/tests/generic/205.out new file mode 100644 index 00000000..1a225156 --- /dev/null +++ b/tests/generic/205.out @@ -0,0 +1,7 @@ +QA output created by 205 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/206 b/tests/generic/206 new file mode 100755 index 00000000..0a734a56 --- /dev/null +++ b/tests/generic/206 @@ -0,0 +1,102 @@ +#! /bin/bash +# FS QA Test No. 206 +# +# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when +# the second block is a regular block. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/206.out b/tests/generic/206.out new file mode 100644 index 00000000..0b1ec608 --- /dev/null +++ b/tests/generic/206.out @@ -0,0 +1,7 @@ +QA output created by 206 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/216 b/tests/generic/216 new file mode 100755 index 00000000..d4ab7aa7 --- /dev/null +++ b/tests/generic/216 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 216 +# +# See what happens if we CoW blocks 2-4 of a page's worth of blocks when the +# second block is a unwritten block. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "falloc -k $BLKSZ $BLKSZ" "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x00 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "falloc -k $((BLKSZ * 3)) $BLKSZ" "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x00 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/216.out b/tests/generic/216.out new file mode 100644 index 00000000..2d43c3a2 --- /dev/null +++ b/tests/generic/216.out @@ -0,0 +1,7 @@ +QA output created by 216 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/217 b/tests/generic/217 new file mode 100755 index 00000000..5e5c831a --- /dev/null +++ b/tests/generic/217 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 217 +# +# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when +# the second block is a unwritten block. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "falloc -k $BLKSZ $BLKSZ" "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x00 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "falloc -k $((BLKSZ * 3)) $BLKSZ" "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x00 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/217.out b/tests/generic/217.out new file mode 100644 index 00000000..d8eb1bea --- /dev/null +++ b/tests/generic/217.out @@ -0,0 +1,7 @@ +QA output created by 217 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/218 b/tests/generic/218 new file mode 100755 index 00000000..7c310921 --- /dev/null +++ b/tests/generic/218 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 218 +# +# See what happens if we CoW blocks 2-4 of a page's worth of blocks when the +# second block is a hole. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/218.out b/tests/generic/218.out new file mode 100644 index 00000000..0173be0a --- /dev/null +++ b/tests/generic/218.out @@ -0,0 +1,7 @@ +QA output created by 218 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/220 b/tests/generic/220 new file mode 100755 index 00000000..3ab9881e --- /dev/null +++ b/tests/generic/220 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 220 +# +# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when +# the second block is a unwritten block. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +"$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/220.out b/tests/generic/220.out new file mode 100644 index 00000000..9dcb9d67 --- /dev/null +++ b/tests/generic/220.out @@ -0,0 +1,7 @@ +QA output created by 220 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/222 b/tests/generic/222 new file mode 100755 index 00000000..3e344dce --- /dev/null +++ b/tests/generic/222 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 222 +# +# See what happens if we CoW blocks 2-4 of a page's worth of blocks when the +# second block is delalloc. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/222.out b/tests/generic/222.out new file mode 100644 index 00000000..47bad107 --- /dev/null +++ b/tests/generic/222.out @@ -0,0 +1,7 @@ +QA output created by 222 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/227 b/tests/generic/227 new file mode 100755 index 00000000..ad529979 --- /dev/null +++ b/tests/generic/227 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 227 +# +# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when +# the second block is delalloc. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +echo "Create the original files" +_pwrite_byte 0x61 0 $PAGESZ "$TESTDIR/file1" >> "$seqres.full" + +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$TESTDIR/file2.chk" >> "$seqres.full" + +_reflink_range "$TESTDIR/file1" $BLKSZ "$TESTDIR/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "CoW and unmount" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $BLKSZ $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2" >> "$seqres.full" +_pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$TESTDIR/file2.chk" >> "$seqres.full" + +"$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2" >> "$seqres.full" +"$XFS_IO_PROG" -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$TESTDIR/file2.chk" >> "$seqres.full" +_scratch_remount + +echo "Compare files" +! cmp -s "$TESTDIR/file1" "$TESTDIR/file2" || _fail "file1 and file2 don't match." +cmp -s "$TESTDIR/file2" "$TESTDIR/file2.chk" || _fail "file2 and file2.chk don't match." + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/227.out b/tests/generic/227.out new file mode 100644 index 00000000..69cb88f0 --- /dev/null +++ b/tests/generic/227.out @@ -0,0 +1,7 @@ +QA output created by 227 +Format and mount +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/229 b/tests/generic/229 new file mode 100755 index 00000000..4a65135e --- /dev/null +++ b/tests/generic/229 @@ -0,0 +1,163 @@ +#! /bin/bash +# FS QA Test No. 229 +# +# See what happens if we CoW blocks 2-4 of a page's worth of blocks when the +# surrounding blocks vary between unwritten/regular/delalloc/hole. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +runtest() { + echo "runtest $1 $2" + b2=$1 + b4=$2 + dir=$3 + + echo "Create the original files" + mkdir -p "$dir" + _pwrite_byte 0x61 0 $PAGESZ "$dir/file1" >> "$seqres.full" + + "$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$dir/file2" >> "$seqres.full" + "$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$dir/file2.chk" >> "$seqres.full" + + case "$b2" in + "regular") + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "unwritten") + "$XFS_IO_PROG" -f -c "falloc -k $BLKSZ $BLKSZ" "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x00 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "hole") + ;; + esac + + + + case "$b4" in + "regular") + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "unwritten") + "$XFS_IO_PROG" -f -c "falloc -k $((BLKSZ * 3)) $BLKSZ" "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x00 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "hole") + ;; + esac + + _reflink_range "$dir/file1" $BLKSZ "$dir/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + _scratch_remount + + echo "Compare files" + ! cmp -s "$dir/file1" "$dir/file2" || _fail "file1 and file2 don't match." + cmp -s "$dir/file2" "$dir/file2.chk" || _fail "file2 and file2.chk don't match." + + echo "CoW and unmount" + if [ "$b2" = "delalloc" ]; then + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + fi + + if [ "$b4" = "delalloc" ]; then + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + fi + + "$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$dir/file2" >> "$seqres.full" + "$XFS_IO_PROG" -f -c "pwrite -S 0x63 $((BLKSZ + 17)) $((BLKSZ * 3 - 34))" "$dir/file2.chk" >> "$seqres.full" + _scratch_remount + + echo "Compare files" + ! cmp -s "$dir/file1" "$dir/file2" || _fail "file1 and file2 don't match." + cmp -s "$dir/file2" "$dir/file2.chk" || _fail "file2 and file2.chk don't match." +} + +runtest regular delalloc "$TESTDIR/r-d" +runtest regular unwritten "$TESTDIR/r-u" +runtest regular hole "$TESTDIR/r-h" +runtest regular regular "$TESTDIR/r-r" + +runtest hole delalloc "$TESTDIR/h-d" +runtest hole unwritten "$TESTDIR/h-u" +runtest hole hole "$TESTDIR/h-h" +runtest hole regular "$TESTDIR/h-r" + +runtest unwritten delalloc "$TESTDIR/u-d" +runtest unwritten unwritten "$TESTDIR/u-u" +runtest unwritten hole "$TESTDIR/u-h" +runtest unwritten regular "$TESTDIR/u-r" + +runtest delalloc delalloc "$TESTDIR/d-d" +runtest delalloc unwritten "$TESTDIR/d-u" +runtest delalloc hole "$TESTDIR/d-h" +runtest delalloc regular "$TESTDIR/d-r" + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/229.out b/tests/generic/229.out new file mode 100644 index 00000000..07750ace --- /dev/null +++ b/tests/generic/229.out @@ -0,0 +1,83 @@ +QA output created by 229 +Format and mount +runtest regular delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc regular +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/238 b/tests/generic/238 new file mode 100755 index 00000000..e02396b1 --- /dev/null +++ b/tests/generic/238 @@ -0,0 +1,163 @@ +#! /bin/bash +# FS QA Test No. 238 +# +# See what happens if we DIO CoW blocks 2-4 of a page's worth of blocks when +# the surrounding blocks vary between unwritten/regular/delalloc/hole. +# +# This test is dependent on the system page size, so we cannot use md5 in +# the golden output; we can only compare to a check file. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +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 -rf "$tmp".* "$TESTDIR" +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +PAGESZ=$(getconf PAGE_SIZE) +BLKSZ=$((PAGESZ / 4)) + +echo "Format and mount" +_scratch_mkfs_blocksized $BLKSZ > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +TESTDIR="$SCRATCH_MNT/test-$seq" +rm -rf $TESTDIR +mkdir $TESTDIR + +REAL_BLKSZ=$(stat -f -c '%S' $TESTDIR) +test "$REAL_BLKSZ" != "$BLKSZ" && _notrun "Failed to format with small blocksize." + +runtest() { + echo "runtest $1 $2" + b2=$1 + b4=$2 + dir=$3 + + echo "Create the original files" + mkdir -p "$dir" + _pwrite_byte 0x61 0 $PAGESZ "$dir/file1" >> "$seqres.full" + + "$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$dir/file2" >> "$seqres.full" + "$XFS_IO_PROG" -f -c "truncate $PAGESZ" "$dir/file2.chk" >> "$seqres.full" + + case "$b2" in + "regular") + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "unwritten") + "$XFS_IO_PROG" -f -c "falloc -k $BLKSZ $BLKSZ" "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x00 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "hole") + ;; + esac + + + + case "$b4" in + "regular") + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "unwritten") + "$XFS_IO_PROG" -f -c "falloc -k $((BLKSZ * 3)) $BLKSZ" "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x00 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + ;; + "hole") + ;; + esac + + _reflink_range "$dir/file1" $BLKSZ "$dir/file2" $((BLKSZ * 2)) $BLKSZ >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 2)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + _scratch_remount + + echo "Compare files" + ! cmp -s "$dir/file1" "$dir/file2" || _fail "file1 and file2 don't match." + cmp -s "$dir/file2" "$dir/file2.chk" || _fail "file2 and file2.chk don't match." + + echo "CoW and unmount" + if [ "$b2" = "delalloc" ]; then + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $BLKSZ $BLKSZ "$dir/file2.chk" >> "$seqres.full" + fi + + if [ "$b4" = "delalloc" ]; then + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2" >> "$seqres.full" + _pwrite_byte 0x61 $((BLKSZ * 3)) $BLKSZ "$dir/file2.chk" >> "$seqres.full" + fi + + "$XFS_IO_PROG" -d -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$dir/file2" >> "$seqres.full" + "$XFS_IO_PROG" -f -c "pwrite -S 0x63 $BLKSZ $((BLKSZ * 3))" "$dir/file2.chk" >> "$seqres.full" + _scratch_remount + + echo "Compare files" + ! cmp -s "$dir/file1" "$dir/file2" || _fail "file1 and file2 don't match." + cmp -s "$dir/file2" "$dir/file2.chk" || _fail "file2 and file2.chk don't match." +} + +runtest regular delalloc "$TESTDIR/r-d" +runtest regular unwritten "$TESTDIR/r-u" +runtest regular hole "$TESTDIR/r-h" +runtest regular regular "$TESTDIR/r-r" + +runtest hole delalloc "$TESTDIR/h-d" +runtest hole unwritten "$TESTDIR/h-u" +runtest hole hole "$TESTDIR/h-h" +runtest hole regular "$TESTDIR/h-r" + +runtest unwritten delalloc "$TESTDIR/u-d" +runtest unwritten unwritten "$TESTDIR/u-u" +runtest unwritten hole "$TESTDIR/u-h" +runtest unwritten regular "$TESTDIR/u-r" + +runtest delalloc delalloc "$TESTDIR/d-d" +runtest delalloc unwritten "$TESTDIR/d-u" +runtest delalloc hole "$TESTDIR/d-h" +runtest delalloc regular "$TESTDIR/d-r" + +echo "Check for damage" +umount "$SCRATCH_MNT" +_check_scratch_fs + +# success, all done +status=0 +exit diff --git a/tests/generic/238.out b/tests/generic/238.out new file mode 100644 index 00000000..dcfcc8e1 --- /dev/null +++ b/tests/generic/238.out @@ -0,0 +1,83 @@ +QA output created by 238 +Format and mount +runtest regular delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest regular regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest hole regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest unwritten regular +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc delalloc +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc unwritten +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc hole +Create the original files +Compare files +CoW and unmount +Compare files +runtest delalloc regular +Create the original files +Compare files +CoW and unmount +Compare files +Check for damage diff --git a/tests/generic/group b/tests/generic/group index ee296b41..d8484e84 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -207,6 +207,8 @@ 202 auto quick clone 203 auto quick clone 204 metadata rw auto +205 auto quick clone +206 auto quick clone 207 auto aio quick 208 auto aio 209 auto aio @@ -216,13 +218,20 @@ 213 rw auto prealloc quick enospc 214 rw auto prealloc quick 215 auto metadata quick +216 auto quick clone +217 auto quick clone +218 auto quick clone 219 auto quota quick +220 auto quick clone 221 auto metadata quick +222 auto quick clone 223 auto quick 224 auto 225 auto quick 226 auto enospc +227 auto quick clone 228 rw auto prealloc quick +229 auto quick clone 230 auto quota quick 231 auto quota 232 auto quota stress @@ -231,6 +240,7 @@ 235 auto quota quick 236 auto quick metadata 237 auto quick acl +238 auto quick clone 239 auto aio rw 240 auto aio quick rw 241 auto -- 2.30.2