All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: david@fromorbit.com
Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com
Subject: [PATCH v2 11/20] xfs: inject errors at various parts of the deferred op completion
Date: Fri, 17 Jun 2016 09:39:52 -0700	[thread overview]
Message-ID: <20160617163952.GE5740@birch.djwong.org> (raw)
In-Reply-To: <146612803133.25024.1931929844195025512.stgit@birch.djwong.org>

Use the error injection mechanism to test log recovery of deferred
work.

v2: fix the tests to _require_scratch_reflink, since most of the
deferred work is done on behalf of reflinky operations.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 common/inject     |   93 +++++++++++++++++++++++++++++++++++++++++++++
 common/log        |   28 ++++++++++++++
 common/rc         |    8 ++++
 tests/xfs/857     |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/857.out |   18 +++++++++
 tests/xfs/858     |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/858.out |   18 +++++++++
 tests/xfs/859     |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/859.out |   18 +++++++++
 tests/xfs/860     |   99 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/860.out |   16 ++++++++
 tests/xfs/861     |  100 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/861.out |   16 ++++++++
 tests/xfs/862     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/862.out |   16 ++++++++
 tests/xfs/863     |   93 +++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/863.out |   15 +++++++
 tests/xfs/864     |   97 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/864.out |   19 +++++++++
 tests/xfs/865     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/865.out |   18 +++++++++
 tests/xfs/866     |   94 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/866.out |   17 ++++++++
 tests/xfs/867     |   97 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/867.out |   17 ++++++++
 tests/xfs/868     |   94 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/868.out |   17 ++++++++
 tests/xfs/869     |  101 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/869.out |   17 ++++++++
 tests/xfs/870     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/870.out |   15 +++++++
 tests/xfs/871     |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/871.out |   18 +++++++++
 tests/xfs/group   |   15 +++++++
 34 files changed, 1878 insertions(+)
 create mode 100644 common/inject
 create mode 100755 tests/xfs/857
 create mode 100644 tests/xfs/857.out
 create mode 100755 tests/xfs/858
 create mode 100644 tests/xfs/858.out
 create mode 100755 tests/xfs/859
 create mode 100644 tests/xfs/859.out
 create mode 100755 tests/xfs/860
 create mode 100644 tests/xfs/860.out
 create mode 100755 tests/xfs/861
 create mode 100644 tests/xfs/861.out
 create mode 100755 tests/xfs/862
 create mode 100644 tests/xfs/862.out
 create mode 100755 tests/xfs/863
 create mode 100644 tests/xfs/863.out
 create mode 100755 tests/xfs/864
 create mode 100644 tests/xfs/864.out
 create mode 100755 tests/xfs/865
 create mode 100644 tests/xfs/865.out
 create mode 100755 tests/xfs/866
 create mode 100644 tests/xfs/866.out
 create mode 100755 tests/xfs/867
 create mode 100644 tests/xfs/867.out
 create mode 100755 tests/xfs/868
 create mode 100644 tests/xfs/868.out
 create mode 100755 tests/xfs/869
 create mode 100644 tests/xfs/869.out
 create mode 100755 tests/xfs/870
 create mode 100644 tests/xfs/870.out
 create mode 100755 tests/xfs/871
 create mode 100644 tests/xfs/871.out

diff --git a/common/inject b/common/inject
new file mode 100644
index 0000000..e666d6d
--- /dev/null
+++ b/common/inject
@@ -0,0 +1,93 @@
+##/bin/bash
+# Routines for injecting errors into filesystems
+#-----------------------------------------------------------------------
+#  Copyright (c) 2016 Oracle.  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; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will 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 to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+#  USA
+#
+#  Contact information: Oracle Corporation, 500 Oracle Parkway,
+#  Redwood Shores, CA 94065, USA, or: http://www.oracle.com/
+#-----------------------------------------------------------------------
+. ./common/log
+
+# Tests whether $FSTYP is one of the filesystems that supports error injection
+_require_error_injection()
+{
+	case "$FSTYP" in
+	"xfs")
+		grep -q 'debug 1' /proc/fs/xfs/stat || \
+			_notrun "XFS error injection requires CONFIG_XFS_DEBUG"
+		;;
+	*)
+		_notrun "Error injection not supported on filesystem type: $FSTYP"
+	esac
+}
+
+# Requires that xfs_io inject command knows about this error type
+_require_xfs_io_error_injection()
+{
+	type="$1"
+	_require_error_injection
+
+	# NOTE: We can't actually test error injection here because xfs
+	# hasn't always range checked the argument to xfs_errortag_add.
+	# We also don't want to trip an error before we're ready to deal
+	# with it.
+
+	$XFS_IO_PROG -x -c 'inject' $TEST_DIR | grep -q "$type" || \
+		_notrun "XFS error injection $type unknown."
+}
+
+# Inject an error into the test fs
+_test_inject_error()
+{
+	type="$1"
+	
+	$XFS_IO_PROG -x -c "inject $type" $TEST_DIR
+}
+
+# Inject an error into the scratch fs
+_scratch_inject_error()
+{
+	type="$1"
+	
+	$XFS_IO_PROG -x -c "inject $type" $SCRATCH_MNT
+}
+
+# Unmount and remount the scratch device, dumping the log
+_scratch_inject_logprint()
+{
+	local opts="$1"
+
+	if test -n "$opts"; then
+		opts="-o $opts"
+	fi
+	_scratch_unmount
+	_scratch_dump_log
+	_scratch_mount "$opts"
+}
+
+# Unmount and remount the test device, dumping the log
+_test_inject_logprint()
+{
+	local opts="$1"
+
+	if test -n "$opts"; then
+		opts="-o $opts"
+	fi
+	_test_unmount
+	_test_dump_log
+	_test_mount "$opts"
+}
diff --git a/common/log b/common/log
index cb687d2..44b9625 100644
--- a/common/log
+++ b/common/log
@@ -228,6 +228,34 @@ _scratch_f2fs_logstate()
     echo $?
 }
 
