btrfs: add regression test for btrfs send with orphans
authorFilipe Manana <fdmanana@suse.com>
Wed, 13 Aug 2014 01:20:37 +0000 (11:20 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 13 Aug 2014 01:20:37 +0000 (11:20 +1000)
Regression test for a btrfs issue where we create a RO snapshot
to use for a send operation, which fails with a -ESTALE error,
due to the presence of orphan inodes accessible through the
snapshot's commit root but no longer present through the main
root.

This issue is fixed by the following linux kernel btrfs patch:

  Btrfs: update commit root on snapshot creation after orphan cleanup

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
tests/btrfs/058 [new file with mode: 0644]
tests/btrfs/058.out [new file with mode: 0644]
tests/btrfs/group

diff --git a/tests/btrfs/058 b/tests/btrfs/058
new file mode 100644 (file)
index 0000000..4d45686
--- /dev/null
@@ -0,0 +1,84 @@
+#! /bin/bash
+# FS QA Test No. btrfs/058
+#
+# Regression test for a btrfs issue where we create a RO snapshot to use for
+# a send operation which fails with a -ESTALE error, due to the presence of
+# orphan inodes accessible through the snapshot's commit root but no longer
+# present through the main root.
+#
+# This issue is fixed by the following linux kernel btrfs patch:
+#
+#    Btrfs: update commit root on snapshot creation after orphan cleanup
+#
+#-----------------------------------------------------------------------
+# Copyright (C) 2014 SUSE Linux Products GmbH. All Rights Reserved.
+# Author: Filipe Manana <fdmanana@suse.com>
+#
+# 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"
+
+tmp=/tmp/$$
+status=1       # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+       if [ ! -z $XFS_IO_PID ]; then
+               kill $XFS_IO_PID > /dev/null 2>&1
+       fi
+       rm -fr $tmp
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# real QA test starts here
+_supported_fs btrfs
+_supported_os Linux
+_require_scratch
+# Requiring flink command tests for the presence of the -T option used
+# to pass O_TMPFILE to open(2).
+_require_xfs_io_command "flink"
+_need_to_be_root
+
+rm -f $seqres.full
+
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+
+# Create a tmpfile file, write some data to it and leave it open, so that our
+# main subvolume has an orphan inode item.
+$XFS_IO_PROG -T $SCRATCH_MNT >>$seqres.full 2>&1 < <(
+       echo "pwrite 0 65536"
+       read
+) &
+XFS_IO_PID=$!
+
+# Give it some time to the xfs_io process to create the tmpfile.
+sleep 3
+
+# With the tmpfile open, create a RO snapshot and use it for a send operation.
+# The send operation used to fail with -ESTALE due to the presence of the
+# orphan inode.
+_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap
+_run_btrfs_util_prog send $SCRATCH_MNT/mysnap -f /dev/null
+
+status=0
+exit
diff --git a/tests/btrfs/058.out b/tests/btrfs/058.out
new file mode 100644 (file)
index 0000000..7ea8943
--- /dev/null
@@ -0,0 +1 @@
+QA output created by 058
index ebc38c5cbba517cd9038484f19d5f6f4434b4f06..3fa9778aaf836d448c50a79e242f384ead84655b 100644 (file)
@@ -60,3 +60,4 @@
 055 auto quick
 056 auto quick
 057 auto quick
 055 auto quick
 056 auto quick
 057 auto quick
+058 auto quick