blob: 4c4ca45998b83ac26aa32dc6be416f4fd3b532c7 [file] [log] [blame]
#! /bin/bash
# FS QA Test No. 058
#
# Test decoding overlay file handles with warm/cold dentry cache
#
# When opening a non-dir by file handle and the decoded inode/dentry
# are not in cache, the resulting dentry is "disconnected" (i.e. unknown
# path). This is a common case that is already covered by previous tests.
# This test covers the case of decoding an overlay file handle, while a
# disconnected dentry is still in cache.
#
# This test requires and enables overlayfs NFS export support.
# NFS export support depends on and requires overlayfs index feature.
#
#-----------------------------------------------------------------------
# Copyright (C) 2018 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()
{
$KILLALL_PROG -9 open_by_handle >/dev/null 2>&1
wait
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 "open_by_handle"
# We need to require all features together, because nfs_export cannot
# be enabled when index is disabled
_require_scratch_overlay_features index nfs_export
_require_command "$KILLALL_PROG" killall
# All overlay dirs are on scratch partition
lower=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
# Keep this number > 1, because open_by_handle -rp does faccessat()
# on file file000000, which makes that dentry connected
NUMFILES=10
# Create test dir and empty test files
create_test_files()
{
local dir=$1
local opt=$2
mkdir -p $dir
$here/src/open_by_handle -cp $opt $dir $NUMFILES
}
# Test encode/decode file handles on overlay mount
test_file_handles()
{
local dir=$1
shift
echo test_file_handles $dir $* | _filter_scratch | \
sed -e "s,$tmp\.,,g"
$here/src/open_by_handle $* $dir $NUMFILES
}
# Create lower/upper dir and files
_scratch_mkfs
create_test_files $upper/uppertestdir -w
create_test_files $lower/lowertestdir -w
_scratch_mount -o "index=on,nfs_export=on"
# Encode upper file handles
test_file_handles $SCRATCH_MNT/uppertestdir -p -o $tmp.upper_file_handles
# Encode lower file handles
test_file_handles $SCRATCH_MNT/lowertestdir -p -o $tmp.lower_file_handles
# Check decode and read from stored file handles with warm caches -
# At this time, all non-dir dentries are connected, because the entries
# were created on lookup, before encoding the file handles.
test_file_handles $SCRATCH_MNT -rnp -i $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT -rnp -i $tmp.lower_file_handles
# Check decode and read/readdir from stored file handles with cold caches -
# -s sleeps in the background to keep files open and keep disconnected
# overlay dentries in cache
_scratch_cycle_mount "index=on,nfs_export=on"
test_file_handles $SCRATCH_MNT -rnps -i $tmp.upper_file_handles &
# Give the above 1 second to get to sleep loop
sleep 1
test_file_handles $SCRATCH_MNT -rnps -i $tmp.lower_file_handles &
# Give the above 1 second to get to sleep loop
sleep 1
# Check decode and read/readdir from stored file handles with warm caches -
# At this time, all non-dir dentries are disconnected, because there was
# no lookup to the files since drop caches. The expection to this rule
# is lower and upper file000000. open_by_handle -rp above did faccessat()
# on file file000000, which created a connected dentry alias in addition
# to the disconnected dentry alias.
test_file_handles $SCRATCH_MNT -rnp -i $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT -rnp -i $tmp.lower_file_handles
# SIGPIPE avoids Terminated/Killed message from bash
$KILLALL_PROG -q -13 open_by_handle
wait
status=0
exit