btrfs/012: check free size of scratch device before copying files
[xfstests-dev.git] / tests / generic / 557
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved.
4 #
5 # FSQA Test No. 557
6 #
7 # Test that if we fsync a file, evict its inode, unlink it and then fsync its
8 # parent directory, after a power failure the file does not exists.
9 #
10 seq=`basename $0`
11 seqres=$RESULT_DIR/$seq
12 echo "QA output created by $seq"
13 tmp=/tmp/$$
14 status=1        # failure is the default!
15 trap "_cleanup; exit \$status" 0 1 2 3 15
16
17 _cleanup()
18 {
19         _cleanup_flakey
20         cd /
21         rm -f $tmp.*
22 }
23
24 # get standard environment, filters and checks
25 . ./common/rc
26 . ./common/filter
27 . ./common/dmflakey
28
29 # real QA test starts here
30 _supported_fs generic
31 _require_scratch
32 _require_dm_target flakey
33
34 rm -f $seqres.full
35
36 _scratch_mkfs >>$seqres.full 2>&1
37 _require_metadata_journaling $SCRATCH_DEV
38 _init_flakey
39 _mount_flakey
40
41 # Create our test directory with one file in it and fsync the file.
42 mkdir $SCRATCH_MNT/dir
43 touch $SCRATCH_MNT/dir/foo
44 $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/dir/foo
45
46 # Keep an open file descriptor on our directory while we evict inodes. We just
47 # want to evict the file's inode, the directory's inode must not be evicted.
48 (
49         cd $SCRATCH_MNT/dir
50         while true; do
51                 :
52         done
53 ) &
54 pid=$!
55 # Wait a bit to give time to background process to chdir to our test directory.
56 sleep 0.1
57
58 # Trigger eviction of the file's inode.
59 echo 2 > /proc/sys/vm/drop_caches
60
61 # Unlink our file and fsync the parent directory. After a power failure we don't
62 # expect to see the file anymore, since we fsync'ed the parent directory.
63 unlink $SCRATCH_MNT/dir/foo
64 $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/dir
65
66 # Kill the background process using our test directory.
67 kill $pid
68 wait $pid
69
70 # Simulate a power failure and then check file foo does not exists anymore.
71 _flakey_drop_and_remount
72
73 [ -f $SCRATCH_MNT/dir/foo ] && echo "File foo still exists"
74
75 _unmount_flakey
76 echo "Silence is golden"
77 status=0
78 exit