mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
8c4d2b38fc
A large number of xfs-specific tests rely on specific behaviors of the data device allocator, such as fragmenting free space, carefully curated inode and free space counts, or features like filestreams that only exist on the data device. These tests fail horribly if the test runner specified rtinherit=1 on the mkfs command line, so skip them all. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Zorro Lang <zlang@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
109 lines
3.1 KiB
Bash
Executable File
109 lines
3.1 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. 306
|
|
#
|
|
# Regression test for an XFS multi-block buffer logging bug.
|
|
#
|
|
# The XFS bug results in a panic when a non-contiguous multi-block buffer is
|
|
# mapped and logged in a particular manner, such that only regions beyond the
|
|
# first fsb-sized mapping are logged. The crash occurs asynchronous to
|
|
# transaction submission, when the associated buffer log item is pushed from the
|
|
# CIL (i.e., when the log is subsequently flushed).
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
|
|
# Modify as appropriate.
|
|
_supported_fs xfs
|
|
_supported_os Linux
|
|
|
|
_require_scratch_nocheck # check complains about single AG fs
|
|
_require_no_rtinherit
|
|
_require_xfs_io_command "fpunch"
|
|
_require_command $UUIDGEN_PROG uuidgen
|
|
|
|
rm -f $seqres.full
|
|
|
|
# Create a small fs with a large directory block size. We want to fill up the fs
|
|
# quickly and then create multi-fsb dirblocks over fragmented free space.
|
|
_scratch_mkfs_xfs -d size=20m -n size=64k >> $seqres.full 2>&1
|
|
_scratch_mount
|
|
|
|
# Fill a source directory with many largish-named files. 1k uuid-named entries
|
|
# sufficiently populates a 64k directory block.
|
|
mkdir $SCRATCH_MNT/src
|
|
for i in $(seq 0 1023); do
|
|
touch $SCRATCH_MNT/src/`$UUIDGEN_PROG`
|
|
done
|
|
|
|
# precreate target dirs while we still have free space for inodes
|
|
for i in $(seq 0 3); do
|
|
mkdir $SCRATCH_MNT/$i
|
|
done
|
|
|
|
# consume and fragment free space
|
|
$XFS_IO_PROG -xc "resblks 16" $SCRATCH_MNT >> $seqres.full 2>&1
|
|
dd if=/dev/zero of=$SCRATCH_MNT/file bs=4k >> $seqres.full 2>&1
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/file >> $seqres.full 2>&1
|
|
size=`_get_filesize $SCRATCH_MNT/file`
|
|
for i in $(seq 0 8192 $size); do
|
|
$XFS_IO_PROG -c "fpunch $i 4k" $SCRATCH_MNT/file >> $seqres.full 2>&1
|
|
done
|
|
|
|
# Replicate the src dir several times into fragmented free space. After one or
|
|
# two dirs, we should have nothing but non-contiguous directory blocks.
|
|
for d in $(seq 0 3); do
|
|
for f in `ls -1 $SCRATCH_MNT/src`; do
|
|
ln $SCRATCH_MNT/src/$f $SCRATCH_MNT/$d/$f
|
|
done
|
|
done
|
|
|
|
# Fragment the target dirs a bit. Remove a handful of entries from each to
|
|
# populate the best free space regions in the directory block headers. We want
|
|
# to populate these now so the subsequent unlinks have no reason to log the
|
|
# first block of the directory.
|
|
for d in $(seq 0 3); do
|
|
i=0
|
|
for f in `ls -U $SCRATCH_MNT/$d`; do
|
|
if [ $i == 0 ]; then
|
|
unlink $SCRATCH_MNT/$d/$f
|
|
fi
|
|
i=$(((i + 1) % 128))
|
|
done
|
|
done
|
|
|
|
# remount to flush and ensure subsequent operations allocate a new log item
|
|
_scratch_cycle_mount
|
|
|
|
# Unlink an entry towards the end of each dir and fsync. The unlink should only
|
|
# need to log the latter mappings of the 64k directory block. If the logging bug
|
|
# is present, this will crash!
|
|
for d in $(seq 0 3); do
|
|
f=`ls -U $SCRATCH_MNT/$d | tail -10 | head -n 1`
|
|
unlink $SCRATCH_MNT/$d/$f
|
|
$XFS_IO_PROG -c fsync $SCRATCH_MNT/$d
|
|
done
|
|
|
|
echo Silence is golden.
|
|
|
|
# success, all done
|
|
status=0
|
|
exit
|