reflink: test reflink+cow+enospc all at the same time

Set up an impossibly small filesystem and try to reflink and rewrite a
file on it to see what happens when we ENOSPC.  Basically
generic/16[67] but with a constrained fs size.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Darrick J. Wong
2016-02-04 20:01:41 -08:00
parent c74b4cb7b0
commit 130d7f0d1e
7 changed files with 217 additions and 2 deletions
+5 -1
View File
@@ -69,7 +69,11 @@ _scratch_remount
snappy() { snappy() {
n=0 n=0
while [ ! -e $testdir/finished ]; do while [ ! -e $testdir/finished ]; do
_cp_reflink $testdir/file1 $testdir/snap_$n || break out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
res=$?
echo "$out" | grep -q "No space left" && break
test -n "$out" && echo "$out"
test $res -ne 0 && break
n=$((n + 1)) n=$((n + 1))
done done
} }
+5 -1
View File
@@ -68,7 +68,11 @@ _scratch_remount
snappy() { snappy() {
n=0 n=0
while [ ! -e $testdir/finished ]; do while [ ! -e $testdir/finished ]; do
_cp_reflink $testdir/file1 $testdir/snap_$n || break out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
res=$?
echo "$out" | grep -q "No space left" && break
test -n "$out" && echo "$out"
test $res -ne 0 && break
n=$((n + 1)) n=$((n + 1))
done done
} }
+99
View File
@@ -0,0 +1,99 @@
#! /bin/bash
# FS QA Test No. 333
#
# Test for races or FS corruption when trying to hit ENOSPC while DIO writing
# to a file that's also the source of a reflink operation.
#
#-----------------------------------------------------------------------
# Copyright (c) 2016 Oracle, Inc. 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 7 15
_cleanup()
{
cd /
rm -rf $tmp.*
wait
}
# 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_odirect
echo "Format and mount"
_scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
loops=1024
nr_loops=$((loops - 1))
blksz=65536
echo "Initialize file"
echo > $seqres.full
_pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file1 >> $seqres.full
_scratch_remount
# Snapshot creator...
snappy() {
n=0
while [ ! -e $testdir/finished ]; do
out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
res=$?
echo $out | grep -q "No space left" && break
test -n "$out" && echo $out
test $res -ne 0 && break
n=$((n + 1))
done
touch $testdir/abort
}
echo "Snapshot a file undergoing directio rewrite"
snappy &
seq 1 1000 | while read j; do
seq $nr_loops -1 0 | while read i; do
out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz -d $testdir/file1 2>&1)"
echo $out >> $seqres.full
echo $out | grep -q "No space left" && touch $testdir/abort
echo $out | grep -qi "error" && touch $testdir/abort
test -e $testdir/abort && break
done
test -e $testdir/abort && break
done
touch $testdir/finished
wait
# success, all done
status=0
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 333
Format and mount
Initialize file
Snapshot a file undergoing directio rewrite
+98
View File
@@ -0,0 +1,98 @@
#! /bin/bash
# FS QA Test No. 334
#
# Test for races or FS corruption when trying to hit ENOSPC while writing
# to a file that's also the source of a reflink operation.
#
#-----------------------------------------------------------------------
# Copyright (c) 2016 Oracle, Inc. 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 7 15
_cleanup()
{
cd /
rm -rf $tmp.*
wait
}
# 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
echo "Format and mount"
_scratch_mkfs_sized $((400 * 1048576)) > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
loops=1024
nr_loops=$((loops - 1))
blksz=65536
echo "Initialize file"
echo > $seqres.full
_pwrite_byte 0x61 0 $((loops * blksz)) $testdir/file1 >> $seqres.full
_scratch_remount
# Snapshot creator...
snappy() {
n=0
while [ ! -e $testdir/finished ]; do
out="$(_cp_reflink $testdir/file1 $testdir/snap_$n 2>&1)"
res=$?
echo $out | grep -q "No space left" && break
test -n "$out" && echo $out
test $res -ne 0 && break
n=$((n + 1))
done
touch $testdir/abort
}
echo "Snapshot a file undergoing buffered rewrite"
snappy &
seq 1 1000 | while read j; do
seq $nr_loops -1 0 | while read i; do
out="$(_pwrite_byte 0x63 $((i * blksz)) $blksz $testdir/file1 2>&1)"
echo $out >> $seqres.full
echo $out | grep -q "No space left" && touch $testdir/abort
echo $out | grep -qi "error" && touch $testdir/abort
test -e $testdir/abort && break
done
test -e $testdir/abort && break
done
touch $testdir/finished
wait
# success, all done
status=0
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 334
Format and mount
Initialize file
Snapshot a file undergoing buffered rewrite
+2
View File
@@ -335,3 +335,5 @@
330 auto quick clone 330 auto quick clone
331 auto quick clone 331 auto quick clone
332 auto quick clone 332 auto quick clone
333 auto quick clone
334 auto quick clone