+_scratch_dump_log()
+{
+    case "$FSTYP" in
+    xfs)
+        _scratch_xfs_logprint
+        ;;
+    f2fs)
+        $DUMP_F2FS_PROG $SCRATCH_DEV
+        ;;
+    *)
+        ;;
+    esac
+}
+
+_test_dump_log()
+{
+    case "$FSTYP" in
+    xfs)
+        _test_xfs_logprint
+        ;;
+    f2fs)
+        $DUMP_F2FS_PROG $TEST_DEV
+        ;;
+    *)
+        ;;
+    esac
+}
+
 _print_logstate()
 {
     case "$FSTYP" in
diff --git a/common/rc b/common/rc
index 1648a8a..1225047 100644
--- a/common/rc
+++ b/common/rc
@@ -982,6 +982,14 @@ _scratch_xfs_logprint()
     $XFS_LOGPRINT_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV
 }
 
+_test_xfs_logprint()
+{
+    TEST_OPTIONS=""
+    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \
+        TEST_OPTIONS="-l$TEST_LOGDEV"
+    $XFS_LOGPRINT_PROG $TEST_OPTIONS $* $TEST_DEV
+}
+
 _scratch_xfs_check()
 {
     SCRATCH_OPTIONS=""
diff --git a/tests/xfs/857 b/tests/xfs/857
new file mode 100755
index 0000000..eff6e4d
--- /dev/null
+++ b/tests/xfs/857
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 857
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/857.out b/tests/xfs/857.out
new file mode 100644
index 0000000..ecc8e04
--- /dev/null
+++ b/tests/xfs/857.out
@@ -0,0 +1,18 @@
+QA output created by 857
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+1e108771fba35e2f2961d1ad23efbff7  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/858 b/tests/xfs/858
new file mode 100755
index 0000000..c13733a
--- /dev/null
+++ b/tests/xfs/858
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 858
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during refcount updates to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/858.out b/tests/xfs/858.out
new file mode 100644
index 0000000..f5302de
--- /dev/null
+++ b/tests/xfs/858.out
@@ -0,0 +1,18 @@
+QA output created by 858
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/859 b/tests/xfs/859
new file mode 100755
index 0000000..96c3390
--- /dev/null
+++ b/tests/xfs/859
@@ -0,0 +1,106 @@
+#! /bin/bash
+# FS QA Test No. 859
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during rmap updates to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/859.out b/tests/xfs/859.out
new file mode 100644
index 0000000..b83e963
--- /dev/null
+++ b/tests/xfs/859.out
@@ -0,0 +1,18 @@
+QA output created by 859
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/860 b/tests/xfs/860
new file mode 100755
index 0000000..cec7509
--- /dev/null
+++ b/tests/xfs/860
@@ -0,0 +1,99 @@
+#! /bin/bash
+# FS QA Test No. 860
+#
+# Reflink a file with a few dozen extents and CoW a few blocks.
+# Inject an error during extent freeing to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=4
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+$XFS_IO_PROG -c "cowextsize $sz" $SCRATCH_MNT
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_pwrite_byte 0x66 $((sz / 2)) $((sz / 2)) $SCRATCH_MNT/file2 >> $seqres.full
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file2 0 $((sz / 2)) >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/860.out b/tests/xfs/860.out
new file mode 100644
index 0000000..0a6d763
--- /dev/null
+++ b/tests/xfs/860.out
@@ -0,0 +1,16 @@
+QA output created by 860
+Format filesystem
+Create files
+Check files
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file1
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file2
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+fe9070b9c9deb97ed53811efda5c4ad5  SCRATCH_MNT/file1
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file2
+Done
diff --git a/tests/xfs/861 b/tests/xfs/861
new file mode 100755
index 0000000..49d90bc
--- /dev/null
+++ b/tests/xfs/861
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 861
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Force XFS into "two refcount updates per transaction" mode.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "refcount_continue_update"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_continue_update"
+
+echo "CoW all the blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $((blks * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/861.out b/tests/xfs/861.out
new file mode 100644
index 0000000..d353526
--- /dev/null
+++ b/tests/xfs/861.out
@@ -0,0 +1,16 @@
+QA output created by 861
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW all the blocks
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/862 b/tests/xfs/862
new file mode 100755
index 0000000..167386c
--- /dev/null
+++ b/tests/xfs/862
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 862
+#
+# Simulate rmap update errors with a file write and a file remove.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_scratch
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+touch $SCRATCH_MNT/file1
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file0 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file0 | _filter_scratch
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "Write files"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file0 | _filter_scratch
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/862.out b/tests/xfs/862.out
new file mode 100644
index 0000000..1f6b47b
--- /dev/null
+++ b/tests/xfs/862.out
@@ -0,0 +1,16 @@
+QA output created by 862
+Format filesystem
+Create files
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file0
+d41d8cd98f00b204e9800998ecf8427e  SCRATCH_MNT/file1
+Inject error
+Write files
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file0
+d41d8cd98f00b204e9800998ecf8427e  SCRATCH_MNT/file1
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/863 b/tests/xfs/863
new file mode 100755
index 0000000..5069245
--- /dev/null
+++ b/tests/xfs/863
@@ -0,0 +1,93 @@
+#! /bin/bash
+# FS QA Test No. 863
+#
+# Simulate free extent errors with a file write and a file remove.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_scratch
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+touch $SCRATCH_MNT/file1
+
+echo "Write files"
+$XFS_IO_PROG -c "pwrite -S 0x67 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 2>&1 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "Remove files"
+rm -rf $SCRATCH_MNT/file1
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 2>&1 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/863.out b/tests/xfs/863.out
new file mode 100644
index 0000000..718691f
--- /dev/null
+++ b/tests/xfs/863.out
@@ -0,0 +1,15 @@
+QA output created by 863
+Format filesystem
+Create files
+Write files
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file1
+Inject error
+Remove files
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+md5sum: SCRATCH_MNT/file1: No such file or directory
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/864 b/tests/xfs/864
new file mode 100755
index 0000000..928bd3b
--- /dev/null
+++ b/tests/xfs/864
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 864
+#
+# Reflink a file.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/864.out b/tests/xfs/864.out
new file mode 100644
index 0000000..cd16235
--- /dev/null
+++ b/tests/xfs/864.out
@@ -0,0 +1,19 @@
+QA output created by 864
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/865 b/tests/xfs/865
new file mode 100755
index 0000000..043ce77
--- /dev/null
+++ b/tests/xfs/865
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 865
+#
+# Reflink a file.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks - 17))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "Try to reflink"
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3 2>&1 | _filter_scratch
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/865.out b/tests/xfs/865.out
new file mode 100644
index 0000000..9a2b04d
--- /dev/null
+++ b/tests/xfs/865.out
@@ -0,0 +1,18 @@
+QA output created by 865
+Format filesystem
+Create files
+Check files
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file1
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file2
+Inject error
+Try to reflink
+cp: failed to clone 'SCRATCH_MNT/file3' from 'SCRATCH_MNT/file1': Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file1
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file2
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/866 b/tests/xfs/866
new file mode 100755
index 0000000..e4137a5
--- /dev/null
+++ b/tests/xfs/866
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 866
+#
+# Reflink a file.
+# Inject an error during refcount update to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+$XFS_IO_PROG -f -c "truncate $sz" $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/866.out b/tests/xfs/866.out
new file mode 100644
index 0000000..f2ca58c
--- /dev/null
+++ b/tests/xfs/866.out
@@ -0,0 +1,17 @@
+QA output created by 866
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+b5cfa9d6c8febd618f91ac2843d50a1c  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/867 b/tests/xfs/867
new file mode 100755
index 0000000..fcae947
--- /dev/null
+++ b/tests/xfs/867
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 867
+#
+# Reflink a file.
+# Inject an error during rmap update to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+$XFS_IO_PROG -f -c "truncate $sz" $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/867.out b/tests/xfs/867.out
new file mode 100644
index 0000000..78a4e5a
--- /dev/null
+++ b/tests/xfs/867.out
@@ -0,0 +1,17 @@
+QA output created by 867
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+b5cfa9d6c8febd618f91ac2843d50a1c  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/868 b/tests/xfs/868
new file mode 100755
index 0000000..b8303de
--- /dev/null
+++ b/tests/xfs/868
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 868
+#
+# Reflink a file.
+# Inject an error during extent free to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/868.out b/tests/xfs/868.out
new file mode 100644
index 0000000..583b1f9
--- /dev/null
+++ b/tests/xfs/868.out
@@ -0,0 +1,17 @@
+QA output created by 868
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/869 b/tests/xfs/869
new file mode 100755
index 0000000..3ab2b0d
--- /dev/null
+++ b/tests/xfs/869
@@ -0,0 +1,101 @@
+#! /bin/bash
+# FS QA Test No. 869
+#
+# Reflink a file with a few dozen extents.
+# Force XFS into "two refcount updates per transaction" mode.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "refcount_continue_update"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_continue_update"
+
+echo "Reflink all the blocks"
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file4
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+md5sum $SCRATCH_MNT/file4 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/869.out b/tests/xfs/869.out
new file mode 100644
index 0000000..1e7822e
--- /dev/null
+++ b/tests/xfs/869.out
@@ -0,0 +1,17 @@
+QA output created by 869
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+Reflink all the blocks
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file4
+Done
diff --git a/tests/xfs/870 b/tests/xfs/870
new file mode 100755
index 0000000..270e4a3
--- /dev/null
+++ b/tests/xfs/870
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 870
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during extent freeing to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=30
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $((blksz * blks)) $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+rm $SCRATCH_MNT/file1
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/870.out b/tests/xfs/870.out
new file mode 100644
index 0000000..49c4e4b
--- /dev/null
+++ b/tests/xfs/870.out
@@ -0,0 +1,15 @@
+QA output created by 870
+Format filesystem
+Create files
+Check files
+d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file1
+d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file2
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+7629bd70d19d7291b448221ac44b26d9  SCRATCH_MNT/file2
+Done
diff --git a/tests/xfs/871 b/tests/xfs/871
new file mode 100755
index 0000000..03fa0ba
--- /dev/null
+++ b/tests/xfs/871
@@ -0,0 +1,109 @@
+#! /bin/bash
+# FS QA Test No. 871
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during refcount updates to test log recovery.  Use
+# cowextsize so that the refcount failure is somewhere in the CoW remap
+# instead of when we're stashing the CoW orphan record.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+$XFS_IO_PROG -c "cowextsize $sz" $SCRATCH_MNT
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) 1" $SCRATCH_MNT/file2 >> $seqres.full
+sync
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/871.out b/tests/xfs/871.out
new file mode 100644
index 0000000..c0aba73
--- /dev/null
+++ b/tests/xfs/871.out
@@ -0,0 +1,18 @@
+QA output created by 871
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+1e108771fba35e2f2961d1ad23efbff7  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/group b/tests/xfs/group
index 1ad37ff..0f94794 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -289,3 +289,18 @@
 854 auto quick clone
 855 auto clone
 856 auto quick clone rmap
