#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018 CTERA Networks. All Rights Reserved. # # FS QA Test No. 050 # # Test encode/decode overlay file handles # # - Check encode/write/decode/read content of lower/upper file handles # - Check encode/decode/write/read content of lower/upper file handles # - Check decode/read of unlinked lower/upper files and directories # - Check decode/read of lower file handles after copy up, link and unlink # # This test requires and enables overlayfs NFS export support. # NFS export support depends on and requires overlayfs index feature. # 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 _require_scratch _require_test_program "open_by_handle" # We need to require both features together, because nfs_export cannot # be enabled when index is disabled _require_scratch_overlay_features index nfs_export # 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 NUMFILES=1 # Create test dir and empty test files create_test_files() { local dir=$1 mkdir -p $dir $here/src/open_by_handle -cp $dir $NUMFILES } # Create hard links to test files link_test_files() { local dir=$1 $here/src/open_by_handle -l $dir $NUMFILES } # Test encode/decode file handles on overlay mount test_file_handles() { local dir=$1 local opt=$2 echo test_file_handles $dir $opt | _filter_scratch $here/src/open_by_handle $opt $dir $NUMFILES } # Re-create lower/upper/work dirs create_dirs() { _scratch_mkfs } # Mount an overlay on $SCRATCH_MNT with all layers on scratch partition mount_dirs() { _scratch_mount -o "index=on,nfs_export=on" } # Unmount the overlay without unmounting base fs unmount_dirs() { $UMOUNT_PROG $SCRATCH_MNT } # Check non-stale file handles of lower/upper files and verify # that handle encoded before copy up is decoded to upper after # copy up. Verify reading data from file open by file handle # and verify access_at() with dirfd open by file handle. create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir mount_dirs # Check encode/decode of upper regular file handles test_file_handles $SCRATCH_MNT/uppertestdir # Check encode/decode of upper dir file handle test_file_handles $SCRATCH_MNT/uppertestdir -p # Check encode/write/decode/read/write of upper file handles test_file_handles $SCRATCH_MNT/uppertestdir -wrap # Check encode/decode of lower regular file handles before copy up test_file_handles $SCRATCH_MNT/lowertestdir # Check encode/decode of lower dir file handles before copy up test_file_handles $SCRATCH_MNT/lowertestdir -p # Check encode/write/decode/read/write of lower file handles across copy up test_file_handles $SCRATCH_MNT/lowertestdir -wrap unmount_dirs # Check copy up after encode/decode of lower/upper files # (copy up of disconnected dentry to index dir) create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir mount_dirs # Check encode/decode/write/read of upper regular file handles test_file_handles $SCRATCH_MNT/uppertestdir -a test_file_handles $SCRATCH_MNT/uppertestdir -r # Check encode/decode/write/read of lower regular file handles test_file_handles $SCRATCH_MNT/lowertestdir -a test_file_handles $SCRATCH_MNT/lowertestdir -r unmount_dirs # Check non-stale handles to unlinked but open lower/upper files create_dirs create_test_files $upper/uppertestdir create_test_files $upper/uppertestdir.rw create_test_files $lower/lowertestdir create_test_files $lower/lowertestdir.rw mount_dirs test_file_handles $SCRATCH_MNT/uppertestdir -dk # Check encode/write/unlink/decode/read of upper regular file handles test_file_handles $SCRATCH_MNT/uppertestdir.rw -rwdk test_file_handles $SCRATCH_MNT/lowertestdir -dk # Check encode/write/unlink/decode/read of lower file handles across copy up test_file_handles $SCRATCH_MNT/lowertestdir.rw -rwdk unmount_dirs # Check stale handles of unlinked lower/upper files (nlink = 0) create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir mount_dirs # Check decode of upper file handles after unlink/rmdir (nlink == 0) test_file_handles $SCRATCH_MNT/uppertestdir -dp # Check decode of lower file handles after unlink/rmdir (nlink == 0) test_file_handles $SCRATCH_MNT/lowertestdir -dp unmount_dirs # Check non-stale file handles of linked lower/upper files (nlink = 2,1) create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir mount_dirs # Check decode/read of upper file handles after link (nlink == 2) test_file_handles $SCRATCH_MNT/uppertestdir -wlr # Check decode/read of upper file handles after link + unlink (nlink == 1) test_file_handles $SCRATCH_MNT/uppertestdir -ur # Check decode/read of lower file handles after copy up + link (nlink == 2) test_file_handles $SCRATCH_MNT/lowertestdir -wlr # Check decode/read of lower file handles after copy up + link + unlink (nlink == 1) test_file_handles $SCRATCH_MNT/lowertestdir -ur unmount_dirs # Check non-stale file handles of linked lower/upper hardlinks (nlink = 2,1) create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir # Create lower/upper hardlinks link_test_files $lower/lowertestdir link_test_files $upper/uppertestdir mount_dirs # Check encode/decode of upper hardlink file handles (nlink == 2) test_file_handles $SCRATCH_MNT/uppertestdir # Check decode/read of upper hardlink file handles after unlink (nlink == 1) test_file_handles $SCRATCH_MNT/uppertestdir -wur # Check encode/decode of lower hardlink file handles before copy up (nlink == 2) test_file_handles $SCRATCH_MNT/lowertestdir # Check decode/read of lower hardlink file handles after copy up + unlink (nlink == 1) test_file_handles $SCRATCH_MNT/lowertestdir -wur unmount_dirs # Check stale file handles of unlinked lower/upper hardlinks (nlink = 2,0) create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir # Create lower/upper hardlinks link_test_files $lower/lowertestdir link_test_files $upper/uppertestdir mount_dirs # Check encode/decode of upper hardlink file handles (nlink == 2) test_file_handles $SCRATCH_MNT/uppertestdir # Check decode of upper hardlink file handles after 2*unlink (nlink == 0) test_file_handles $SCRATCH_MNT/uppertestdir -d # Check encode/decode of lower hardlink file handles before copy up (nlink == 2) test_file_handles $SCRATCH_MNT/lowertestdir # Check decode of lower hardlink file handles after copy up + 2*unlink (nlink == 0) test_file_handles $SCRATCH_MNT/lowertestdir -d unmount_dirs # Check non-stale file handles of lower/upper renamed files create_dirs create_test_files $upper/uppertestdir create_test_files $lower/lowertestdir mount_dirs # Check decode/read of upper file handles after rename in same upper parent test_file_handles $SCRATCH_MNT/uppertestdir -wmr # Check decode/read of lower file handles after copy up + rename in same merge parent test_file_handles $SCRATCH_MNT/lowertestdir -wmr unmount_dirs status=0 exit