2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved.
5 # FS QA Test No. btrfs/086
7 # Test cloning a file range with a length of zero into a destination offset
10 # This made btrfs create an extent state record with a start offset greater than
11 # the end offset, resulting in chaos such as an infinite loop when evicting an
14 # This issue was fixed by the following linux kernel patch:
16 # Btrfs: fix inode eviction infinite loop after cloning into it
19 seqres=$RESULT_DIR/$seq
20 echo "QA output created by $seq"
23 status=1 # failure is the default!
24 trap "_cleanup; exit \$status" 0 1 2 3 15
31 # get standard environment, filters and checks
35 # real QA test starts here
43 _scratch_mkfs >>$seqres.full 2>&1
46 touch $SCRATCH_MNT/foo
47 touch $SCRATCH_MNT/bar
49 # Now attempt to clone foo into bar. Because we pass a length of zero, the
50 # clone ioctl will adjust the length to match the size of the file foo (minus
51 # the source offset which is zero) - because the adjusted length value is
52 # zero, it made btrfs create an extent state record for file bar with a start
53 # offset (64k) greater then its end offset (64k - 1), which is something never
54 # supposed to happen and for example it made inode eviction enter an infinite
55 # loop that dumped a warning trace on each iteration.
56 $CLONER_PROG -s 0 -d 65536 -l 0 $SCRATCH_MNT/foo $SCRATCH_MNT/bar
57 echo "bar file size after clone operation: $(stat -c %s $SCRATCH_MNT/bar)"