common/fuzzy: try to clear blocking flags first in _scratch_fuzz_modify
[xfstests-dev.git] / tests / generic / 204
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2009 Christoph Hellwig.
4 #
5 # FS QA Test No. 204
6 #
7 # Test out ENOSPC flushing on small filesystems.
8 #
9 seq=`basename $0`
10 seqres=$RESULT_DIR/$seq
11 echo "QA output created by $seq"
12
13 here=`pwd`
14 tmp=/tmp/$$
15 status=1        # failure is the default!
16 trap "_cleanup; exit \$status" 0 1 2 3 15
17
18 _cleanup()
19 {
20         rm -f $tmp.*
21 }
22
23 # get standard environment, filters and checks
24 . ./common/rc
25 . ./common/filter
26
27 # real QA test starts here
28 _supported_fs generic
29 _supported_os Linux
30
31 _require_scratch
32
33 rm -f $seqres.full
34
35 # get the block size first
36 _scratch_mkfs 2> /dev/null | _filter_mkfs 2> $tmp.mkfs > /dev/null
37 . $tmp.mkfs
38
39 # For xfs, we need to handle the different default log sizes that different
40 # versions of mkfs create. All should be valid with a 16MB log, so use that.
41 # And v4/512 v5/1k xfs don't have enough free inodes, set imaxpct=50 at mkfs
42 # time solves this problem.
43 [ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=16m -i maxpct=50"
44
45 SIZE=`expr 115 \* 1024 \* 1024`
46 _scratch_mkfs_sized $SIZE $dbsize 2> /dev/null > $tmp.mkfs.raw
47 cat $tmp.mkfs.raw | _filter_mkfs 2> $tmp.mkfs > /dev/null
48 _scratch_mount
49
50 # Source $tmp.mkfs to get geometry
51 . $tmp.mkfs
52
53 # fix the reserve block pool to a known size so that the enospc calculations
54 # work out correctly. Space usages is based 22500 files and 1024 reserved blocks
55 # on a 4k block size 256 byte inode size filesystem.
56 resv_blks=1024
57 space=$(stat -f -c '%f * %S' $SCRATCH_MNT | $BC_PROG)
58
59 # decrease files for inode size.
60 #       22500 * (256 + 4k) = ~97MB
61 #       files * (isize + bsize) = 97MB
62 #       files = (97920000 / (isize + bsize))
63
64 files=$((space / (isize + dbsize)))
65
66 # Now do it again, but factor in the filename sizes too.
67 # We naively assume 8 bytes for inode number, 1 byte for ftype,
68 # and 1 more byte for namelen, then round up to the nearest 8
69 # bytes.
70
71 namelen="$(echo -n "$files" | wc -c)"
72 direntlen="$(echo "(10 + $namelen + 7) / 8 * 8" | $BC_PROG)"
73
74 files=$((space / (direntlen + isize + dbsize)))
75
76 echo files $files, resvblks $resv_blks >> $seqres.full
77 _scratch_resvblks $resv_blks >> $seqres.full 2>&1
78
79 for i in `seq -w 1 $files`; do
80     echo -n > $SCRATCH_MNT/$i
81     echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > $SCRATCH_MNT/$i
82 done
83
84 # success, all done
85 echo "*** done"
86 status=0