| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2020 Chengguang Xu <cgxu519@mykernel.net>. |
| # All Rights Reserved. |
| # |
| # FS QA Test 073 |
| # |
| # Test whiteout inode sharing functionality. |
| # |
| # A "whiteout" is an object that has special meaning in overlayfs. |
| # A whiteout on an upper layer will effectively hide a matching file |
| # in the lower layer, making it appear as if the file didn't exist. |
| # |
| # Whiteout inode sharing means multiple whiteout objects will share |
| # one inode in upper layer, without this feature every whiteout object |
| # will consume one inode in upper layer. |
| |
| . ./common/preamble |
| _begin_fstest auto quick whiteout |
| |
| # Import common functions. |
| . ./common/filter |
| |
| # real QA test starts here |
| _supported_fs overlay |
| _require_scratch |
| # Require index dir to test if workdir/work is not in use |
| # which implies that whiteout sharing is supported |
| _require_scratch_overlay_features index |
| |
| lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER |
| upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER |
| workdir=$OVL_BASE_SCRATCH_MNT/$OVL_WORK |
| |
| # Make some testing files in lowerdir. |
| # Argument: |
| # $1: Testing file number |
| make_lower_files() |
| { |
| mkdir $lowerdir/dir |
| for name in `seq ${1}`; do |
| touch $lowerdir/${name} &>/dev/null |
| done |
| } |
| |
| # Delete all copied-up files in upperdir. |
| make_whiteout_files() |
| { |
| # whiteout inode sharing implies that workdir/work is not in use |
| # If workdir/work is in use, delete of lower dir will fail and |
| # we won't run the test. |
| rmdir $workdir/work |
| rmdir $SCRATCH_MNT/dir &>/dev/null || \ |
| _notrun "overlay does not support whiteout inode sharing" |
| rm $SCRATCH_MNT/* &>/dev/null |
| } |
| |
| # Check link count of whiteout files. |
| # Arguments: |
| # $1: Testing file number |
| # $2: Expected link count |
| check_whiteout_files() |
| { |
| for name in dir `seq ${1}`; do |
| local real_count=`stat -c %h $upperdir/${name} 2>/dev/null` |
| if [[ ${2} != $real_count ]]; then |
| echo "Expected link count is ${2} but real count is $real_count, file name is ${name}" |
| fi |
| done |
| local tmpfile_count=`ls $workdir/index/\#* 2>/dev/null |wc -l 2>/dev/null` |
| if [[ -n "$tmpfile_count" && $tmpfile_count > 1 ]]; then |
| echo "There are more than one whiteout tmpfile in index dir!" |
| ls -l $workdir/index/\#* 2>/dev/null |
| fi |
| } |
| |
| # Run test case with specific arguments. |
| # Arguments: |
| # $1: Testing file number |
| # $2: Expected link count |
| run_test_case() |
| { |
| _scratch_mkfs |
| make_lower_files ${1} |
| # There will be extra hard links with nfs_export enabled which |
| # is expected. Turn it off explicitly to avoid the false alarm. |
| _scratch_mount -o "index=on,nfs_export=off" |
| make_whiteout_files |
| check_whiteout_files ${1} ${2} |
| _scratch_unmount |
| } |
| |
| # Test case |
| file_count=10 |
| # +1 for dir +1 for temp whiteout |
| link_count=12 |
| run_test_case $file_count $link_count |
| |
| # success, all done |
| echo "Silence is golden" |
| status=0 |
| exit |