xfs: inject errors at various parts of the deferred op completion
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 17 Jun 2016 16:39:52 +0000 (09:39 -0700)
committerEryu Guan <eguan@redhat.com>
Thu, 7 Jul 2016 04:24:13 +0000 (12:24 +0800)
Use the error injection mechanism to test log recovery of deferred
work.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
34 files changed:
common/inject [new file with mode: 0644]
common/log
common/rc
tests/xfs/312 [new file with mode: 0755]
tests/xfs/312.out [new file with mode: 0644]
tests/xfs/313 [new file with mode: 0755]
tests/xfs/313.out [new file with mode: 0644]
tests/xfs/314 [new file with mode: 0755]
tests/xfs/314.out [new file with mode: 0644]
tests/xfs/315 [new file with mode: 0755]
tests/xfs/315.out [new file with mode: 0644]
tests/xfs/316 [new file with mode: 0755]
tests/xfs/316.out [new file with mode: 0644]
tests/xfs/317 [new file with mode: 0755]
tests/xfs/317.out [new file with mode: 0644]
tests/xfs/318 [new file with mode: 0755]
tests/xfs/318.out [new file with mode: 0644]
tests/xfs/319 [new file with mode: 0755]
tests/xfs/319.out [new file with mode: 0644]
tests/xfs/320 [new file with mode: 0755]
tests/xfs/320.out [new file with mode: 0644]
tests/xfs/321 [new file with mode: 0755]
tests/xfs/321.out [new file with mode: 0644]
tests/xfs/322 [new file with mode: 0755]
tests/xfs/322.out [new file with mode: 0644]
tests/xfs/323 [new file with mode: 0755]
tests/xfs/323.out [new file with mode: 0644]
tests/xfs/324 [new file with mode: 0755]
tests/xfs/324.out [new file with mode: 0644]
tests/xfs/325 [new file with mode: 0755]
tests/xfs/325.out [new file with mode: 0644]
tests/xfs/326 [new file with mode: 0755]
tests/xfs/326.out [new file with mode: 0644]
tests/xfs/group

diff --git a/common/inject b/common/inject
new file mode 100644 (file)
index 0000000..8ecc290
--- /dev/null
@@ -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"
+}
index cb687d2c32898153d240d90a61d3d9166dec6c8a..82899c67ed854c78b0fac450b1132aa4179d11cb 100644 (file)
@@ -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
index 9f76ab289687039b6036436b16d6e818ac0d3961..0c68e4ffb672ad7fbf86e8189cf569e48bce88e4 100644 (file)
--- a/common/rc
+++ b/common/rc
@@ -1096,6 +1096,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/312 b/tests/xfs/312
new file mode 100755 (executable)
index 0000000..0c10441
--- /dev/null
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 312
+#
+# 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 /
+       _scratch_unmount > /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/312.out b/tests/xfs/312.out
new file mode 100644 (file)
index 0000000..7fd5f8a
--- /dev/null
@@ -0,0 +1,18 @@
+QA output created by 312
+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/313 b/tests/xfs/313
new file mode 100755 (executable)
index 0000000..1a2cff2
--- /dev/null
@@ -0,0 +1,102 @@
+#! /bin/bash
+# FS QA Test No. 313
+#
+# 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 /
+       _scratch_unmount > /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/313.out b/tests/xfs/313.out
new file mode 100644 (file)
index 0000000..83a0dc2
--- /dev/null
@@ -0,0 +1,18 @@
+QA output created by 313
+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/314 b/tests/xfs/314
new file mode 100755 (executable)
index 0000000..6b867b8
--- /dev/null
@@ -0,0 +1,106 @@
+#! /bin/bash
+# FS QA Test No. 314
+#
+# 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 /
+       _scratch_unmount > /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/314.out b/tests/xfs/314.out
new file mode 100644 (file)
index 0000000..a0a3cbc
--- /dev/null
@@ -0,0 +1,18 @@
+QA output created by 314
+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/315 b/tests/xfs/315
new file mode 100755 (executable)
index 0000000..62d7fcf
--- /dev/null
@@ -0,0 +1,99 @@
+#! /bin/bash
+# FS QA Test No. 315
+#
+# 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 /
+       _scratch_unmount > /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/315.out b/tests/xfs/315.out
new file mode 100644 (file)
index 0000000..915dbbf
--- /dev/null
@@ -0,0 +1,16 @@
+QA output created by 315
+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/316 b/tests/xfs/316
new file mode 100755 (executable)
index 0000000..68d9466
--- /dev/null
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 316
+#
+# 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 /
+       _scratch_unmount > /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/316.out b/tests/xfs/316.out
new file mode 100644 (file)
index 0000000..b87a1de
--- /dev/null
@@ -0,0 +1,16 @@
+QA output created by 316
+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/317 b/tests/xfs/317
new file mode 100755 (executable)
index 0000000..ac9f3ae
--- /dev/null
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 317
+#
+# 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 /
+       _scratch_unmount > /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/317.out b/tests/xfs/317.out
new file mode 100644 (file)
index 0000000..48400a3
--- /dev/null
@@ -0,0 +1,16 @@
+QA output created by 317
+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/318 b/tests/xfs/318
new file mode 100755 (executable)
index 0000000..9463887
--- /dev/null
@@ -0,0 +1,93 @@
+#! /bin/bash
+# FS QA Test No. 318
+#
+# 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 /
+       _scratch_unmount > /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/318.out b/tests/xfs/318.out
new file mode 100644 (file)
index 0000000..e877ebd
--- /dev/null
@@ -0,0 +1,15 @@
+QA output created by 318
+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/319 b/tests/xfs/319
new file mode 100755 (executable)
index 0000000..bbe21df
--- /dev/null
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 319
+#
+# 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 /
+       _scratch_unmount > /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/319.out b/tests/xfs/319.out
new file mode 100644 (file)
index 0000000..bccde84
--- /dev/null
@@ -0,0 +1,19 @@
+QA output created by 319
+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/320 b/tests/xfs/320
new file mode 100755 (executable)
index 0000000..90a3705
--- /dev/null
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 320
+#
+# 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 /
+       _scratch_unmount > /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/320.out b/tests/xfs/320.out
new file mode 100644 (file)
index 0000000..0aa2812
--- /dev/null
@@ -0,0 +1,18 @@
+QA output created by 320
+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/321 b/tests/xfs/321
new file mode 100755 (executable)
index 0000000..1b9af73
--- /dev/null
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 321
+#
+# 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 /
+       _scratch_unmount > /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/321.out b/tests/xfs/321.out
new file mode 100644 (file)
index 0000000..c0abd52
--- /dev/null
@@ -0,0 +1,17 @@
+QA output created by 321
+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/322 b/tests/xfs/322
new file mode 100755 (executable)
index 0000000..0dddb1f
--- /dev/null
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FS QA Test No. 322
+#
+# 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 /
+       _scratch_unmount > /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/322.out b/tests/xfs/322.out
new file mode 100644 (file)
index 0000000..b3fba5d
--- /dev/null
@@ -0,0 +1,17 @@
+QA output created by 322
+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/323 b/tests/xfs/323
new file mode 100755 (executable)
index 0000000..c124f25
--- /dev/null
@@ -0,0 +1,94 @@
+#! /bin/bash
+# FS QA Test No. 323
+#
+# 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 /
+       _scratch_unmount > /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/323.out b/tests/xfs/323.out
new file mode 100644 (file)
index 0000000..be41b7e
--- /dev/null
@@ -0,0 +1,17 @@
+QA output created by 323
+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/324 b/tests/xfs/324
new file mode 100755 (executable)
index 0000000..9ac6c55
--- /dev/null
@@ -0,0 +1,101 @@
+#! /bin/bash
+# FS QA Test No. 324
+#
+# 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 /
+       _scratch_unmount > /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/324.out b/tests/xfs/324.out
new file mode 100644 (file)
index 0000000..9b09451
--- /dev/null
@@ -0,0 +1,17 @@
+QA output created by 324
+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/325 b/tests/xfs/325
new file mode 100755 (executable)
index 0000000..8a0cce2
--- /dev/null
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 325
+#
+# 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 /
+       _scratch_unmount > /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/325.out b/tests/xfs/325.out
new file mode 100644 (file)
index 0000000..4e25d2b
--- /dev/null
@@ -0,0 +1,15 @@
+QA output created by 325
+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/326 b/tests/xfs/326
new file mode 100755 (executable)
index 0000000..2cd6eda
--- /dev/null
@@ -0,0 +1,109 @@
+#! /bin/bash
+# FS QA Test No. 326
+#
+# 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 /
+       _scratch_unmount > /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/326.out b/tests/xfs/326.out
new file mode 100644 (file)
index 0000000..d76c23a
--- /dev/null
@@ -0,0 +1,18 @@
+QA output created by 326
+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
index 14274da158b51b9642a681cd3c57158038a3eb86..21c2c9355088e55a5aa18eae59439838f15f9e0e 100644 (file)
 309 auto clone
 310 auto clone rmap
 311 auto dangerous quick
+312 auto quick clone
+313 auto quick clone
+314 auto quick clone
+315 auto quick clone
+316 auto quick clone
+317 auto quick rmap
+318 auto quick rw
+319 auto quick clone
+320 auto quick clone
+321 auto quick clone
+322 auto quick clone
+323 auto quick clone
+324 auto quick clone
+325 auto quick clone
+326 auto quick clone