mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
777e1d6280
Currently hardlinks do not preserve the inode number across copy up, so hardlinks did not participate in this test so far. Stay honest and let the test verify what is was meant to verify and let it fail because of the fact that hardlinks inode numbers are not constant across copy up. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
153 lines
3.7 KiB
Bash
Executable File
153 lines
3.7 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, drop caches and
|
|
# mount cycle.
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
# 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"
|
|
_require_test_program "t_dir_type"
|
|
|
|
rm -f $seqres.full
|
|
|
|
_scratch_mkfs >>$seqres.full 2>&1
|
|
|
|
# Create our test files.
|
|
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
|
|
touch $lowerdir/hardlink1
|
|
ln $lowerdir/hardlink1 $lowerdir/hardlink2
|
|
|
|
FILES="dir file symlink chrdev blkdev fifo socket hardlink1 hardlink2"
|
|
|
|
# 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
|
|
$here/src/t_dir_type $dir $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
|
|
|
|
# Verify that the inode numbers survive a mount cycle
|
|
_scratch_cycle_mount
|
|
|
|
# Compare inode numbers before/after mount cycle
|
|
check_inode_numbers $testdir $tmp.after_move $tmp.after_cycle
|
|
|
|
echo "Silence is golden"
|
|
status=0
|
|
exit
|