From: Qu Wenruo <wqu@suse.com>
To: fstests@vger.kernel.org
Cc: linux-btrfs@vger.kernel.org
Subject: [PATCH] fstests: btrfs/248: test if btrfs receive can handle clone command on inodes with different NODATASUM flags
Date: Wed, 29 Sep 2021 08:44:46 +0800 [thread overview]
Message-ID: <20210929004446.12654-1-wqu@suse.com> (raw)
The planned fix is titled "btrfs-progs: receive: fallback to buffered
copy if clone failed".
The test case itself will create two send streams, and the 2nd stream is
an incremental stream with a clone command in it.
Using different mount options we are able to create a situation where
clone source and destination have different NODATASUM flags, which is
prohibited inside btrfs.
The planned fix will make btrfs receive to fall back to buffered write
to copy the data from the source file.
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
tests/btrfs/248 | 74 +++++++++++++++++++++++++++++++++++++++++++++
tests/btrfs/248.out | 2 ++
2 files changed, 76 insertions(+)
create mode 100755 tests/btrfs/248
create mode 100644 tests/btrfs/248.out
diff --git a/tests/btrfs/248 b/tests/btrfs/248
new file mode 100755
index 00000000..964d3e85
--- /dev/null
+++ b/tests/btrfs/248
@@ -0,0 +1,74 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 SUSE Linux Products GmbH. All Rights Reserved.
+#
+# FS QA Test 248
+#
+# Make sure btrfs receive can still handle clone stream even if the source
+# and destination has different NODATASUM flags
+#
+. ./common/preamble
+_begin_fstest quick send
+
+# Override the default cleanup function.
+_cleanup()
+{
+ cd /
+ rm -r -f $tmp.*
+}
+
+# Import common functions.
+# . ./common/filter
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs btrfs
+_require_scratch
+
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount -o datasum
+
+# Create the initial subvolume with a file
+$BTRFS_UTIL_PROG subvolume create $SCRATCH_MNT/parent >> $seqres.full
+$XFS_IO_PROG -f -c "pwrite 0 1m" $SCRATCH_MNT/parent/source \
+ > /dev/null
+sync
+$BTRFS_UTIL_PROG prop set $SCRATCH_MNT/parent ro true
+$BTRFS_UTIL_PROG send -q $SCRATCH_MNT/parent -f $tmp.parent_stream
+_scratch_unmount
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount -o datasum
+
+# Then create a new subvolume with cloned file from above send stream
+$BTRFS_UTIL_PROG receive -q -f $tmp.parent_stream $SCRATCH_MNT
+$BTRFS_UTIL_PROG subvolume snapshot $SCRATCH_MNT/parent $SCRATCH_MNT/dest \
+ >> $seqres.full
+$XFS_IO_PROG -f -c "reflink $SCRATCH_MNT/parent/source 4k 0 128K" \
+ $SCRATCH_MNT/dest/new > /dev/null
+$BTRFS_UTIL_PROG prop set $SCRATCH_MNT/dest ro true
+$BTRFS_UTIL_PROG send -q $SCRATCH_MNT/dest -p $SCRATCH_MNT/parent \
+ -f $tmp.clone_stream
+
+_scratch_unmount
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount -o datasum
+
+# Now try to receive both streams
+$BTRFS_UTIL_PROG receive -q -f $tmp.parent_stream $SCRATCH_MNT/
+
+# Remount to NODATASUM, so that the 2nd stream will get all its inodes to have
+# NODATASUM flags due to mount option
+_scratch_remount nodatasum
+
+# Patched receive may warn about the clone failure, so here we redirect all
+# output
+$BTRFS_UTIL_PROG receive -q -f $tmp.clone_stream $SCRATCH_MNT/ \
+ >> $seqres.full 2>&1
+
+# We check the destination file's csum to verify if the clone is done properly
+_md5_checksum $SCRATCH_MNT/dest/new
+
+# success, all done
+status=0
+exit
diff --git a/tests/btrfs/248.out b/tests/btrfs/248.out
new file mode 100644
index 00000000..b49cfad7
--- /dev/null
+++ b/tests/btrfs/248.out
@@ -0,0 +1,2 @@
+QA output created by 248
+d48858312a922db7eb86377f638dbc9f
--
2.33.0
next reply other threads:[~2021-09-29 0:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-29 0:44 Qu Wenruo [this message]
2021-09-29 6:45 ` [PATCH] fstests: btrfs/248: test if btrfs receive can handle clone command on inodes with different NODATASUM flags Nikolay Borisov
2021-09-29 6:59 ` Qu Wenruo
2021-09-29 9:14 ` Filipe Manana
2021-09-29 9:23 ` Qu Wenruo
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=20210929004446.12654-1-wqu@suse.com \
--to=wqu@suse.com \
--cc=fstests@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox