On Thu, Jun 29, 2023 at 11:26 PM Sweet Tea Dorminy <sweettea-kernel@xxxxxxxxxx> wrote: > > Make sure that we succeed at reflinking encrypted data. > > Test deliberately numbered with a high number so it won't conflict with > tests between now and merge. > --- > tests/btrfs/613 | 62 +++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/613.out | 13 ++++++++++ > 2 files changed, 75 insertions(+) > create mode 100755 tests/btrfs/613 > create mode 100644 tests/btrfs/613.out > > diff --git a/tests/btrfs/613 b/tests/btrfs/613 > new file mode 100755 > index 00000000..93c209c4 > --- /dev/null > +++ b/tests/btrfs/613 > @@ -0,0 +1,62 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (c) 2023 YOUR NAME HERE. All Rights Reserved. Don't forget to fill this... > +# > +# FS QA Test 613 > +# > +# Check if reflinking one encrypted file on btrfs succeeds. > +# > +. ./common/preamble > +_begin_fstest auto encrypt > + > +# Import common functions. > +. ./common/encrypt > +. ./common/filter > +. ./common/reflink > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs btrfs > + > +_require_test > +_require_scratch > +_require_cp_reflink > +_require_scratch_encryption -v 2 > +_require_command "$KEYCTL_PROG" keyctl > + > +_scratch_mkfs_encrypted &>> $seqres.full > +_scratch_mount > + > +dir=$SCRATCH_MNT/dir > +mkdir $dir > +_set_encpolicy $dir $TEST_KEY_IDENTIFIER > +_add_enckey $SCRATCH_MNT "$TEST_RAW_KEY" > +echo "Creating and reflinking a file" > +$XFS_IO_PROG -t -f -c "pwrite 0 33k" $dir/test > /dev/null Why the -t (truncate)? We are creating the file on a brand new fs. > +sync What's this sync for? The reflink code flushes delalloc (for both source and destination inodes, always). Is this really necessary? If so please add a comment explaining why it's needed, otherwise remove it. > +cp --reflink=always $dir/test $dir/test2 > +sync Same here. What is this sync for? Please add a comment explaining why it's needed, otherwise remove it. Thanks. > + > +echo "Can't reflink encrypted and unencrypted" > +cp --reflink=always $dir/test $SCRATCH_MNT/fail |& _filter_scratch > + > +echo "Diffing the file and its copy" > +diff $dir/test $dir/test2 > + > +echo "Verifying the files are reflinked" > +_verify_reflink $dir/test $dir/test2 > + > +echo "Diffing the files after remount" > +_scratch_cycle_mount > +_add_enckey $SCRATCH_MNT "$TEST_RAW_KEY" > +diff $dir/test $dir/test2 > + > +echo "Diffing the files after key remove" > +echo 2 > /proc/sys/vm/drop_caches > +_rm_enckey $SCRATCH_MNT $TEST_KEY_IDENTIFIER > +diff $dir/test $dir/test2 |& _filter_scratch > + > +# success, all done > +status=0 > +exit > diff --git a/tests/btrfs/613.out b/tests/btrfs/613.out > new file mode 100644 > index 00000000..4895d6dd > --- /dev/null > +++ b/tests/btrfs/613.out > @@ -0,0 +1,13 @@ > +QA output created by 613 > +Added encryption key with identifier 69b2f6edeee720cce0577937eb8a6751 > +Creating and reflinking a file > +Can't reflink encrypted and unencrypted > +cp: failed to clone 'SCRATCH_MNT/fail' from 'SCRATCH_MNT/dir/test': Invalid argument > +Diffing the file and its copy > +Verifying the files are reflinked > +Diffing the files after remount > +Added encryption key with identifier 69b2f6edeee720cce0577937eb8a6751 > +Diffing the files after key remove > +Removed encryption key with identifier 69b2f6edeee720cce0577937eb8a6751 > +diff: SCRATCH_MNT/dir/test: No such file or directory > +diff: SCRATCH_MNT/dir/test2: No such file or directory > -- > 2.40.1 >