| #! /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 |