+857 auto quick clone
+858 auto quick clone
+859 auto quick clone
+860 auto quick clone
+861 auto quick clone
+862 auto quick rmap
+863 auto quick rw
+864 auto quick clone
+865 auto quick clone
+866 auto quick clone
+867 auto quick clone
+868 auto quick clone
+869 auto quick clone
+870 auto quick clone
+871 auto quick clone

WARNING: multiple messages have this Message-ID (diff)
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: david@fromorbit.com
Cc: fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com
Subject: [PATCH v2 11/20] xfs: inject errors at various parts of the deferred op completion
Date: Fri, 17 Jun 2016 09:39:52 -0700	[thread overview]
Message-ID: <20160617163952.GE5740@birch.djwong.org> (raw)
In-Reply-To: <146612803133.25024.1931929844195025512.stgit@birch.djwong.org>

Use the error injection mechanism to test log recovery of deferred
work.

v2: fix the tests to _require_scratch_reflink, since most of the
deferred work is done on behalf of reflinky operations.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 common/inject     |   93 +++++++++++++++++++++++++++++++++++++++++++++
 common/log        |   28 ++++++++++++++
 common/rc         |    8 ++++
 tests/xfs/857     |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/857.out |   18 +++++++++
 tests/xfs/858     |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/858.out |   18 +++++++++
 tests/xfs/859     |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/859.out |   18 +++++++++
 tests/xfs/860     |   99 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/860.out |   16 ++++++++
 tests/xfs/861     |  100 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/861.out |   16 ++++++++
 tests/xfs/862     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/862.out |   16 ++++++++
 tests/xfs/863     |   93 +++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/863.out |   15 +++++++
 tests/xfs/864     |   97 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/864.out |   19 +++++++++
 tests/xfs/865     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/865.out |   18 +++++++++
 tests/xfs/866     |   94 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/866.out |   17 ++++++++
 tests/xfs/867     |   97 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/867.out |   17 ++++++++
 tests/xfs/868     |   94 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/868.out |   17 ++++++++
 tests/xfs/869     |  101 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/869.out |   17 ++++++++
 tests/xfs/870     |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/870.out |   15 +++++++
 tests/xfs/871     |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/871.out |   18 +++++++++
 tests/xfs/group   |   15 +++++++
 34 files changed, 1878 insertions(+)
 create mode 100644 common/inject
 create mode 100755 tests/xfs/857
 create mode 100644 tests/xfs/857.out
 create mode 100755 tests/xfs/858
 create mode 100644 tests/xfs/858.out
 create mode 100755 tests/xfs/859
 create mode 100644 tests/xfs/859.out
 create mode 100755 tests/xfs/860
 create mode 100644 tests/xfs/860.out
 create mode 100755 tests/xfs/861
 create mode 100644 tests/xfs/861.out
 create mode 100755 tests/xfs/862
 create mode 100644 tests/xfs/862.out
 create mode 100755 tests/xfs/863
 create mode 100644 tests/xfs/863.out
 create mode 100755 tests/xfs/864
 create mode 100644 tests/xfs/864.out
 create mode 100755 tests/xfs/865
 create mode 100644 tests/xfs/865.out
 create mode 100755 tests/xfs/866
 create mode 100644 tests/xfs/866.out
 create mode 100755 tests/xfs/867
 create mode 100644 tests/xfs/867.out
 create mode 100755 tests/xfs/868
 create mode 100644 tests/xfs/868.out
 create mode 100755 tests/xfs/869
 create mode 100644 tests/xfs/869.out
 create mode 100755 tests/xfs/870
 create mode 100644 tests/xfs/870.out
 create mode 100755 tests/xfs/871
 create mode 100644 tests/xfs/871.out

