mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
ext4: Test expansion of inode size
ext4 supports dynamic expansion of inode size via inode's i_extra_size field. Test the code performing the expansion in the kernel. Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
This commit is contained in:
Executable
+183
@@ -0,0 +1,183 @@
|
||||
#! /bin/bash
|
||||
# FS QA Test 022
|
||||
#
|
||||
# Test extending of i_extra_isize code
|
||||
#
|
||||
#-----------------------------------------------------------------------
|
||||
# Copyright (c) 2016 SUSE Linux Products GmbH. All Rights Reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it would be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#-----------------------------------------------------------------------
|
||||
#
|
||||
|
||||
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.*
|
||||
}
|
||||
|
||||
do_setfattr()
|
||||
{
|
||||
$SETFATTR_PROG $@ 2>&1 | _filter_scratch
|
||||
}
|
||||
|
||||
# get standard environment, filters and checks
|
||||
. ./common/rc
|
||||
. ./common/filter
|
||||
. ./common/attr
|
||||
|
||||
# remove previous $seqres.full before test
|
||||
rm -f $seqres.full
|
||||
|
||||
# real QA test starts here
|
||||
_supported_fs ext4
|
||||
_supported_os Linux
|
||||
_require_scratch
|
||||
_require_dumpe2fs
|
||||
_require_command "$DEBUGFS_PROG" debugfs
|
||||
_require_attrs
|
||||
|
||||
# Use large inodes to have enough space for experimentation
|
||||
INODE_SIZE=1024
|
||||
# Block size
|
||||
BLOCK_SIZE=4096
|
||||
# We leave this amount of bytes for xattrs
|
||||
XATTR_SPACE=256
|
||||
# We grow extra_isize by this much
|
||||
GROW_EXTRA_ISIZE=80
|
||||
# We grow minimum requested isize by this much
|
||||
GROW_MIN_EXTRA_ISIZE=16
|
||||
|
||||
export MKFS_OPTIONS="-I $INODE_SIZE -b $BLOCK_SIZE"
|
||||
_scratch_mkfs >> $seqres.full 2>&1
|
||||
|
||||
ISIZE=$($DUMPE2FS_PROG -h $SCRATCH_DEV 2>/dev/null |
|
||||
grep "^Desired extra isize:" | awk '{print $4}')
|
||||
# 32 bytes for header and 4 bytes for terminator
|
||||
BLOCK_XATTR_SPACE=$(($BLOCK_SIZE - 36))
|
||||
GOOD_OLD_ISIZE=128
|
||||
WANT_ISIZE=$(($INODE_SIZE-$GOOD_OLD_ISIZE-$XATTR_SPACE))
|
||||
NEW_ISIZE=$(($WANT_ISIZE+$GROW_EXTRA_ISIZE))
|
||||
NEW_MIN_ISIZE=$(($WANT_ISIZE+$GROW_MIN_EXTRA_ISIZE))
|
||||
|
||||
if [ $WANT_ISIZE -lt $ISIZE ]; then
|
||||
_notrun "This test requires at least $XATTR_SPACE free in the inode"
|
||||
fi
|
||||
|
||||
$DEBUGFS_PROG -w -R "ssv want_extra_isize $WANT_ISIZE" $SCRATCH_DEV >> $seqres.full 2>&1
|
||||
$DEBUGFS_PROG -w -R "ssv min_extra_isize $WANT_ISIZE" $SCRATCH_DEV >> $seqres.full 2>&1
|
||||
|
||||
_scratch_mount
|
||||
|
||||
FNAMES=("empty" "couple_xattrs" "just_enough_xattrs" "one_extra_xattr"
|
||||
"full_xattrs" "one_extra_xattr_ext" "full_xattrs_ext"
|
||||
"full_xattrs_almost_full_ext" "full_xattrs_full_ext")
|
||||
create_xattr_file()
|
||||
{
|
||||
FILE=$SCRATCH_MNT/${FNAMES[$1]}
|
||||
touch $FILE
|
||||
for (( i = 0; i < $2; i++ )); do
|
||||
do_setfattr -n "user.$i" -v "aa" $FILE || break
|
||||
done
|
||||
}
|
||||
|
||||
# Test file without xattrs
|
||||
create_xattr_file 0 0
|
||||
|
||||
# Test file with couple of xattrs but which still has enough space
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 104 bytes consumed (152 bytes still free)
|
||||
create_xattr_file 1 4
|
||||
|
||||
# Test file with xattrs which still has just enough space
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 176 bytes consumed (80 bytes still free)
|
||||
create_xattr_file 2 7
|
||||
|
||||
# Test file with xattrs which has one xattr which needs moving
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 200 bytes consumed (56 bytes still free)
|
||||
create_xattr_file 3 8
|
||||
|
||||
# Test file with xattrs which has xattr space almost full
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 248 bytes consumed (8 bytes still free)
|
||||
create_xattr_file 4 10
|
||||
|
||||
# Test file with xattrs which has one xattr which needs moving and external
|
||||
# xattr block allocated
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 200 bytes consumed (56 bytes still free)
|
||||
create_xattr_file 5 8
|
||||
do_setfattr -n "user.e0" -v "01234567890123456789012345678901234567890123456789" "$SCRATCH_MNT/${FNAMES[5]}"
|
||||
|
||||
# Test file with xattrs which has xattr space in inode almost full and external
|
||||
# xattr block allocated
|
||||
# One xattr consumes 24 bytes + 4 bytes for header + 4 bytes for terminator
|
||||
# => 248 bytes consumed (8 bytes still free)
|
||||
create_xattr_file 6 11
|
||||
|
||||
# Test file with xattrs which has xattr space in inode almost full and external
|
||||
# xattr block allocated and almost full so that inode can still expand to
|
||||
# s_min_extra_isize
|
||||
# 10 xattrs fit into inode, rest goes into xattr block (one xattr consumes
|
||||
# 24 bytes)
|
||||
create_xattr_file 7 $((10 + ($BLOCK_XATTR_SPACE - $GROW_MIN_EXTRA_ISIZE) / 24))
|
||||
|
||||
# Test file with xattrs which has xattr space in inode almost full and external
|
||||
# xattr block allocated and full
|
||||
# 10 xattrs fit into inode, rest goes into xattr block (one xattr consumes
|
||||
# 24 bytes)
|
||||
create_xattr_file 8 $((10 + $BLOCK_XATTR_SPACE / 24))
|
||||
|
||||
_scratch_unmount
|
||||
|
||||
# Filesystem prepared, update extra_isize
|
||||
|
||||
$DEBUGFS_PROG -w -R "ssv want_extra_isize $NEW_ISIZE" $SCRATCH_DEV >> $seqres.full 2>&1
|
||||
$DEBUGFS_PROG -w -R "ssv min_extra_isize $NEW_MIN_ISIZE" $SCRATCH_DEV >> $seqres.full 2>&1
|
||||
|
||||
_scratch_mount
|
||||
|
||||
# Dirty each inode to force expansion of extra_isize
|
||||
for FILE in ${FNAMES[@]}; do
|
||||
echo "aaaa" >$SCRATCH_MNT/$FILE
|
||||
done
|
||||
|
||||
# Dump all xattrs to see whether nothing broke
|
||||
for FILE in ${FNAMES[@]}; do
|
||||
$GETFATTR_PROG -h -d --absolute-names $SCRATCH_MNT/$FILE 2>/dev/null | \
|
||||
_filter_scratch | sort
|
||||
done
|
||||
|
||||
_scratch_unmount
|
||||
|
||||
# Dump everything via debugfs to check whether sizes got extended as expected
|
||||
for FILE in ${FNAMES[@]}; do
|
||||
$DEBUGFS_PROG -R "stat $FILE" $SCRATCH_DEV 2>/dev/null | \
|
||||
grep "^Size of extra inode fields:"
|
||||
done
|
||||
|
||||
# success, all done
|
||||
status=0
|
||||
exit
|
||||
@@ -0,0 +1,432 @@
|
||||
QA output created by 022
|
||||
|
||||
# file: SCRATCH_MNT/couple_xattrs
|
||||
user.0="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
|
||||
# file: SCRATCH_MNT/just_enough_xattrs
|
||||
user.0="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
user.4="aa"
|
||||
user.5="aa"
|
||||
user.6="aa"
|
||||
|
||||
# file: SCRATCH_MNT/one_extra_xattr
|
||||
user.0="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
user.4="aa"
|
||||
user.5="aa"
|
||||
user.6="aa"
|
||||
user.7="aa"
|
||||
|
||||
# file: SCRATCH_MNT/full_xattrs
|
||||
user.0="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
user.4="aa"
|
||||
user.5="aa"
|
||||
user.6="aa"
|
||||
user.7="aa"
|
||||
user.8="aa"
|
||||
user.9="aa"
|
||||
|
||||
# file: SCRATCH_MNT/one_extra_xattr_ext
|
||||
user.0="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
user.4="aa"
|
||||
user.5="aa"
|
||||
user.6="aa"
|
||||
user.7="aa"
|
||||
user.e0="01234567890123456789012345678901234567890123456789"
|
||||
|
||||
# file: SCRATCH_MNT/full_xattrs_ext
|
||||
user.0="aa"
|
||||
user.10="aa"
|
||||
user.1="aa"
|
||||
user.2="aa"
|
||||
user.3="aa"
|
||||
user.4="aa"
|
||||
user.5="aa"
|
||||
user.6="aa"
|
||||
user.7="aa"
|
||||
user.8="aa"
|
||||
user.9="aa"
|
||||
|
||||
# file: SCRATCH_MNT/full_xattrs_almost_full_ext
|
||||
user.0="aa"
|
||||
user.100="aa"
|
||||
user.101="aa"
|
||||
user.102="aa"
|
||||
user.103="aa"
|
||||
user.104="aa"
|
||||
user.105="aa"
|
||||
user.106="aa"
|
||||
user.107="aa"
|
||||
user.108="aa"
|
||||
user.109="aa"
|
||||
user.10="aa"
|
||||
user.110="aa"
|
||||
user.111="aa"
|
||||
user.112="aa"
|
||||
user.113="aa"
|
||||
user.114="aa"
|
||||
user.115="aa"
|
||||
user.116="aa"
|
||||
user.117="aa"
|
||||
user.118="aa"
|
||||
user.119="aa"
|
||||
user.11="aa"
|
||||
user.120="aa"
|
||||
user.121="aa"
|
||||
user.122="aa"
|
||||
user.123="aa"
|
||||
user.124="aa"
|
||||
user.125="aa"
|
||||
user.126="aa"
|
||||
user.127="aa"
|
||||
user.128="aa"
|
||||
user.129="aa"
|
||||
user.12="aa"
|
||||
user.130="aa"
|
||||
user.131="aa"
|
||||
user.132="aa"
|
||||
user.133="aa"
|
||||
user.134="aa"
|
||||
user.135="aa"
|
||||
user.136="aa"
|
||||
user.137="aa"
|
||||
user.138="aa"
|
||||
user.139="aa"
|
||||
user.13="aa"
|
||||
user.140="aa"
|
||||
user.141="aa"
|
||||
user.142="aa"
|
||||
user.143="aa"
|
||||
user.144="aa"
|
||||
user.145="aa"
|
||||
user.146="aa"
|
||||
user.147="aa"
|
||||
user.148="aa"
|
||||
user.149="aa"
|
||||
user.14="aa"
|
||||
user.150="aa"
|
||||
user.151="aa"
|
||||
user.152="aa"
|
||||
user.153="aa"
|
||||
user.154="aa"
|
||||
user.155="aa"
|
||||
user.156="aa"
|
||||
user.157="aa"
|
||||
user.158="aa"
|
||||
user.159="aa"
|
||||
user.15="aa"
|
||||
user.160="aa"
|
||||
user.161="aa"
|
||||
user.162="aa"
|
||||
user.163="aa"
|
||||
user.164="aa"
|
||||
user.165="aa"
|
||||
user.166="aa"
|
||||
user.167="aa"
|
||||
user.168="aa"
|
||||
user.169="aa"
|
||||
user.16="aa"
|
||||
user.170="aa"
|
||||
user.171="aa"
|
||||
user.172="aa"
|
||||
user.173="aa"
|
||||
user.174="aa"
|
||||
user.175="aa"
|
||||
user.176="aa"
|
||||
user.177="aa"
|
||||
user.17="aa"
|
||||
user.18="aa"
|
||||
user.19="aa"
|
||||
user.1="aa"
|
||||
user.20="aa"
|
||||
user.21="aa"
|
||||
user.22="aa"
|
||||
user.23="aa"
|
||||
user.24="aa"
|
||||
user.25="aa"
|
||||
user.26="aa"
|
||||
user.27="aa"
|
||||
user.28="aa"
|
||||
user.29="aa"
|
||||
user.2="aa"
|
||||
user.30="aa"
|
||||
user.31="aa"
|
||||
user.32="aa"
|
||||
user.33="aa"
|
||||
user.34="aa"
|
||||
user.35="aa"
|
||||
user.36="aa"
|
||||
user.37="aa"
|
||||
user.38="aa"
|
||||
user.39="aa"
|
||||
user.3="aa"
|
||||
user.40="aa"
|
||||
user.41="aa"
|
||||
user.42="aa"
|
||||
user.43="aa"
|
||||
user.44="aa"
|
||||
user.45="aa"
|
||||
user.46="aa"
|
||||
user.47="aa"
|
||||
user.48="aa"
|
||||
user.49="aa"
|
||||
user.4="aa"
|
||||
user.50="aa"
|
||||
user.51="aa"
|
||||
user.52="aa"
|
||||
user.53="aa"
|
||||
user.54="aa"
|
||||
user.55="aa"
|
||||
user.56="aa"
|
||||
user.57="aa"
|
||||
user.58="aa"
|
||||
user.59="aa"
|
||||
user.5="aa"
|
||||
user.60="aa"
|
||||
user.61="aa"
|
||||
user.62="aa"
|
||||
user.63="aa"
|
||||
user.64="aa"
|
||||
user.65="aa"
|
||||
user.66="aa"
|
||||
user.67="aa"
|
||||
user.68="aa"
|
||||
user.69="aa"
|
||||
user.6="aa"
|
||||
user.70="aa"
|
||||
user.71="aa"
|
||||
user.72="aa"
|
||||
user.73="aa"
|
||||
user.74="aa"
|
||||
user.75="aa"
|
||||
user.76="aa"
|
||||
user.77="aa"
|
||||
user.78="aa"
|
||||
user.79="aa"
|
||||
user.7="aa"
|
||||
user.80="aa"
|
||||
user.81="aa"
|
||||
user.82="aa"
|
||||
user.83="aa"
|
||||
user.84="aa"
|
||||
user.85="aa"
|
||||
user.86="aa"
|
||||
user.87="aa"
|
||||
user.88="aa"
|
||||
user.89="aa"
|
||||
user.8="aa"
|
||||
user.90="aa"
|
||||
user.91="aa"
|
||||
user.92="aa"
|
||||
user.93="aa"
|
||||
user.94="aa"
|
||||
user.95="aa"
|
||||
user.96="aa"
|
||||
user.97="aa"
|
||||
user.98="aa"
|
||||
user.99="aa"
|
||||
user.9="aa"
|
||||
|
||||
# file: SCRATCH_MNT/full_xattrs_full_ext
|
||||
user.0="aa"
|
||||
user.100="aa"
|
||||
user.101="aa"
|
||||
user.102="aa"
|
||||
user.103="aa"
|
||||
user.104="aa"
|
||||
user.105="aa"
|
||||
user.106="aa"
|
||||
user.107="aa"
|
||||
user.108="aa"
|
||||
user.109="aa"
|
||||
user.10="aa"
|
||||
user.110="aa"
|
||||
user.111="aa"
|
||||
user.112="aa"
|
||||
user.113="aa"
|
||||
user.114="aa"
|
||||
user.115="aa"
|
||||
user.116="aa"
|
||||
user.117="aa"
|
||||
user.118="aa"
|
||||
user.119="aa"
|
||||
user.11="aa"
|
||||
user.120="aa"
|
||||
user.121="aa"
|
||||
user.122="aa"
|
||||
user.123="aa"
|
||||
user.124="aa"
|
||||
user.125="aa"
|
||||
user.126="aa"
|
||||
user.127="aa"
|
||||
user.128="aa"
|
||||
user.129="aa"
|
||||
user.12="aa"
|
||||
user.130="aa"
|
||||
user.131="aa"
|
||||
user.132="aa"
|
||||
user.133="aa"
|
||||
user.134="aa"
|
||||
user.135="aa"
|
||||
user.136="aa"
|
||||
user.137="aa"
|
||||
user.138="aa"
|
||||
user.139="aa"
|
||||
user.13="aa"
|
||||
user.140="aa"
|
||||
user.141="aa"
|
||||
user.142="aa"
|
||||
user.143="aa"
|
||||
user.144="aa"
|
||||
user.145="aa"
|
||||
user.146="aa"
|
||||
user.147="aa"
|
||||
user.148="aa"
|
||||
user.149="aa"
|
||||
user.14="aa"
|
||||
user.150="aa"
|
||||
user.151="aa"
|
||||
user.152="aa"
|
||||
user.153="aa"
|
||||
user.154="aa"
|
||||
user.155="aa"
|
||||
user.156="aa"
|
||||
user.157="aa"
|
||||
user.158="aa"
|
||||
user.159="aa"
|
||||
user.15="aa"
|
||||
user.160="aa"
|
||||
user.161="aa"
|
||||
user.162="aa"
|
||||
user.163="aa"
|
||||
user.164="aa"
|
||||
user.165="aa"
|
||||
user.166="aa"
|
||||
user.167="aa"
|
||||
user.168="aa"
|
||||
user.169="aa"
|
||||
user.16="aa"
|
||||
user.170="aa"
|
||||
user.171="aa"
|
||||
user.172="aa"
|
||||
user.173="aa"
|
||||
user.174="aa"
|
||||
user.175="aa"
|
||||
user.176="aa"
|
||||
user.177="aa"
|
||||
user.178="aa"
|
||||
user.17="aa"
|
||||
user.18="aa"
|
||||
user.19="aa"
|
||||
user.1="aa"
|
||||
user.20="aa"
|
||||
user.21="aa"
|
||||
user.22="aa"
|
||||
user.23="aa"
|
||||
user.24="aa"
|
||||
user.25="aa"
|
||||
user.26="aa"
|
||||
user.27="aa"
|
||||
user.28="aa"
|
||||
user.29="aa"
|
||||
user.2="aa"
|
||||
user.30="aa"
|
||||
user.31="aa"
|
||||
user.32="aa"
|
||||
user.33="aa"
|
||||
user.34="aa"
|
||||
user.35="aa"
|
||||
user.36="aa"
|
||||
user.37="aa"
|
||||
user.38="aa"
|
||||
user.39="aa"
|
||||
user.3="aa"
|
||||
user.40="aa"
|
||||
user.41="aa"
|
||||
user.42="aa"
|
||||
user.43="aa"
|
||||
user.44="aa"
|
||||
user.45="aa"
|
||||
user.46="aa"
|
||||
user.47="aa"
|
||||
user.48="aa"
|
||||
user.49="aa"
|
||||
user.4="aa"
|
||||
user.50="aa"
|
||||
user.51="aa"
|
||||
user.52="aa"
|
||||
user.53="aa"
|
||||
user.54="aa"
|
||||
user.55="aa"
|
||||
user.56="aa"
|
||||
user.57="aa"
|
||||
user.58="aa"
|
||||
user.59="aa"
|
||||
user.5="aa"
|
||||
user.60="aa"
|
||||
user.61="aa"
|
||||
user.62="aa"
|
||||
user.63="aa"
|
||||
user.64="aa"
|
||||
user.65="aa"
|
||||
user.66="aa"
|
||||
user.67="aa"
|
||||
user.68="aa"
|
||||
user.69="aa"
|
||||
user.6="aa"
|
||||
user.70="aa"
|
||||
user.71="aa"
|
||||
user.72="aa"
|
||||
user.73="aa"
|
||||
user.74="aa"
|
||||
user.75="aa"
|
||||
user.76="aa"
|
||||
user.77="aa"
|
||||
user.78="aa"
|
||||
user.79="aa"
|
||||
user.7="aa"
|
||||
user.80="aa"
|
||||
user.81="aa"
|
||||
user.82="aa"
|
||||
user.83="aa"
|
||||
user.84="aa"
|
||||
user.85="aa"
|
||||
user.86="aa"
|
||||
user.87="aa"
|
||||
user.88="aa"
|
||||
user.89="aa"
|
||||
user.8="aa"
|
||||
user.90="aa"
|
||||
user.91="aa"
|
||||
user.92="aa"
|
||||
user.93="aa"
|
||||
user.94="aa"
|
||||
user.95="aa"
|
||||
user.96="aa"
|
||||
user.97="aa"
|
||||
user.98="aa"
|
||||
user.99="aa"
|
||||
user.9="aa"
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 720
|
||||
Size of extra inode fields: 656
|
||||
Size of extra inode fields: 640
|
||||
@@ -24,6 +24,7 @@
|
||||
019 fuzzers
|
||||
020 auto quick ioctl rw
|
||||
021 auto quick
|
||||
022 auto quick attr dangerous
|
||||
271 auto rw quick
|
||||
301 aio auto ioctl rw stress
|
||||
302 aio auto ioctl rw stress
|
||||
|
||||
Reference in New Issue
Block a user