2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2017 Red Hat, Inc. All Rights Reserved.
7 # Test buffer filesystem error recovery during a full overcommited dm-thin device.
9 # When a dm-thin device reaches its full capacity, but the virtual device still
10 # shows available space, the filesystem should be able to handle such cases
11 # failing its operation without locking up.
13 # This test has been created first to cover a XFS problem where it loops
14 # indefinitely in xfsaild due items still in AIL. The buffers containing such
15 # items couldn't be resubmitted because the items were flush locked.
16 # But, once this doesn't require any special filesystem feature to be executed,
17 # this has been integrated as a generic test.
19 # This test might hang the filesystem when ran on an unpatched kernel
22 seqres=$RESULT_DIR/$seq
23 echo "QA output created by $seq"
27 status=1 # failure is the default!
28 trap "_cleanup; exit \$status" 0 1 2 3 15
34 $UMOUNT_PROG $SCRATCH_MNT >>$seqres.full 2>&1
35 $LVM_PROG vgremove -ff $vgname >>$seqres.full 2>&1
36 $LVM_PROG pvremove -ff $SCRATCH_DEV >>$seqres.full 2>&1
39 # get standard environment, filters and checks
42 # real QA test starts here
44 # This tests for filesystem lockup not consistency, so don't check for fs
45 # consistency after test
48 _require_scratch_nocheck
49 _require_dm_target thin-pool
50 _require_dm_target snapshot
51 _require_command $LVM_PROG lvm
52 _require_command "$THIN_CHECK_PROG" thin_check
55 # remove previous $seqres.full before test
66 # Ensure we have enough disk space
67 _scratch_mkfs_sized $((250 * 1024 * 1024)) >>$seqres.full 2>&1
69 # Create a 100MB dm-thin POOL
70 $LVM_PROG pvcreate -f $SCRATCH_DEV >>$seqres.full 2>&1
71 $LVM_PROG vgcreate -f $vgname $SCRATCH_DEV >>$seqres.full 2>&1
73 $LVM_PROG lvcreate --thinpool $poolname --errorwhenfull y \
74 --zero n -L $origpsize \
75 --poolmetadatasize 4M $vgname >>$seqres.full 2>&1
77 # Create a overprovisioned 200MB dm-thin virt. device
78 $LVM_PROG lvcreate --virtualsize $virtsize \
79 -T $vgname/$poolname \
80 -n $lvname >>$seqres.full 2>&1
82 _mkfs_dev /dev/mapper/$vgname-$lvname >>$seqres.full 2>&1
85 # Running the test over the original volume doesn't reproduce the problem
86 # reliably, while, running it over a snapshot, makes the problem 100%
87 # reproducible, so, create a snapshot and run the test over it.
88 $LVM_PROG lvcreate -k n -s $vgname/$lvname \
89 -n $snapname >>$seqres.full 2>&1
91 _mount /dev/mapper/$vgname-$snapname $SCRATCH_MNT
93 # Consume all space available in the volume and freeze to ensure everything
94 # required to make the fs consistent is flushed to disk.
95 $XFS_IO_PROG -f -d -c 'pwrite -b 1m 0 120m' $SCRATCH_MNT/f1 >>$seqres.full 2>&1
97 # In XFS, this freeze will never complete until the dm-thin POOL device is
98 # extended. It is expected, and is only used so xfsaild is triggered to
99 # flush AIL items, other filesystems usually get remounted as read-only during
100 # the above write process.
101 xfs_freeze -f $SCRATCH_MNT >>$seqres.full 2>&1 &
104 # Wait enough so xfsaild can run
107 # Make some extra space available so the freeze above can proceed
108 $LVM_PROG lvextend -L $newpsize $vgname/$poolname >>$seqres.full 2>&1
113 # Different filesystems will handle the lack of real space in different ways,
114 # some will remount the filesystem in read-only mode, some will not. These tests
116 # - The filesystem turns into Read-Only and reject further writes
117 # - The filesystem stays in Read-Write mode, but can be frozen/thawed
118 # without getting stuck.
119 if [ $ret -ne 0 ]; then
120 # freeze failed, filesystem should reject further writes and remount
121 # as readonly. Sometimes the previous write process won't trigger
122 # ro-remount, e.g. on ext3/4, do additional touch here to make sure
123 # filesystems see the metadata I/O error.
124 touch $SCRATCH_MNT/newfile >/dev/null 2>&1
125 ISRO=$(_fs_options /dev/mapper/$vgname-$snapname | grep -w "ro")
126 if [ -n "$ISRO" ]; then
129 echo "Freeze failed and FS isn't Read-Only. Test Failed"
134 # Try to thaw the filesystem, and complete test if if succeed.
135 # NOTE: This will hang on affected XFS filesystems.
136 xfs_freeze -u $SCRATCH_MNT >>$seqres.full 2>&1