xfstests: make 258 more forgiving of timestamp rounding
[xfstests-dev.git] / 260
1 #!/bin/bash
2 # FS QA Test No. 260
3 #
4 # Purpose of this test is to check FITRIM argument handling to make sure
5 # that the argument processing is right and that it does not overflow.
6 #
7 #-----------------------------------------------------------------------
8 # Copyright 2011 (C) Red Hat, Inc., Lukas Czerner <lczerner@redhat.com>
9 #
10 # This program is free software; you can redistribute it and/or
11 # modify it under the terms of the GNU General Public License as
12 # published by the Free Software Foundation.
13 #
14 # This program is distributed in the hope that it would be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write the Free Software Foundation,
21 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22 #-----------------------------------------------------------------------
23
24 owner=lczerner@redhat.com
25
26 seq=`basename $0`
27 echo "QA output created by $seq"
28
29 here=`pwd`
30 tmp=`mktemp -d`
31 status=0
32 trap "exit \$status" 0 1 2 3 15
33 chpid=0
34 mypid=$$
35
36 # get standard environment, filters and checks
37 . ./common.rc
38 . ./common.filter
39
40 # real QA test starts here
41 _supported_fs generic
42 _supported_os Linux
43 _require_math
44
45 _require_scratch
46 _scratch_mkfs >/dev/null 2>&1
47 _scratch_mount
48
49 FSTRIM="$here/src/fstrim"
50 "$FSTRIM" -l 10M $SCRATCH_MNT &> /dev/null || _notrun "FSTRIM is not supported"
51
52 fssize=$(df -k | grep "$SCRATCH_MNT" | grep "$SCRATCH_DEV"  | awk '{print $2}')
53
54 beyond_eofs=$(_math "$fssize*2048")
55 max_64bit=$(_math "2^64 - 1")
56
57 # All these tests should return EINVAL
58 # since the start is beyond the end of
59 # the file system
60
61 echo "[+] Start beyond the end of fs (should fail)"
62 "$FSTRIM" -s $beyond_eofs $SCRATCH_MNT
63 [ $? -eq 0 ] && status=1
64
65 echo "[+] Start beyond the end of fs with len set (should fail)"
66 "$FSTRIM" -s $beyond_eofs -l1M $SCRATCH_MNT
67 [ $? -eq 0 ] && status=1
68
69 echo "[+] Start = 2^64-1 (should fail)"
70 "$FSTRIM" -s $max_64bit $SCRATCH_MNT
71 [ $? -eq 0 ] && status=1
72
73 echo "[+] Start = 2^64-1 and len is set (should fail)"
74 "$FSTRIM" -s $max_64bit -l1M $SCRATCH_MNT
75 [ $? -eq 0 ] && status=1
76
77 _scratch_unmount
78 _scratch_mkfs >/dev/null 2>&1
79 _scratch_mount
80
81 # All these tests should succeed
82 # since the length should be truncated
83
84 echo "[+] Default length (should succeed)"
85 "$FSTRIM" $SCRATCH_MNT
86 [ $? -ne 0 ] && status=1
87 echo "[+] Default length with start set (should succeed)"
88 "$FSTRIM" -s10M $SCRATCH_MNT
89 [ $? -ne 0 ] && status=1
90 echo "[+] Length beyond the end of fs (should succeed)"
91 "$FSTRIM" -l $beyond_eofs $SCRATCH_MNT
92 [ $? -ne 0 ] && status=1
93 echo "[+] Length beyond the end of fs with start set (should succeed)"
94 "$FSTRIM" -s10M -l $beyond_eofs $SCRATCH_MNT
95 [ $? -ne 0 ] && status=1
96
97 _scratch_unmount
98 _scratch_mkfs >/dev/null 2>&1
99 _scratch_mount
100
101 # This is a bit fuzzy, but since the file system is fresh
102 # there should be at least (fssize/2) free space to trim.
103 # This is supposed to catch wrong FITRIM argument handling
104 out=$("$FSTRIM" -v -s10M $SCRATCH_MNT)
105 bytes=${out%% *}
106
107 if [ $bytes -gt $(_math "$fssize*1024") ]; then
108         status=1
109         echo "After the full fs discard $bytes bytes were discarded"\
110              "however the file system is $(_math "$fssize*1024") bytes long."
111 fi
112
113 # Btrfs is special and this test does not apply to it
114 # It is because btrfs does not have not-yet-used parts of the device
115 # mapped and since we got here right after the mkfs, there is not
116 # enough free extents in the root tree.
117 if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
118         status=1
119         echo "After the full fs discard $bytes bytes were discarded"\
120              "however the file system is $(_math "$fssize*1024") bytes long."
121 fi
122
123 # Now to catch overflows due to fsblk->allocation group number conversion
124 # This is different for every file system and it also apply just to some of
125 # them. In order to add check specific for file system you're interested in
126 # compute the arguments as you need and make the file system with proper
127 # alignment
128
129 # (2^32-1) + 2 (this is set to overflow 32bit variable by 2)
130 base=$(_math "2^32+1")
131
132 case $FSTYP in
133         ext[34])
134                 agsize=32768
135                 bsize=4096
136                 start=$(_math "$base*$agsize*$bsize")
137                 len=$start
138                 export MKFS_OPTIONS="-F -b $bsize -g $agsize"
139                 ;;
140         xfs)
141                 agsize=65538
142                 bsize=4096
143                 start=$(_math "$base*$agsize*$bsize")
144                 len=$start
145                 export MKFS_OPTIONS="-f -d agsize=$(_math "$agsize*$bsize") -b size=$bsize"
146                 ;;
147         *)
148                 # (2^32-1) * 4096 * 65536 == 32bit max size * block size * ag size
149                 start=$(_math "(2^32 - 1) * 4096 * 65536")
150                 len=$start
151                 ;;
152 esac
153
154 _scratch_unmount
155 _scratch_mkfs >/dev/null 2>&1
156 _scratch_mount
157 # It should fail since $start is beyond the end of file system
158 "$FSTRIM" -s$start -l10M $SCRATCH_MNT &> /dev/null
159 if [ $? -eq 0 ]; then
160         status=1
161         echo "It seems that fs logic handling start"\
162              "argument overflows"
163 fi
164
165 _scratch_unmount
166 _scratch_mkfs >/dev/null 2>&1
167 _scratch_mount
168
169 # len should be big enough to cover the whole file system, so if the
170 # number of discarded bytes is smaller than file system size/2 then it
171 # most likely overflowed
172 # Btrfs is special and this test does not apply to it
173 # It is because btrfs does not have not-yet-used parts of the device
174 # mapped and since we got here right after the mkfs, there is not
175 # enough free extents in the root tree.
176 out=$("$FSTRIM" -v -l$len $SCRATCH_MNT)
177 bytes=${out%% *}
178 if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
179         status=1
180         echo "It seems that fs logic handling len argument overflows"
181 fi
182
183 echo "Test done"
184 exit