reflink: test intersecting CoW and falloc/fpunch/fzero/fcollapse/finsert/ftrunc

Ensure that we correctly handle a CoW operation immediately followed
by a truncate, falloc, fpunch, fzero, fcollapse, and finsert operation
in the middle of the CoW'd region before any flush can occur.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Darrick J. Wong
2016-01-05 10:06:37 -08:00
parent be32a7f154
commit 58ac6c6424
13 changed files with 621 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
#! /bin/bash
# FS QA Test No. 253
#
# Truncate a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "truncate"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=4
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 2)) $blksz $((blksz * 2))" -c "truncate $((blksz * 2))" $testdir/file2 >> $seqres.full
_scratch_remount
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 2)) $blksz $((blksz * 2))" -c "truncate $((blksz * 2))" $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 253
Format and mount
Create the original files
Compare files
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-253/file1
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-253/file2
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-253/file2.chk
CoW and unmount
Compare files
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-253/file1
b5fc98f04b19fa7b2085ec1358c78760 SCRATCH_MNT/test-253/file2
b5fc98f04b19fa7b2085ec1358c78760 SCRATCH_MNT/test-253/file2.chk
+90
View File
@@ -0,0 +1,90 @@
#! /bin/bash
# FS QA Test No. 254
#
# Punch a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "fpunch"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=5
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "fpunch $((blksz * 2)) $blksz" $testdir/file2 >> $seqres.full
_scratch_remount
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "pwrite -S 0x00 $((blksz * 2)) $blksz" $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 254
Format and mount
Create the original files
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-254/file1
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-254/file2
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-254/file2.chk
CoW and unmount
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-254/file1
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-254/file2
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-254/file2.chk
+90
View File
@@ -0,0 +1,90 @@
#! /bin/bash
# FS QA Test No. 259
#
# fzero a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "fzero"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=5
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "fzero $((blksz * 2)) $blksz" $testdir/file2 >> $seqres.full
_scratch_remount
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "pwrite -S 0x00 $((blksz * 2)) $blksz" $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 259
Format and mount
Create the original files
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-259/file1
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-259/file2
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-259/file2.chk
CoW and unmount
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-259/file1
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-259/file2
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-259/file2.chk
+90
View File
@@ -0,0 +1,90 @@
#! /bin/bash
# FS QA Test No. 261
#
# fcollapse a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "fcollapse"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=5
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "fcollapse $((blksz * 2)) $blksz" $testdir/file2 >> $seqres.full
_scratch_remount
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 2)) $blksz $((blksz * 2))" -c "truncate $((blksz * (nr - 1)))" $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 261
Format and mount
Create the original files
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-261/file1
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-261/file2
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-261/file2.chk
CoW and unmount
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-261/file1
91b31bb8bffa8c3d3374445039287226 SCRATCH_MNT/test-261/file2
91b31bb8bffa8c3d3374445039287226 SCRATCH_MNT/test-261/file2.chk
+93
View File
@@ -0,0 +1,93 @@
#! /bin/bash
# FS QA Test No. 262
#
# finsert a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "finsert"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=4
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 2)) $blksz $((blksz * 2))" -c "finsert $((blksz * 2)) $blksz" $testdir/file2 >> $seqres.full
_scratch_remount
_pwrite_byte 0x62 $blksz $blksz $testdir/file2.chk >> $seqres.full
_pwrite_byte 0x00 $((blksz * 2)) $blksz $testdir/file2.chk >> $seqres.full
_pwrite_byte 0x62 $((blksz * 3)) $blksz $testdir/file2.chk >> $seqres.full
_pwrite_byte 0x61 $((blksz * 4)) $blksz $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 262
Format and mount
Create the original files
Compare files
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-262/file1
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-262/file2
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-262/file2.chk
CoW and unmount
Compare files
c946b71bb69c07daf25470742c967e7c SCRATCH_MNT/test-262/file1
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-262/file2
b9f7a56c2ab90569cb19d8597583c6a6 SCRATCH_MNT/test-262/file2.chk
+90
View File
@@ -0,0 +1,90 @@
#! /bin/bash
# FS QA Test No. 264
#
# fallocate a file at midway through a CoW region.
#
# 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) 2016, 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "falloc"
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=5
filesize=$((blksz * nr))
echo "Create the original files"
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and unmount"
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" -c "falloc $((blksz * 2)) $blksz" $testdir/file2 >> $seqres.full
_scratch_remount
$XFS_IO_PROG -f -c "pwrite -S 0x62 -b $((blksz * 3)) $blksz $((blksz * 3))" $testdir/file2.chk >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 264
Format and mount
Create the original files
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-264/file1
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-264/file2
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-264/file2.chk
CoW and unmount
Compare files
17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-264/file1
3383b9c17e643acd1a9a249cf041e183 SCRATCH_MNT/test-264/file2
3383b9c17e643acd1a9a249cf041e183 SCRATCH_MNT/test-264/file2.chk
+6
View File
@@ -255,12 +255,18 @@
250 auto quick prealloc rw
251 ioctl trim
252 auto quick prealloc rw
253 auto quick clone
254 auto quick clone
255 auto quick prealloc
256 auto quick
257 dir auto quick
258 auto quick
259 auto quick clone
260 auto quick trim
261 auto quick clone
262 auto quick clone
263 rw auto quick
264 auto quick clone
269 auto rw prealloc ioctl enospc stress
270 auto quota rw prealloc ioctl enospc stress
273 auto rw