diff --git a/common/inject b/common/inject
new file mode 100644
index 0000000..e666d6d
--- /dev/null
+++ b/common/inject
@@ -0,0 +1,93 @@
+##/bin/bash
+# Routines for injecting errors into filesystems
+#-----------------------------------------------------------------------
+#  Copyright (c) 2016 Oracle.  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; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will 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 to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+#  USA
+#
+#  Contact information: Oracle Corporation, 500 Oracle Parkway,
+#  Redwood Shores, CA 94065, USA, or: http://www.oracle.com/
+#-----------------------------------------------------------------------
+. ./common/log
+
+# Tests whether $FSTYP is one of the filesystems that supports error injection
+_require_error_injection()
+{
+	case "$FSTYP" in
+	"xfs")
+		grep -q 'debug 1' /proc/fs/xfs/stat || \
+			_notrun "XFS error injection requires CONFIG_XFS_DEBUG"
+		;;
+	*)
+		_notrun "Error injection not supported on filesystem type: $FSTYP"
+	esac
+}
+
+# Requires that xfs_io inject command knows about this error type
+_require_xfs_io_error_injection()
+{
+	type="$1"
+	_require_error_injection
+
+	# NOTE: We can't actually test error injection here because xfs
+	# hasn't always range checked the argument to xfs_errortag_add.
+	# We also don't want to trip an error before we're ready to deal
+	# with it.
+
+	$XFS_IO_PROG -x -c 'inject' $TEST_DIR | grep -q "$type" || \
+		_notrun "XFS error injection $type unknown."
+}
+
+# Inject an error into the test fs
+_test_inject_error()
+{
+	type="$1"
+	
+	$XFS_IO_PROG -x -c "inject $type" $TEST_DIR
+}
+
+# Inject an error into the scratch fs
+_scratch_inject_error()
+{
+	type="$1"
+	
+	$XFS_IO_PROG -x -c "inject $type" $SCRATCH_MNT
+}
+
+# Unmount and remount the scratch device, dumping the log
+_scratch_inject_logprint()
+{
+	local opts="$1"
+
+	if test -n "$opts"; then
+		opts="-o $opts"
+	fi
+	_scratch_unmount
+	_scratch_dump_log
+	_scratch_mount "$opts"
+}
+
+# Unmount and remount the test device, dumping the log
+_test_inject_logprint()
+{
+	local opts="$1"
+
+	if test -n "$opts"; then
+		opts="-o $opts"
+	fi
+	_test_unmount
+	_test_dump_log
+	_test_mount "$opts"
+}
diff --git a/common/log b/common/log
index cb687d2..44b9625 100644
--- a/common/log
+++ b/common/log
@@ -228,6 +228,34 @@ _scratch_f2fs_logstate()
     echo $?
 }
 
