2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2014 Red Hat, Inc. All Rights Reserved.
7 # This test implements a data corruption scenario on XFS filesystems with
8 # sub-page sized blocks and unwritten extents. Inode lock contention during
9 # writeback of pages to unwritten extents leads to failure to convert those
10 # extents on I/O completion. This causes data corruption as unwritten extents
11 # are always read back as zeroes.
14 _begin_fstest auto quick rw
16 # Override the default cleanup function.
20 kill -9 $syncpid > /dev/null 2>&1
25 # Import common functions.
28 # real QA test starts here
37 # Modify as appropriate.
40 _require_xfs_io_command "falloc"
41 _require_xfs_io_command "fiemap"
43 _scratch_mkfs >/dev/null 2>&1
46 # run background sync thread
50 for iters in $(seq 1 100)
52 rm -f $SCRATCH_MNT/file
54 # create a delalloc block in each page of the first 64k of the file
55 for pgoff in $(seq 0 0x1000 0xf000); do
56 offset=$((pgoff + 0xc00))
58 -c "pwrite $offset 0x1" \
59 $SCRATCH_MNT/file >> $seqres.full 2>&1
62 # preallocate the first 64k and overwite, writing past 64k to contend
66 -c "falloc 0 0x10000" \
67 -c "pwrite 0 $file_len" \
69 $SCRATCH_MNT/file >> $seqres.full 2>&1
71 # Check for unwritten extents. We should have none before EOF since we
72 # wrote over the entire preallocated region and ran fsync.
73 eof_sector=$(( file_len / 512 ))
74 $XFS_IO_PROG -c 'fiemap -v' $SCRATCH_MNT/file | \
77 awk "{if (\$2 < $eof_sector) {print \$0}}" | \
78 grep -q unwritten && _fail "Unwritten extents found!"
81 echo $iters iterations
86 # clear page cache and dump the file
88 hexdump $SCRATCH_MNT/file