overlay: run unionmount testsuite test cases
[xfstests-dev.git] / tests / xfs / 057
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2017 Red Hat, Inc. All Rights Reserved.
4 #
5 # FS QA Test No. 057
6 #
7 # Attempt to reproduce log recovery failure by writing corrupt log records over
8 # the last good tail in the log. The tail is force pinned while a workload runs
9 # the head as close as possible behind the tail. Once the head is pinned,
10 # corrupted log records are written to the log and the filesystem shuts down.
11 #
12 # While log recovery should handle the corrupted log records, it has historical
13 # problems dealing with the situation where the corrupted log records may have
14 # overwritten the tail of the previous good record in the log. If this occurs,
15 # log recovery may fail.
16 #
17 # This can be reproduced more reliably under non-default conditions such as with
18 # the smallest supported FSB sizes and/or largest supported log buffer sizes and
19 # counts (logbufs and logbsize mount options).
20 #
21 # Note that this test requires a DEBUG mode kernel.
22 #
23 seq=`basename $0`
24 seqres=$RESULT_DIR/$seq
25 echo "QA output created by $seq"
26
27 here=`pwd`
28 tmp=/tmp/$$
29 status=1        # failure is the default!
30 trap "_cleanup; exit \$status" 0 1 2 3 15
31
32 _cleanup()
33 {
34         cd /
35         rm -f $tmp.*
36         $KILLALL_PROG -9 fsstress > /dev/null 2>&1
37         [ -e /sys/fs/xfs/$sdev/errortag/log_item_pin ] &&
38                 echo 0 > /sys/fs/xfs/$sdev/errortag/log_item_pin
39         wait > /dev/null 2>&1
40 }
41
42 rm -f $seqres.full
43
44 # get standard environment, filters and checks
45 . ./common/rc
46 . ./common/inject
47
48 # real QA test starts here
49
50 # Modify as appropriate.
51 _supported_fs xfs
52 _supported_os Linux
53 _require_xfs_io_error_injection log_item_pin
54 _require_xfs_io_error_injection log_bad_crc
55 _require_scratch
56 _require_command "$KILLALL_PROG" killall
57
58 echo "Silence is golden."
59
60 sdev=$(_short_dev $SCRATCH_DEV)
61
62 # use a small log fs
63 _scratch_mkfs_sized $((1024 * 1024 * 500)) >> $seqres.full 2>&1 ||
64                 _fail "mkfs failed"
65 _scratch_mount
66
67 # populate the fs with some data and cycle the mount to reset the log head/tail
68 $FSSTRESS_PROG -d $SCRATCH_MNT -z -fcreat=1 -p 4 -n 100000 > /dev/null 2>&1
69 _scratch_cycle_mount || _fail "cycle mount failed"
70
71 # Pin the tail and start a file removal workload. File removal tends to
72 # reproduce the corruption more reliably.
73 _scratch_inject_error log_item_pin 1
74
75 rm -rf $SCRATCH_MNT/* > /dev/null 2>&1 &
76 workpid=$!
77
78 # wait for the head to stop pushing forward
79 prevhead=-1
80 head=`cat /sys/fs/xfs/$sdev/log/log_head_lsn`
81 while [ "$head" != "$prevhead" ]; do
82         sleep 5
83         prevhead=$head
84         head=`cat /sys/fs/xfs/$sdev/log/log_head_lsn`
85 done
86
87 # Once the head is pinned behind the tail, enable log record corruption and
88 # unpin the tail. All subsequent log buffer writes end up corrupted on-disk and
89 # result in log I/O errors.
90 _scratch_inject_error log_bad_crc 1
91 _scratch_inject_error log_item_pin 0
92
93 # wait for fs shutdown to kill the workload
94 wait $workpid
95
96 # cycle mount to test log recovery
97 _scratch_cycle_mount
98
99 # success, all done
100 status=0
101 exit