+_scratch_dump_log()
+{
+    case "$FSTYP" in
+    xfs)
+        _scratch_xfs_logprint
+        ;;
+    f2fs)
+        $DUMP_F2FS_PROG $SCRATCH_DEV
+        ;;
+    *)
+        ;;
+    esac
+}
+
+_test_dump_log()
+{
+    case "$FSTYP" in
+    xfs)
+        _test_xfs_logprint
+        ;;
+    f2fs)
+        $DUMP_F2FS_PROG $TEST_DEV
+        ;;
+    *)
+        ;;
+    esac
+}
+
 _print_logstate()
 {
     case "$FSTYP" in
diff --git a/common/rc b/common/rc
index 1648a8a..1225047 100644
--- a/common/rc
+++ b/common/rc
@@ -982,6 +982,14 @@ _scratch_xfs_logprint()
     $XFS_LOGPRINT_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV
 }
 
+_test_xfs_logprint()
+{
+    TEST_OPTIONS=""
+    [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \
+        TEST_OPTIONS="-l$TEST_LOGDEV"
+    $XFS_LOGPRINT_PROG $TEST_OPTIONS $* $TEST_DEV
+}
+
 _scratch_xfs_check()
 {
     SCRATCH_OPTIONS=""
diff --git a/tests/xfs/857 b/tests/xfs/857
new file mode 100755
index 0000000..eff6e4d
--- /dev/null
+++ b/tests/xfs/857
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 857
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/857.out b/tests/xfs/857.out
new file mode 100644
index 0000000..ecc8e04
--- /dev/null
+++ b/tests/xfs/857.out
@@ -0,0 +1,18 @@
+QA output created by 857
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+1e108771fba35e2f2961d1ad23efbff7  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/858 b/tests/xfs/858
new file mode 100755
index 0000000..c13733a
--- /dev/null
+++ b/tests/xfs/858
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 858
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during refcount updates to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/858.out b/tests/xfs/858.out
new file mode 100644
index 0000000..f5302de
--- /dev/null
+++ b/tests/xfs/858.out
@@ -0,0 +1,18 @@
+QA output created by 858
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/859 b/tests/xfs/859
new file mode 100755
index 0000000..96c3390
--- /dev/null
+++ b/tests/xfs/859
@@ -0,0 +1,106 @@
+#! /bin/bash
+# FS QA Test No. 859
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during rmap updates to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/859.out b/tests/xfs/859.out
new file mode 100644
index 0000000..b83e963
--- /dev/null
+++ b/tests/xfs/859.out
@@ -0,0 +1,18 @@
+QA output created by 859
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/860 b/tests/xfs/860
new file mode 100755
index 0000000..cec7509
--- /dev/null
+++ b/tests/xfs/860
@@ -0,0 +1,99 @@
+#! /bin/bash
+# FS QA Test No. 860
+#
+# Reflink a file with a few dozen extents and CoW a few blocks.
+# Inject an error during extent freeing to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=4
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+$XFS_IO_PROG -c "cowextsize $sz" $SCRATCH_MNT
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_pwrite_byte 0x66 $((sz / 2)) $((sz / 2)) $SCRATCH_MNT/file2 >> $seqres.full
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file2 0 $((sz / 2)) >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/860.out b/tests/xfs/860.out
new file mode 100644
index 0000000..0a6d763
--- /dev/null
+++ b/tests/xfs/860.out
@@ -0,0 +1,16 @@
+QA output created by 860
+Format filesystem
+Create files
+Check files
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file1
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file2
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+fe9070b9c9deb97ed53811efda5c4ad5  SCRATCH_MNT/file1
+cf41e243bf211225660f3fabe6db9eb6  SCRATCH_MNT/file2
+Done
diff --git a/tests/xfs/861 b/tests/xfs/861
new file mode 100755
index 0000000..49d90bc
--- /dev/null
+++ b/tests/xfs/861
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 861
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Force XFS into "two refcount updates per transaction" mode.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "refcount_continue_update"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_continue_update"
+
+echo "CoW all the blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $((blks * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/861.out b/tests/xfs/861.out
new file mode 100644
index 0000000..d353526
--- /dev/null
+++ b/tests/xfs/861.out
@@ -0,0 +1,16 @@
+QA output created by 861
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW all the blocks
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/862 b/tests/xfs/862
new file mode 100755
index 0000000..167386c
--- /dev/null
+++ b/tests/xfs/862
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 862
+#
+# Simulate rmap update errors with a file write and a file remove.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_scratch
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+touch $SCRATCH_MNT/file1
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file0 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file0 | _filter_scratch
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "Write files"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file0 | _filter_scratch
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/862.out b/tests/xfs/862.out
new file mode 100644
index 0000000..1f6b47b
--- /dev/null
+++ b/tests/xfs/862.out
@@ -0,0 +1,16 @@
+QA output created by 862
+Format filesystem
+Create files
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file0
+d41d8cd98f00b204e9800998ecf8427e  SCRATCH_MNT/file1
+Inject error
+Write files
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file0
+d41d8cd98f00b204e9800998ecf8427e  SCRATCH_MNT/file1
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/863 b/tests/xfs/863
new file mode 100755
index 0000000..5069245
--- /dev/null
+++ b/tests/xfs/863
@@ -0,0 +1,93 @@
+#! /bin/bash
+# FS QA Test No. 863
+#
+# Simulate free extent errors with a file write and a file remove.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_scratch
+_require_error_injection
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+touch $SCRATCH_MNT/file1
+
+echo "Write files"
+$XFS_IO_PROG -c "pwrite -S 0x67 0 $sz" $SCRATCH_MNT/file1 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 2>&1 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "Remove files"
+rm -rf $SCRATCH_MNT/file1
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 2>&1 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/863.out b/tests/xfs/863.out
new file mode 100644
index 0000000..718691f
--- /dev/null
+++ b/tests/xfs/863.out
@@ -0,0 +1,15 @@
+QA output created by 863
+Format filesystem
+Create files
+Write files
+Check files
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file1
+Inject error
+Remove files
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+md5sum: SCRATCH_MNT/file1: No such file or directory
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/864 b/tests/xfs/864
new file mode 100755
index 0000000..928bd3b
--- /dev/null
+++ b/tests/xfs/864
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 864
+#
+# Reflink a file.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/864.out b/tests/xfs/864.out
new file mode 100644
index 0000000..cd16235
--- /dev/null
+++ b/tests/xfs/864.out
@@ -0,0 +1,19 @@
+QA output created by 864
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/865 b/tests/xfs/865
new file mode 100755
index 0000000..043ce77
--- /dev/null
+++ b/tests/xfs/865
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 865
+#
+# Reflink a file.
+# Inject an error during block remap to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "bmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks - 17))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "bmap_finish_one"
+
+echo "Try to reflink"
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3 2>&1 | _filter_scratch
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/865.out b/tests/xfs/865.out
new file mode 100644
index 0000000..9a2b04d
--- /dev/null
+++ b/tests/xfs/865.out
@@ -0,0 +1,18 @@
+QA output created by 865
+Format filesystem
+Create files
+Check files
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file1
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file2
+Inject error
+Try to reflink
+cp: failed to clone 'SCRATCH_MNT/file3' from 'SCRATCH_MNT/file1': Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file1
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file2
+a98e7df2a7a456009a493e47411c58d1  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/866 b/tests/xfs/866
new file mode 100755
index 0000000..e4137a5
--- /dev/null
+++ b/tests/xfs/866
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 866
+#
+# Reflink a file.
+# Inject an error during refcount update to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+$XFS_IO_PROG -f -c "truncate $sz" $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/866.out b/tests/xfs/866.out
new file mode 100644
index 0000000..f2ca58c
--- /dev/null
+++ b/tests/xfs/866.out
@@ -0,0 +1,17 @@
+QA output created by 866
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+b5cfa9d6c8febd618f91ac2843d50a1c  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/867 b/tests/xfs/867
new file mode 100755
index 0000000..fcae947
--- /dev/null
+++ b/tests/xfs/867
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 867
+#
+# Reflink a file.
+# Inject an error during rmap update to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "rmap_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+is_rmap=$(xfs_info $SCRATCH_MNT | grep -c "rmapbt=1")
+test $is_rmap -gt 0 || _notrun "rmap not supported on scratch fs"
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+$XFS_IO_PROG -f -c "truncate $sz" $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "rmap_finish_one"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/867.out b/tests/xfs/867.out
new file mode 100644
index 0000000..78a4e5a
--- /dev/null
+++ b/tests/xfs/867.out
@@ -0,0 +1,17 @@
+QA output created by 867
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+b5cfa9d6c8febd618f91ac2843d50a1c  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/868 b/tests/xfs/868
new file mode 100755
index 0000000..b8303de
--- /dev/null
+++ b/tests/xfs/868
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 868
+#
+# Reflink a file.
+# Inject an error during extent free to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_pwrite_byte 0x67 0 $sz $SCRATCH_MNT/file3 >> $seqres.full
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "Try to reflink"
+_reflink_range $SCRATCH_MNT/file1 0 $SCRATCH_MNT/file3 0 $sz >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/868.out b/tests/xfs/868.out
new file mode 100644
index 0000000..583b1f9
--- /dev/null
+++ b/tests/xfs/868.out
@@ -0,0 +1,17 @@
+QA output created by 868
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+4155b81ac6d45c0182fa2bc03960f230  SCRATCH_MNT/file3
+Inject error
+Try to reflink
+XFS_IOC_CLONE_RANGE: Input/output error
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file3
+FS should be online, touch should succeed
+Done
diff --git a/tests/xfs/869 b/tests/xfs/869
new file mode 100755
index 0000000..3ab2b0d
--- /dev/null
+++ b/tests/xfs/869
@@ -0,0 +1,101 @@
+#! /bin/bash
+# FS QA Test No. 869
+#
+# Reflink a file with a few dozen extents.
+# Force XFS into "two refcount updates per transaction" mode.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "refcount_continue_update"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "refcount_continue_update"
+
+echo "Reflink all the blocks"
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file4
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+md5sum $SCRATCH_MNT/file4 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/869.out b/tests/xfs/869.out
new file mode 100644
index 0000000..1e7822e
--- /dev/null
+++ b/tests/xfs/869.out
@@ -0,0 +1,17 @@
+QA output created by 869
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+Reflink all the blocks
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file4
+Done
diff --git a/tests/xfs/870 b/tests/xfs/870
new file mode 100755
index 0000000..270e4a3
--- /dev/null
+++ b/tests/xfs/870
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 870
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during extent freeing to test log recovery.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_error_injection
+_require_xfs_io_error_injection "free_extent"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=30
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+echo "Create files"
+_pwrite_byte 0x66 0 $((blksz * blks)) $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Inject error"
+_scratch_inject_error "free_extent"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+rm $SCRATCH_MNT/file1
+sync
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/870.out b/tests/xfs/870.out
new file mode 100644
index 0000000..49c4e4b
--- /dev/null
+++ b/tests/xfs/870.out
@@ -0,0 +1,15 @@
+QA output created by 870
+Format filesystem
+Create files
+Check files
+d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file1
+d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file2
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+7629bd70d19d7291b448221ac44b26d9  SCRATCH_MNT/file2
+Done
diff --git a/tests/xfs/871 b/tests/xfs/871
new file mode 100755
index 0000000..03fa0ba
--- /dev/null
+++ b/tests/xfs/871
@@ -0,0 +1,109 @@
+#! /bin/bash
+# FS QA Test No. 871
+#
+# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
+# Inject an error during refcount updates to test log recovery.  Use
+# cowextsize so that the refcount failure is somewhere in the CoW remap
+# instead of when we're stashing the CoW orphan record.
+#
+#-----------------------------------------------------------------------
+# 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 /
+    umount $SCRATCH_MNT > /dev/null 2>&1
+    rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/reflink
+. ./common/inject
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_cp_reflink
+_require_scratch_reflink
+_require_xfs_io_error_injection "refcount_finish_one"
+
+rm -f $seqres.full
+
+blksz=65536
+blks=64
+sz=$((blksz * blks))
+echo "Format filesystem"
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount >> $seqres.full
+
+$XFS_IO_PROG -c "cowextsize $sz" $SCRATCH_MNT
+
+echo "Create files"
+_pwrite_byte 0x66 0 $sz $SCRATCH_MNT/file1 >> $seqres.full
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
+_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file3
+
+# Punch holes in file3
+seq 1 2 $blks | while read off; do
+	$XFS_IO_PROG -c "fpunch $((off * blksz)) $blksz" $SCRATCH_MNT/file3 >> $seqres.full
+done
+sync
+
+echo "Check files"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) 1" $SCRATCH_MNT/file2 >> $seqres.full
+sync
+
+echo "Inject error"
+_scratch_inject_error "refcount_finish_one"
+
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 -b $sz $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
+echo "FS should be shut down, touch will fail"
+touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
+
+echo "Remount to replay log"
+_scratch_inject_logprint >> $seqres.full
+
+echo "FS should be online, touch should succeed"
+touch $SCRATCH_MNT/goodfs
+
+echo "Check files again"
+md5sum $SCRATCH_MNT/file1 | _filter_scratch
+md5sum $SCRATCH_MNT/file2 | _filter_scratch
+md5sum $SCRATCH_MNT/file3 | _filter_scratch
+
+echo "Done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/871.out b/tests/xfs/871.out
new file mode 100644
index 0000000..c0aba73
--- /dev/null
+++ b/tests/xfs/871.out
@@ -0,0 +1,18 @@
+QA output created by 871
+Format filesystem
+Create files
+Check files
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Inject error
+CoW a few blocks
+FS should be shut down, touch will fail
+touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
+Remount to replay log
+FS should be online, touch should succeed
+Check files again
+2a4f043bf9730a9e8882c9264b9797b3  SCRATCH_MNT/file1
+1e108771fba35e2f2961d1ad23efbff7  SCRATCH_MNT/file2
+153498e22f8ff52d7f60b466a5e65285  SCRATCH_MNT/file3
+Done
diff --git a/tests/xfs/group b/tests/xfs/group
index 1ad37ff..0f94794 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -289,3 +289,18 @@
 854 auto quick clone
 855 auto clone
 856 auto quick clone rmap
+857 auto quick clone
+858 auto quick clone
+859 auto quick clone
+860 auto quick clone
+861 auto quick clone
+862 auto quick rmap
+863 auto quick rw
+864 auto quick clone
+865 auto quick clone
+866 auto quick clone
+867 auto quick clone
+868 auto quick clone
+869 auto quick clone
+870 auto quick clone
+871 auto quick clone

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2016-06-17 16:40 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-17  1:46 [PATCH v6 00/20] xfstests: minor fixes for the reflink/dedupe tests Darrick J. Wong
2016-06-17  1:46 ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 01/20] xfs/104: don't enospc when ag metadata overhead grows Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 02/20] tests: don't put loop control files on the scratch mount Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 03/20] xfs: test copy-on-write leftover recovery Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 04/20] xfs: test per-ag allocation accounting during truncate-caused refcountbt expansion Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 05/20] reflink: test interaction with swap files Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 06/20] xfs: test rmap behavior when multiple bmbt records map to a single rmapbt record Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 07/20] reflink: test changing sharers of a block while keeping refcount the same Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 08/20] xfs/122: don't break on old xfsprogs Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:46 ` [PATCH 09/20] xfs/122: fix test output to reflect latest xfsprogs Darrick J. Wong
2016-06-17  1:46   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 10/20] xfs/122: list the new log redo items Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 11/20] xfs: inject errors at various parts of the deferred op completion Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17 16:39   ` Darrick J. Wong [this message]
2016-06-17 16:39     ` [PATCH v2 " Darrick J. Wong
2016-06-17  1:47 ` [PATCH 12/20] xfs/235: fix logic errors when checking rmap usage after failures Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 13/20] xfs/229: require 3GB of space Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 14/20] xfs: test clearing reflink inode flag Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17 16:40   ` [PATCH v2 " Darrick J. Wong
2016-06-17 16:40     ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 15/20] xfstests: fix unreferenced variables in generic/186 and generic/187 Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 16/20] reflink: test cross-mountpoint reflink and dedupe Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-07-04  6:51   ` Eryu Guan
2016-07-04  6:51     ` Eryu Guan
2016-07-04 19:11     ` Darrick J. Wong
2016-07-04 19:11       ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 17/20] generic/204: increase log size for rmap/reflink Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:47 ` [PATCH 18/20] xfs/128: use $XFS_FSR_PROG instead of xfs_fsr directly Darrick J. Wong
2016-06-17  1:47   ` Darrick J. Wong
2016-06-17  1:48 ` [PATCH 19/20] xfs: run xfs_repair at the end of each test Darrick J. Wong
2016-06-17  1:48   ` Darrick J. Wong
2016-07-05  3:56   ` Eryu Guan
2016-07-05  3:56     ` Eryu Guan
2016-07-05  4:11     ` Darrick J. Wong
2016-07-05  4:11       ` Darrick J. Wong
2016-07-06 23:13       ` Dave Chinner
2016-07-06 23:13         ` Dave Chinner
2016-07-06 23:49         ` Darrick J. Wong
2016-07-06 23:49           ` Darrick J. Wong
2016-06-17  1:48 ` [PATCH 20/20] xfs: scrub fs (if still mounted) at the end of the test Darrick J. Wong
2016-06-17  1:48   ` Darrick J. Wong
2016-06-29  3:36 ` [PATCH 21/20] xfs/128: cycle_mount the scratch device, not the test device Darrick J. Wong
2016-06-29  3:36   ` Darrick J. Wong
2016-07-05  4:31 ` [PATCH v6 00/20] xfstests: minor fixes for the reflink/dedupe tests Eryu Guan
2016-07-05  4:31   ` Eryu Guan
2016-07-06 22:44   ` Darrick J. Wong
2016-07-06 22:44     ` Darrick J. Wong
2016-07-13  5:28   ` Darrick J. Wong
2016-07-13  5:28     ` Darrick J. Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160617163952.GE5740@birch.djwong.org \
    --to=darrick.wong@oracle.com \
    --cc=david@fromorbit.com \
    --cc=fstests@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.