Files
apfstests/tests/overlay/017
T
Amir Goldstein 0825323485 overlay/017: verify constant inode number after rename
The test verifies constant inode number after copy up.

Verify that inode number remains constant also after rename
and drop caches (when overlayfs needs to find the lower
inodes in another location).

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
2017-05-01 14:08:35 +08:00

145 lines
3.5 KiB
Bash
Executable File

#! /bin/bash
# FSQA Test No. 017
#
# Test constant inode numbers
#
# This simple test demonstrates a known issue with overlayfs:
# - stat file A shows inode number X
# - modify A to trigger copy up
# - stat file A shows inode number Y != X
#
# Also test if d_ino of readdir entries changes after copy up
# and if inode numbers persist after rename and drop caches.
#
#-----------------------------------------------------------------------
#
# Copyright (C) 2016 CTERA Networks. All Rights Reserved.
# Author: Amir Goldstein <amir73il@gmail.com>
#
# 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.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs overlay
_supported_os Linux
_require_scratch
_require_test_program "af_unix"
rm -f $seqres.full
_scratch_mkfs >>$seqres.full 2>&1
# Create our test files.
# Not dealing with hardlinks here, when hardlinks are broken they
# should not preserve the inode number.
lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
mkdir -p $lowerdir
mkdir $lowerdir/dir
touch $lowerdir/file
ln -s $lowerdir/file $lowerdir/symlink
mknod $lowerdir/chrdev c 1 1
mknod $lowerdir/blkdev b 1 1
mknod $lowerdir/fifo p
$here/src/af_unix $lowerdir/socket
FILES="dir file symlink chrdev blkdev fifo socket"
# Record inode numbers in format <ino> <basename>
function record_inode_numbers()
{
dir=$1
outfile=$2
for f in $FILES; do
ls -id $dir/$f
done | \
while read ino file; do
echo $ino `basename $file` >> $outfile
done
}
# Check inode numbers match recorder inode numbers
function check_inode_numbers()
{
dir=$1
before=$2
after=$3
record_inode_numbers $dir $after
# Test constant stat(2) st_ino -
# Compare before..after - expect silence
# We use diff -u so out.bad will tell us which stage failed
diff -u $before $after
# Test constant readdir(3)/getdents(2) d_ino -
# Expect to find file by inode number
cat $before | while read ino f; do
find $dir/ -maxdepth 1 -inum $ino | grep -q $f || \
echo "$f not found by ino $ino (from $before)"
done
}
_scratch_mount
rm -f $tmp.*
testdir=$SCRATCH_MNT/test
mkdir -p $testdir
# Record inode numbers before copy up
record_inode_numbers $SCRATCH_MNT $tmp.before
for f in $FILES; do
# chown -h modifies all those file types
chown -h 100 $SCRATCH_MNT/$f
done
# Compare inode numbers before/after copy up
check_inode_numbers $SCRATCH_MNT $tmp.before $tmp.after_copyup
for f in $FILES; do
# move to another dir
mv $SCRATCH_MNT/$f $testdir/
done
echo 3 > /proc/sys/vm/drop_caches
# Compare inode numbers before/after rename and drop caches
check_inode_numbers $testdir $tmp.after_copyup $tmp.after_move
echo "Silence is golden"
status=0
exit