mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
f3d639b1cc
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>
93 lines
2.2 KiB
Bash
Executable File
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
|