Files
apfstests/tests/xfs/327
T
Darrick J. Wong f3d639b1cc xfs/327: fix inode reflink flag checking
This is a regression test that tried to make sure that repair correctly
clears the XFS inode reflink flag when it detects files that do not
share any blocks.  However, it does this checking by looking at the
(online) lsattr output.  This worked fine during development when we
exposed the reflink state via the stat ioctls, but that has long since
been removed.  Now the only way to check is via xfs_db, so switch it to
use that.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2020-11-08 17:22:10 +08:00

93 lines
2.2 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved.
#
# FS QA Test No. 327
#
# Create 100 reflinked files, CoW them all, and see if xfs_repair will
# clear the reflink flag. There was a buffer handling bug in xfs_repair
# that (fortunately) triggered asserts in the rmap code when clearing
# the reflink flag.
#
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 /
_scratch_unmount > /dev/null 2>&1
rm -rf $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_fs xfs
_require_cp_reflink
_require_scratch_reflink
rm -f $seqres.full
nr=128 # spanning at least one inode chunk tickles a bug in xfs_repair
echo "Format filesystem"
_scratch_mkfs >/dev/null 2>&1
_scratch_mount >> $seqres.full
echo "Create files"
_pwrite_byte 0x66 0 1 $SCRATCH_MNT/file.0 >> $seqres.full
seq 1 $nr | while read i; do
_cp_reflink $SCRATCH_MNT/file.0 $SCRATCH_MNT/file.$i
done
sync
ino_0=$(stat -c '%i' $SCRATCH_MNT/file.0)
ino_64=$(stat -c '%i' $SCRATCH_MNT/file.64)
ino_128=$(stat -c '%i' $SCRATCH_MNT/file.128)
echo "Check filesystem"
_scratch_unmount
_scratch_xfs_db -c "inode $ino_0" -c print \
-c "inode $ino_64" -c print \
-c "inode $ino_128" -c print | grep reflink | sed -e 's/^v[0-9]*/vX/g'
_scratch_mount
echo "Check files"
for i in 0 $((nr / 2)) $nr; do
md5sum $SCRATCH_MNT/file.$i | _filter_scratch
$XFS_IO_PROG -c 'lsattr -v' $SCRATCH_MNT/file.$i >> $seqres.full
done
echo "CoW all files"
seq 1 $nr | while read i; do
echo m >> $SCRATCH_MNT/file.$i
done
echo "Repair filesystem"
_scratch_unmount
_repair_scratch_fs >> $seqres.full
_scratch_xfs_db -c "inode $ino_0" -c print \
-c "inode $ino_64" -c print \
-c "inode $ino_128" -c print | grep reflink | sed -e 's/^v[0-9]*/vX/g'
_scratch_mount
echo "Check files again"
for i in 0 $((nr / 2)) $nr; do
md5sum $SCRATCH_MNT/file.$i | _filter_scratch
$XFS_IO_PROG -c 'lsattr -v' $SCRATCH_MNT/file.$i >> $seqres.full
done
echo "Done"
# success, all done
status=0
exit