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.
7 #-----------------------------------------------------------------------
8 # Copyright 2011 (C) Red Hat, Inc., Lukas Czerner <lczerner@redhat.com>
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.
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.
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 #-----------------------------------------------------------------------
25 seqres=$RESULT_DIR/$seq
26 echo "QA output created by $seq"
31 trap "exit \$status" 0 1 2 3 15
35 # get standard environment, filters and checks
39 # real QA test starts here
46 _scratch_mkfs >/dev/null 2>&1
49 _test_batched_discard $SCRATCH_MNT || _notrun "FITRIM not supported on $SCRATCH_DEV"
51 fssize=$(df -k | grep "$SCRATCH_MNT" | grep "$SCRATCH_DEV" | awk '{print $2}')
53 beyond_eofs=$(_math "$fssize*2048")
54 max_64bit=$(_math "2^64 - 1")
56 # All these tests should return EINVAL
57 # since the start is beyond the end of
60 echo "[+] Start beyond the end of fs (should fail)"
61 out=$($FSTRIM_PROG -o $beyond_eofs $SCRATCH_MNT 2>&1)
62 [ $? -eq 0 ] && status=1
63 echo $out | _filter_scratch
65 echo "[+] Start beyond the end of fs with len set (should fail)"
66 out=$($FSTRIM_PROG -o $beyond_eofs -l1M $SCRATCH_MNT 2>&1)
67 [ $? -eq 0 ] && status=1
68 echo $out | _filter_scratch
70 echo "[+] Start = 2^64-1 (should fail)"
71 out=$($FSTRIM_PROG -o $max_64bit $SCRATCH_MNT 2>&1)
72 [ $? -eq 0 ] && status=1
73 echo $out | _filter_scratch
75 echo "[+] Start = 2^64-1 and len is set (should fail)"
76 out=$($FSTRIM_PROG -o $max_64bit -l1M $SCRATCH_MNT 2>&1)
77 [ $? -eq 0 ] && status=1
78 echo $out | _filter_scratch
81 _scratch_mkfs >/dev/null 2>&1
84 # All these tests should succeed
85 # since the length should be truncated
87 echo "[+] Default length (should succeed)"
88 $FSTRIM_PROG $SCRATCH_MNT
89 [ $? -ne 0 ] && status=1
90 echo "[+] Default length with start set (should succeed)"
91 $FSTRIM_PROG -o10M $SCRATCH_MNT
92 [ $? -ne 0 ] && status=1
93 echo "[+] Length beyond the end of fs (should succeed)"
94 $FSTRIM_PROG -l $beyond_eofs $SCRATCH_MNT
95 [ $? -ne 0 ] && status=1
96 echo "[+] Length beyond the end of fs with start set (should succeed)"
97 $FSTRIM_PROG -o10M -l $beyond_eofs $SCRATCH_MNT
98 [ $? -ne 0 ] && status=1
101 _scratch_mkfs >/dev/null 2>&1
104 # This is a bit fuzzy, but since the file system is fresh
105 # there should be at least (fssize/2) free space to trim.
106 # This is supposed to catch wrong FITRIM argument handling
107 out=$($FSTRIM_PROG -v -o10M $SCRATCH_MNT)
111 if [ $bytes -gt $(_math "$fssize*1024") ]; then
113 echo "After the full fs discard $bytes bytes were discarded"\
114 "however the file system is $(_math "$fssize*1024") bytes long."
117 # Btrfs is special and this test does not apply to it
118 # It is because btrfs does not have not-yet-used parts of the device
119 # mapped and since we got here right after the mkfs, there is not
120 # enough free extents in the root tree.
121 if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
123 echo "After the full fs discard $bytes bytes were discarded"\
124 "however the file system is $(_math "$fssize*1024") bytes long."
127 # Now to catch overflows due to fsblk->allocation group number conversion
128 # This is different for every file system and it also apply just to some of
129 # them. In order to add check specific for file system you're interested in
130 # compute the arguments as you need and make the file system with proper
133 # (2^32-1) + 2 (this is set to overflow 32bit variable by 2)
134 base=$(_math "2^32+1")
140 start=$(_math "$base*$agsize*$bsize")
142 export MKFS_OPTIONS="-F -b $bsize -g $agsize"
147 start=$(_math "$base*$agsize*$bsize")
149 export MKFS_OPTIONS="-f -d agsize=$(_math "$agsize*$bsize") -b size=$bsize"
152 # (2^32-1) * 4096 * 65536 == 32bit max size * block size * ag size
153 start=$(_math "(2^32 - 1) * 4096 * 65536")
159 _scratch_mkfs >/dev/null 2>&1
161 # It should fail since $start is beyond the end of file system
162 $FSTRIM_PROG -o$start -l10M $SCRATCH_MNT &> /dev/null
163 if [ $? -eq 0 ]; then
165 echo "It seems that fs logic handling start"\
170 _scratch_mkfs >/dev/null 2>&1
173 # len should be big enough to cover the whole file system, so if the
174 # number of discarded bytes is smaller than file system size/2 then it
175 # most likely overflowed
176 # Btrfs is special and this test does not apply to it
177 # It is because btrfs does not have not-yet-used parts of the device
178 # mapped and since we got here right after the mkfs, there is not
179 # enough free extents in the root tree.
180 out=$($FSTRIM_PROG -v -l$len $SCRATCH_MNT)
183 if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
185 echo "It seems that fs logic handling len argument overflows"