overlay: Test invalidate of readdir cache

This is a regression test for kernel commit 65cd913ec9d9
("ovl: invalidate readdir cache on changes to dir with origin")

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Amir Goldstein
2021-04-25 10:14:45 +03:00
committed by Eryu Guan
parent 2fd4a08b93
commit 18d4e9c7bf
3 changed files with 120 additions and 0 deletions
+117
View File
@@ -0,0 +1,117 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2021 CTERA Networks. All Rights Reserved.
#
# FS QA Test 077
#
# Test invalidate of readdir cache
#
# This is a regression test for kernel commit 65cd913ec9d9
# ("ovl: invalidate readdir cache on changes to dir with origin")
#
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
rm -f $seqres.full
# real QA test starts here
_supported_fs overlay
_require_scratch_nocheck
# Use small getdents bufsize to fit less than 10 entries
# stuct linux_dirent64 is 20 bytes not including d_name
bufsize=200
# Create enough files to be returned in multiple gendents() calls.
# At least one of the files that we delete will not be listed in the
# first call, so we may encounter stale entries in following calls.
create_files() {
for n in {1..100}; do
touch ${1}/${2}${n}
done
}
# remove all files from previous runs
_scratch_mkfs
# Create test area with a merge dir, a "former" merge dir,
# a pure upper dir and impure upper dir. For each case, overlayfs
# readdir cache is used a bit differently.
lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
mkdir -p $lowerdir/merge $lowerdir/former $upperdir/pure $upperdir/impure
# Lower files in merge dir are listed first
create_files $lowerdir/merge m
# Files to be moved into impure upper dir
create_files $lowerdir o
# File to be copied up to make former merge dir impure
touch $lowerdir/former/f100
_scratch_mount
create_files $SCRATCH_MNT/pure p
create_files $SCRATCH_MNT/former f
# Copy up file so readdir will need to lookup its origin d_ino
touch $SCRATCH_MNT/merge/m100
# Move copied up files so readdir will need to lookup origin d_ino
mv $SCRATCH_MNT/o* $SCRATCH_MNT/impure/
# Remove the lower directory and mount overlay again to create
# a "former merge dir"
$UMOUNT_PROG $SCRATCH_MNT
rm -rf $lowerdir/former
_scratch_mount
# Check readdir cache invalidate on pure upper dir
echo -e "\nCreate file in pure upper dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/pure $bufsize "+p0" 2>&1 >> $seqres.full || \
echo "Missing created file in pure upper dir (see $seqres.full for details)"
echo -e "\nRemove file in pure upper dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/pure $bufsize "-p100" 2>&1 >> $seqres.full || \
echo "Found unlinked file in pure upper dir (see $seqres.full for details)"
# Check readdir cache invalidate on impure upper dir
echo -e "\nCreate file in impure upper dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/impure $bufsize "+o0" 2>&1 >> $seqres.full || \
echo "Missing created file in impure upper dir (see $seqres.full for details)"
echo -e "\nRemove file in impure upper dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/impure $bufsize "-o100" 2>&1 >> $seqres.full || \
echo "Found unlinked file in impure upper dir (see $seqres.full for details)"
# Check readdir cache invalidate on merge dir
echo -e "\nCreate file in merge dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/merge $bufsize "+m0" 2>&1 >> $seqres.full || \
echo "Missing created file in merge dir (see $seqres.full for details)"
echo -e "\nRemove file in merge dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/merge $bufsize "-m100" 2>&1 >> $seqres.full || \
echo "Found unlinked file in merge dir (see $seqres.full for details)"
# Check readdir cache invalidate on former merge dir
echo -e "\nCreate file in former merge dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/former $bufsize "+f0" 2>&1 >> $seqres.full || \
echo "Missing created file in former merge dir (see $seqres.full for details)"
echo -e "\nRemove file in former merge dir:" >> $seqres.full
$here/src/t_dir_offset2 $SCRATCH_MNT/former $bufsize "-f100" 2>&1 >> $seqres.full || \
echo "Found unlinked file in former merge dir (see $seqres.full for details)"
# success, all done
echo "Silence is golden"
status=0
exit
+2
View File
@@ -0,0 +1,2 @@
QA output created by 077
Silence is golden
+1
View File
@@ -79,6 +79,7 @@
074 auto quick exportfs dangerous
075 auto quick perms
076 auto quick perms dangerous
077 auto quick dir
100 auto quick union samefs
101 auto quick union nonsamefs
102 auto quick union nonsamefs xino