ac2f54f59aa26c627d0002911321ccdbba83491d
[xfstests-dev.git] / tests / generic / 175
1 #! /bin/bash
2 # FS QA Test No. 175
3 #
4 # Try to hit the maximum reference count (eek!)
5 #
6 # This test runs extremely slowly, so it's not automatically run anywhere.
7 #
8 #-----------------------------------------------------------------------
9 # Copyright (c) 2015, Oracle and/or its affiliates.  All Rights Reserved.
10 #
11 # This program is free software; you can redistribute it and/or
12 # modify it under the terms of the GNU General Public License as
13 # published by the Free Software Foundation.
14 #
15 # This program is distributed in the hope that it would be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write the Free Software Foundation,
22 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23 #-----------------------------------------------------------------------
24
25 seq=`basename "$0"`
26 seqres="$RESULT_DIR/$seq"
27 echo "QA output created by $seq"
28
29 here=`pwd`
30 tmp=/tmp/$$
31 status=1    # failure is the default!
32 trap "_cleanup; exit \$status" 0 1 2 3 15
33
34 _cleanup()
35 {
36     cd /
37     rm -rf "$tmp".* "$testdir1"
38 }
39
40 # get standard environment, filters and checks
41 . ./common/rc
42 . ./common/filter
43 . ./common/attr
44 . ./common/reflink
45
46 # real QA test starts here
47 _supported_os Linux
48 _require_scratch_reflink
49 _require_cp_reflink
50
51 rm -f "$seqres.full"
52
53 echo "Format and mount"
54 _scratch_mkfs > "$seqres.full" 2>&1
55 _scratch_mount >> "$seqres.full" 2>&1
56
57 testdir="$SCRATCH_MNT/test-$seq"
58 rm -rf "$testdir"
59 mkdir "$testdir"
60
61 # Well let's hope the maximum reflink count is (less than (ha!)) 2^32...
62
63 echo "Create a one block file"
64 blksz="$(stat -f "$testdir" -c '%S')"
65 _pwrite_byte 0x61 0 $blksz "$testdir/file1" >> "$seqres.full"
66 _pwrite_byte 0x62 0 $blksz "$testdir/file2" >> "$seqres.full"
67 _cp_reflink "$testdir/file1" "$testdir/file2" >> "$seqres.full"
68
69 nr=32
70 fnr=32
71 for i in $(seq 0 $fnr); do
72         echo " ++ Reflink size $i, $(( (2 ** i) * blksz)) bytes" | tee -a "$seqres.full"
73         n=$(( (2 ** i) * blksz))
74         _reflink_range "$testdir/file1" 0 "$testdir/file1" $n $n >> "$seqres.full" || break
75 done
76
77 nrf=$((nr - fnr))
78 echo "Clone $((2 ** nrf)) files"
79 seq 0 $((2 ** nrf)) | while read i; do
80         _cp-reflink "$testdir/file1" "$testdir/file1-$i"
81 done
82
83 echo "Check scratch fs"
84 umount "$SCRATCH_MNT"
85 _check_scratch_fs
86
87 echo "Remove big file and recheck"
88 _scratch_mount >> "$seqres.full" 2>&1
89 umount "$SCRATCH_MNT"
90 _check_scratch_fs
91
92 echo "Remove all files and recheck"
93 _scratch_mount >> "$seqres.full" 2>&1
94 umount "$SCRATCH_MNT"
95
96 # success, all done
97 status=0
98 exit