750b54de769a43b0abcb24f8d2caddb5ded1a391
[xfstests-dev.git] / tests / btrfs / 086
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved.
4 #
5 # FS QA Test No. btrfs/086
6 #
7 # Test cloning a file range with a length of zero into a destination offset
8 # greater than zero.
9 #
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
12 # inode.
13 #
14 # This issue was fixed by the following linux kernel patch:
15 #
16 #   Btrfs: fix inode eviction infinite loop after cloning into it
17 #
18 seq=`basename $0`
19 seqres=$RESULT_DIR/$seq
20 echo "QA output created by $seq"
21
22 tmp=/tmp/$$
23 status=1        # failure is the default!
24 trap "_cleanup; exit \$status" 0 1 2 3 15
25
26 _cleanup()
27 {
28         rm -f $tmp.*
29 }
30
31 # get standard environment, filters and checks
32 . ./common/rc
33 . ./common/filter
34
35 # real QA test starts here
36 _supported_fs btrfs
37 _supported_os Linux
38 _require_scratch
39 _require_cloner
40
41 rm -f $seqres.full
42
43 _scratch_mkfs >>$seqres.full 2>&1
44 _scratch_mount
45
46 touch $SCRATCH_MNT/foo
47 touch $SCRATCH_MNT/bar
48
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)"
58
59 status=0
60 exit