btrfs: test send on subvolume with delalloc after setting it to RO mode
diff mbox series

Message ID 20190415083035.2271-1-fdmanana@kernel.org
State New
Headers show
Series
  • btrfs: test send on subvolume with delalloc after setting it to RO mode
Related show

Commit Message

Filipe Manana April 15, 2019, 8:30 a.m. UTC
From: Filipe Manana <fdmanana@suse.com>

Test that if we have a subvolume/snapshot that is writable, has a file
with unflushed delalloc (buffered writes not yet flushed), turn the
subvolume to readonly mode and then use it for send a operation, the send
stream will contain the delalloc data - that is, no data loss happens.

This currently files on btrfs (data loss) but is fixed by a patch for
the linux kernel titled:

  "Btrfs: send, flush dellaloc in order to avoid data loss"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 tests/btrfs/185     | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/btrfs/185.out | 14 ++++++++++
 tests/btrfs/group   |  1 +
 3 files changed, 88 insertions(+)
 create mode 100755 tests/btrfs/185
 create mode 100644 tests/btrfs/185.out

Patch
diff mbox series

diff --git a/tests/btrfs/185 b/tests/btrfs/185
new file mode 100755
index 00000000..8ccffd1e
--- /dev/null
+++ b/tests/btrfs/185
@@ -0,0 +1,73 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved.
+#
+# FS QA Test No. 185
+#
+# Test that if we have a subvolume/snapshot that is writable, has a file with
+# unflushed delalloc (buffered writes not yet flushed), turn the subvolume to
+# readonly mode and then use it for send a operation, the send stream will
+# contain the delalloc data - that is, no data loss happens.
+#
+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()
+{
+	cd /
+	rm -f $tmp.*
+	rm -fr $send_files_dir
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# real QA test starts here
+_supported_fs btrfs
+_supported_os Linux
+_require_test
+_require_scratch
+_require_btrfs_command "property"
+
+send_files_dir=$TEST_DIR/btrfs-test-$seq
+
+rm -f $seqres.full
+rm -fr $send_files_dir
+mkdir $send_files_dir
+
+_scratch_mkfs >>$seqres.full 2>&1
+_scratch_mount
+
+# Create our test subvolume.
+$BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/sv | _filter_scratch
+
+# Create our test file with some delalloc data.
+$XFS_IO_PROG -f -c "pwrite -S 0xea 0 108K" $SCRATCH_MNT/sv/foo | _filter_xfs_io
+
+# Turn our subvolume to RO so that it can be used for a send operation.
+$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv ro true
+
+# Create the send stream.
+$BTRFS_UTIL_PROG send -f $send_files_dir/sv.send $SCRATCH_MNT/sv 2>&1 \
+    | _filter_scratch
+
+echo "File content in the original filesystem:"
+od -t x1 -A d $SCRATCH_MNT/sv/foo
+
+# Recreate the filesystem and apply the send stream and verify no data was lost.
+_scratch_unmount
+_scratch_mkfs >>$seqres.full 2>&1
+_scratch_mount
+
+$BTRFS_UTIL_PROG receive -f $send_files_dir/sv.send $SCRATCH_MNT
+
+echo "File content in the new filesystem:"
+od -t x1 -A d $SCRATCH_MNT/sv/foo
+
+status=0
+exit
diff --git a/tests/btrfs/185.out b/tests/btrfs/185.out
new file mode 100644
index 00000000..eb432982
--- /dev/null
+++ b/tests/btrfs/185.out
@@ -0,0 +1,14 @@ 
+QA output created by 185
+Create subvolume 'SCRATCH_MNT/sv'
+wrote 110592/110592 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+At subvol SCRATCH_MNT/sv
+File content in the original filesystem:
+0000000 ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea
+*
+0110592
+At subvol sv
+File content in the new filesystem:
+0000000 ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea
+*
+0110592
diff --git a/tests/btrfs/group b/tests/btrfs/group
index c1d215bf..6b81ecce 100644
--- a/tests/btrfs/group
+++ b/tests/btrfs/group
@@ -187,3 +187,4 @@ 
 182 auto quick balance
 183 auto quick clone compress punch
 184 auto quick volume
+185 auto quick send volume