generic/204: sync before scrub hits EIO
[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         sync
22 }
23
24 # get standard environment, filters and checks
25 . ./common/rc
26 . ./common/filter
27
28 # real QA test starts here
29 _supported_fs generic
30 _supported_os Linux
31
32 _require_scratch
33
34 rm -f $seqres.full
35
36 # get the block size first
37 _scratch_mkfs 2> /dev/null | _filter_mkfs 2> $tmp.mkfs > /dev/null
38 . $tmp.mkfs
39
40 # For xfs, we need to handle the different default log sizes that different
41 # versions of mkfs create. All should be valid with a 16MB log, so use that.
42 # And v4/512 v5/1k xfs don't have enough free inodes, set imaxpct=50 at mkfs
43 # time solves this problem.
44 [ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=16m -i maxpct=50"
45
46 SIZE=`expr 115 \* 1024 \* 1024`
47 _scratch_mkfs_sized $SIZE $dbsize 2> /dev/null > $tmp.mkfs.raw
48 cat $tmp.mkfs.raw | _filter_mkfs 2> $tmp.mkfs > /dev/null
49 _scratch_mount
50
51 # Source $tmp.mkfs to get geometry
52 . $tmp.mkfs
53
54 # fix the reserve block pool to a known size so that the enospc calculations
55 # work out correctly. Space usages is based 22500 files and 1024 reserved blocks
56 # on a 4k block size 256 byte inode size filesystem.
57 resv_blks=1024
58 space=$(stat -f -c '%f * %S' $SCRATCH_MNT | $BC_PROG)
59
60 # decrease files for inode size.
61 #       22500 * (256 + 4k) = ~97MB
62 #       files * (isize + bsize) = 97MB
63 #       files = (97920000 / (isize + bsize))
64
65 files=$((space / (isize + dbsize)))
66
67 # Now do it again, but factor in the filename sizes too.
68 # We naively assume 8 bytes for inode number, 1 byte for ftype,
69 # and 1 more byte for namelen, then round up to the nearest 8
70 # bytes.
71
72 namelen="$(echo -n "$files" | wc -c)"
73 direntlen="$(echo "(10 + $namelen + 7) / 8 * 8" | $BC_PROG)"
74
75 files=$((space / (direntlen + isize + dbsize)))
76
77 echo files $files, resvblks $resv_blks >> $seqres.full
78 _scratch_resvblks $resv_blks >> $seqres.full 2>&1
79
80 filter() {
81         test $FSTYP != xfs && sed -e '/No space left on device/d'
82 }
83
84 for i in `seq -w 1 $files`; do
85         (echo -n > $SCRATCH_MNT/$i;
86          echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > $SCRATCH_MNT/$i) 2>&1 | filter
87 done
88
89 # success, all done
90 echo "*** done"
91 status=0