mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
3e29b0b732
Do some EA and extent interaction at different formats due to different number of extents and EAs. It showed up the current attr2 bug. With the proposed patch this doesn't happen. Merge of master-melb:xfs-cmds:27606a by kenmcd. Add some more tests for the attr2 test. Do some EA and extent interaction at different formats due to different number of extents and EAs. It showed up the current attr2 bug. With the proposed patch this doesn't happen.
346 lines
6.0 KiB
Bash
Executable File
346 lines
6.0 KiB
Bash
Executable File
#! /bin/sh
|
|
# FS QA Test No. 135
|
|
#
|
|
# Test the attr2 code
|
|
# Let's look, xfs_db, at the inode and its literal area for the
|
|
# extents and the attributes
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
# Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
# creator
|
|
owner=tes@puffy.melbourne.sgi.com
|
|
|
|
seq=`basename $0`
|
|
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
|
|
. ./common.filter
|
|
|
|
# real QA test starts here
|
|
|
|
#_notrun "Need to fix up filtering before checkin"
|
|
|
|
# Modify as appropriate.
|
|
_supported_fs xfs
|
|
_supported_os IRIX Linux
|
|
_require_scratch
|
|
|
|
export MKFS_OPTIONS="-i size=512,attr=2"
|
|
_scratch_mkfs_xfs
|
|
_scratch_mount
|
|
|
|
file=$SCRATCH_MNT/file
|
|
touch $file
|
|
inum=`ls -i $file | awk '{print $1}'`
|
|
echo "inum=$inum"
|
|
|
|
_filter()
|
|
{
|
|
sed -e "s#$tmp#TMP#g"
|
|
}
|
|
|
|
add_eas()
|
|
{
|
|
start=$1
|
|
end=$2
|
|
echo ""; echo "** add $start..$end EAs **"
|
|
i=$start
|
|
while [ $i -le $end ]; do
|
|
attr -s name.$i -V value $file >/dev/null
|
|
i=`expr $i + 1`
|
|
done
|
|
}
|
|
|
|
rm_eas()
|
|
{
|
|
start=$1
|
|
end=$2
|
|
echo ""; echo "** rm $start..$end EAs **"
|
|
i=$start
|
|
while [ $i -le $end ]; do
|
|
attr -r name.$i $file >/dev/null
|
|
i=`expr $i + 1`
|
|
done
|
|
}
|
|
|
|
do_extents()
|
|
{
|
|
num=$1
|
|
echo ""; echo "** $num extents **"
|
|
src/makeextents -v -p -w -n $num $file
|
|
}
|
|
|
|
_print_inode()
|
|
{
|
|
umount $SCRATCH_MNT
|
|
xfs_db -r -c "inode $inum" -c "print" $SCRATCH_DEV |\
|
|
awk '
|
|
/nextents/ { print; next }
|
|
/naextents/ { print; next }
|
|
/u\./ { print; next }
|
|
/a\./ { print; next }
|
|
/forkoff/ { printf("core.forkoff = %d (%d bytes)\n", $3, $3*8); next }
|
|
/format/ { print; next }
|
|
/size/ { print; next }
|
|
'
|
|
_scratch_mount
|
|
}
|
|
|
|
_print_inode_u()
|
|
{
|
|
umount $SCRATCH_MNT
|
|
xfs_db -r -c "inode $inum" -c "print u" $SCRATCH_DEV
|
|
_scratch_mount
|
|
}
|
|
|
|
_print_inode_a()
|
|
{
|
|
umount $SCRATCH_MNT
|
|
xfs_db -r -c "inode $inum" -c "print a" $SCRATCH_DEV
|
|
_scratch_mount
|
|
}
|
|
|
|
|
|
_test_add_eas()
|
|
{
|
|
_print_inode
|
|
|
|
add_eas 1 1
|
|
_print_inode
|
|
|
|
add_eas 2 2
|
|
_print_inode
|
|
|
|
add_eas 3 4
|
|
_print_inode
|
|
|
|
add_eas 5 8
|
|
_print_inode
|
|
|
|
add_eas 9 16
|
|
_print_inode
|
|
|
|
add_eas 17 20
|
|
_print_inode
|
|
|
|
add_eas 21 21
|
|
_print_inode
|
|
|
|
add_eas 22 22
|
|
_print_inode
|
|
|
|
add_eas 23 23
|
|
_print_inode
|
|
|
|
add_eas 24 24
|
|
_print_inode
|
|
|
|
add_eas 25 25
|
|
_print_inode
|
|
|
|
add_eas 26 30
|
|
_print_inode
|
|
|
|
add_eas 31 35
|
|
_print_inode
|
|
|
|
rm_eas 1 34
|
|
_print_inode
|
|
}
|
|
|
|
_test_add_extents()
|
|
{
|
|
# now do the extents
|
|
|
|
#build up
|
|
j=1
|
|
while [ $j -le 30 ]; do
|
|
do_extents $j
|
|
_print_inode
|
|
j=`expr $j + 2`
|
|
done
|
|
|
|
#scale down
|
|
j=30
|
|
while [ $j -ge 1 ]; do
|
|
do_extents $j
|
|
_print_inode
|
|
j=`expr $j - 2`
|
|
done
|
|
|
|
#build up
|
|
j=1
|
|
while [ $j -le 30 ]; do
|
|
do_extents $j
|
|
_print_inode
|
|
j=`expr $j + 2`
|
|
done
|
|
}
|
|
|
|
#
|
|
# Using a nested loop,
|
|
# for various number of data extents,
|
|
# try adding EAs and then removing EAs
|
|
# Check that when we play with the EAs that we don't mess with the extents
|
|
#
|
|
_test_extents_eas()
|
|
{
|
|
# now do the EAs with the extents
|
|
|
|
extents_max=400
|
|
extents_inc=10
|
|
EAs_max=100
|
|
EAs_inc=5
|
|
for i in `seq 1 $extents_inc $extents_max`; do
|
|
do_extents $i
|
|
echo "--- extents: $i ---"
|
|
_print_inode
|
|
_print_inode_u > $tmp.u1
|
|
for j in `seq 1 $EAs_inc $EAs_max`; do
|
|
k=`expr $j + $EAs_inc - 1`
|
|
add_eas $j $k
|
|
done
|
|
# should have same extents
|
|
_print_inode
|
|
_print_inode_u > $tmp.u2
|
|
rm_eas 1 $EAs_max
|
|
_print_inode_u > $tmp.u3
|
|
|
|
echo ""
|
|
echo "*** Extent differences before and after EAs added ***"
|
|
diff -s $tmp.u1 $tmp.u2 | _filter
|
|
echo ""
|
|
if ! diff $tmp.u1 $tmp.u2 >/dev/null; then
|
|
echo "Data extents magically changed"
|
|
exit
|
|
fi
|
|
|
|
echo ""
|
|
echo "*** Extent differences before and after EAs removed ***"
|
|
diff -s $tmp.u2 $tmp.u3 | _filter
|
|
echo ""
|
|
if ! diff $tmp.u2 $tmp.u3 >/dev/null; then
|
|
echo "Data extents magically changed"
|
|
exit
|
|
fi
|
|
done
|
|
}
|
|
|
|
#
|
|
# The counterpart of _test_extents_eas
|
|
# with the nested loops reversed.
|
|
# For various number of EAs, try adding extents
|
|
# Check that when we play with the data extents that we don't mess with the EAs
|
|
#
|
|
_test_eas_extents()
|
|
{
|
|
# now do the EAs with the extents
|
|
|
|
extents_max=400
|
|
extents_inc=10
|
|
EAs_max=100
|
|
EAs_inc=5
|
|
for j in `seq 1 $EAs_inc $EAs_max`; do
|
|
|
|
k=`expr $j + $EAs_inc - 1`
|
|
add_eas $j $k
|
|
echo "--- EAs: $j ---"
|
|
|
|
_print_inode
|
|
_print_inode_a > $tmp.a1
|
|
for i in `seq 1 $extents_inc $extents_max`; do
|
|
do_extents $i
|
|
done
|
|
|
|
# should have same EAs
|
|
_print_inode
|
|
_print_inode_a > $tmp.a2
|
|
>$file
|
|
_print_inode_a > $tmp.a3
|
|
|
|
echo ""
|
|
echo "*** EA differences before and after extents added ***"
|
|
diff -s $tmp.a1 $tmp.a2 | _filter
|
|
echo ""
|
|
if ! diff $tmp.a1 $tmp.a2 >/dev/null; then
|
|
echo "EAs magically changed"
|
|
exit
|
|
fi
|
|
|
|
echo ""
|
|
echo "*** EA differences before and after extents removed ***"
|
|
diff -s $tmp.a2 $tmp.a3 | _filter
|
|
echo ""
|
|
if ! diff $tmp.a2 $tmp.a3 >/dev/null; then
|
|
echo "EAs magically changed"
|
|
exit
|
|
fi
|
|
done
|
|
}
|
|
|
|
#
|
|
# test to see how we go
|
|
|
|
#
|
|
# test to ensure it fits a max sf EA
|
|
#
|
|
# literal part of inode starts at offset 100 (decimal)
|
|
# for 512 bytes inode that gives 412 bytes of literal area
|
|
#
|
|
# min btree root (numrecs=3) => 3 * 16 + (4 or 8)
|
|
# for 8 byte alignment => 56 bytes
|
|
# => 512 - 156 = 356 bytes
|
|
#
|
|
# SF EA of form
|
|
# totsize: 2 bytes
|
|
# count: 1 byte
|
|
# nlen: 1 byte
|
|
# vlen: 1 byte
|
|
# flags: 1 byte
|
|
# name: nlen
|
|
# value: vlen
|
|
#
|
|
# => 6+nlen+vlen
|
|
#
|
|
# for nlen=4 "name"
|
|
# vlen = 356 - (6+4) = 346
|
|
#
|
|
#
|
|
_test_initial_sf_ea()
|
|
{
|
|
rm $file
|
|
touch $file
|
|
vlen=402
|
|
vlen=300
|
|
dd if=/dev/zero bs=1 count=$vlen | attr -s name $file
|
|
_print_inode
|
|
}
|
|
|
|
# main
|
|
|
|
_test_add_eas
|
|
_test_add_extents
|
|
_test_extents_eas
|
|
_test_eas_extents
|
|
#_test_initial_sf_ea
|
|
|
|
# do a test with a variety of sized EAs
|
|
|
|
# success, all done
|
|
status=0
|
|
exit
|