2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2018 Red Hat Inc. All Rights Reserved.
7 # Race test running out of data space with concurrent discard operation on
10 # If a user constructs a test that loops repeatedly over below steps on
11 # dm-thin, block allocation can fail due to discards not having completed
12 # yet (Fixed by a685557 dm thin: handle running out of data space vs
13 # concurrent discard):
14 # 1) fill thin device via filesystem file
18 # And this maybe cause a deadlock when racing a fstrim with a filesystem
19 # (XFS) shutdown. (Fixed by 8c81dd46ef3c Force log to disk before reading
20 # the AGF during a fstrim)
23 seqres=$RESULT_DIR/$seq
24 echo "QA output created by $seq"
28 status=1 # failure is the default!
29 trap "_cleanup; exit \$status" 0 1 2 3 15
38 # get standard environment, filters and checks
43 # remove previous $seqres.full before test
46 # real QA test starts here
48 _require_scratch_nocheck
49 _require_dm_target thin-pool
51 # The unlink below will result in new metadata blocks for btrfs because of CoW,
52 # and since we've filled the thinp device it'll return EIO, which will make
53 # btrfs flip read only, making it fail this test when it just won't work right
54 # for us in the first place.
55 test $FSTYP == "btrfs" && _notrun "btrfs doesn't work that way lol"
57 # Require underlying device support discard
58 _scratch_mkfs >>$seqres.full 2>&1
60 _require_batched_discard $SCRATCH_MNT
63 # Create a thin pool and a *slightly smaller* thin volume, it's helpful
64 # to reproduce the bug
65 BACKING_SIZE=$((128 * 1024 * 1024 / 512)) # 128M
66 VIRTUAL_SIZE=$((BACKING_SIZE + 1024)) # 128M + 1k
67 CLUSTER_SIZE=$((64 * 1024 / 512)) # 64K
69 _dmthin_init $BACKING_SIZE $VIRTUAL_SIZE $CLUSTER_SIZE 0
71 _mkfs_dev $DMTHIN_VOL_DEV
74 # There're two bugs at here, one is dm-thin bug, the other is filesystem
75 # (XFS especially) bug. The dm-thin bug can't handle running out of data
76 # space with concurrent discard well. Then the dm-thin bug cause fs unmount
77 # hang when racing a fstrim with a filesystem shutdown.
79 # If both of two bugs haven't been fixed, below test maybe cause deadlock.
80 # Else if the fs bug has been fixed, but the dm-thin bug hasn't. below test
81 # will cause the test fail (no deadlock).
82 # Else the test will pass.
83 for ((i=0; i<20; i++)); do
84 $XFS_IO_PROG -f -c "pwrite -b 64k 0 256M" \
85 $SCRATCH_MNT/testfile &>/dev/null
86 rm -f $SCRATCH_MNT/testfile
87 $FSTRIM_PROG $SCRATCH_MNT
93 echo "Silence is golden"