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