generic/611: Use _getfattr instead of GETFATTR_PROG
[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
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 filter() {
80         test $FSTYP != xfs && sed -e '/No space left on device/d'
81 }
82
83 for i in `seq -w 1 $files`; do
84         (echo -n > $SCRATCH_MNT/$i;
85          echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > $SCRATCH_MNT/$i) 2>&1 | filter
86 done
87
88 # success, all done
89 echo "*** done"
90 status=0