4 # Test for ea_inode feature in ext4. Without ea_inode feature, an extended
5 # attribute in ext4 cannot be larger than the fs block size. ea_inode feature
6 # allows storing xattr values in external inodes and so raises xattr value
9 #-----------------------------------------------------------------------
10 # Copyright (c) 2017 Google, Inc. All Rights Reserved.
12 # This program is free software; you can redistribute it and/or
13 # modify it under the terms of the GNU General Public License as
14 # published by the Free Software Foundation.
16 # This program is distributed in the hope that it would be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write the Free Software Foundation,
23 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #-----------------------------------------------------------------------
28 seqres=$RESULT_DIR/$seq
29 echo "QA output created by $seq"
32 status=1 # failure is the default!
33 trap "_cleanup; exit \$status" 0 1 2 3 15
40 # get standard environment, filters and checks
45 # remove previous $seqres.full before test
48 # real QA test starts here
53 _require_ext4_mkfs_feature ea_inode
55 _scratch_mkfs_ext4 -O ea_inode >/dev/null 2>&1
58 # Sets an extended attribute on a file.
61 local file=$1 name=$2 value=$3 tmp
63 if [[ "$value" != "" ]]; then
64 $SETFATTR_PROG -n $name -v "$value" $file
66 $SETFATTR_PROG -n $name $file
69 tmp=$($GETFATTR_PROG --absolute-names --only-values -n $name $file)
70 [[ "$tmp" == "$value" ]] || echo "unexpected value returned: $tmp"
73 # List attributes on a file.
76 $GETFATTR_PROG --absolute-names $1 | grep -v '^#'
79 # Removes an extended attribute from a file.
84 $SETFATTR_PROG -x $name $file
92 # Attribute with short name that goes into inode body.
95 # Attribute with long name that goes into xattr block.
96 name_in_block=user.$(perl -e 'print "b" x 100;')
98 # Set large xattr values on multiple files.
100 for file in $x $y $z; do
101 for name in $name_in_ibody $name_in_block; do
102 for size in 4096 8000 $((64*1024)); do
103 attr_set $file $name-$size \
104 $(perl -e "print 'v' x $size;")
113 attr_set $x $name_in_ibody $(perl -e "print 'i' x 25000;")
114 attr_set $x $name_in_block $(perl -e "print 'b' x 25000;")
116 attr_remove $x $name_in_ibody
117 attr_remove $x $name_in_block
120 # Set with same value twice.
122 attr_set $x $name_in_ibody $(perl -e "print 'i' x 60000;")
123 attr_set $x $name_in_ibody $(perl -e "print 'i' x 60000;")
127 # Repeatedly set an extended attribute with various value sizes.
129 for size in 0 10 80 900 1900 3000 9000 60 10000 0 8000 3000 10 0 20 10000 5; do
130 attr_set $x user.1 $(perl -e "print 'v' x $size;")