| #! /bin/bash |
| # FS QA Test 031 |
| # |
| # The unmerged and origined directories may contain invalid |
| # whiteouts when we change underlaying dir (e.g. clean up lowerdir) |
| # and remount overlay. This may lead to whiteouts exposure and |
| # rmdir failure. |
| # |
| #----------------------------------------------------------------------- |
| # Copyright (c) 2017 Huawei. All Rights Reserved. |
| # |
| # 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() |
| { |
| cd / |
| rm -f $tmp.* |
| } |
| |
| # create test directory and test file, mount overlayfs and remove |
| # testfile to create a whiteout in upper dir. |
| create_whiteout() |
| { |
| local lower=$1 |
| local upper=$2 |
| local work=$3 |
| local file=$4 |
| |
| mkdir -p $lower/testdir |
| touch $lower/testdir/$file |
| |
| _overlay_scratch_mount_dirs $lower $upper $work |
| |
| rm -f $SCRATCH_MNT/testdir/$file |
| |
| $UMOUNT_PROG $SCRATCH_MNT |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter |
| |
| rm -f $seqres.full |
| |
| # real QA test starts here |
| _supported_fs overlay |
| _supported_os Linux |
| _require_scratch_nocheck |
| |
| # remove all files from previous runs |
| _scratch_mkfs |
| |
| # create test directorys and whiteout |
| lowerdir1=$OVL_BASE_SCRATCH_MNT/lower1 |
| lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2 |
| upperdir=$OVL_BASE_SCRATCH_MNT/upper |
| workdir=$OVL_BASE_SCRATCH_MNT/workdir |
| # When overlay inode index feature is enabled, a workdir cannot be reused |
| # with a different upperdir. workdir1 in this test is used as the workdir |
| # when lowerdir1 is used as the upperdir. |
| workdir1=$OVL_BASE_SCRATCH_MNT/workdir1 |
| testfile1=a |
| testfile2=b |
| mkdir -p $lowerdir1 $lowerdir2 $upperdir $workdir $workdir1 |
| |
| create_whiteout $lowerdir1 $upperdir $workdir $testfile1 |
| |
| # clean up the lower directory and mount overlay again, |
| # whiteout will expose. |
| rm -rf $lowerdir1/testdir |
| |
| _overlay_scratch_mount_dirs $lowerdir1 $upperdir $workdir |
| |
| ls $SCRATCH_MNT/testdir |
| |
| # try to remove test dir from overlay dir, trigger ovl_remove_upper, |
| # it will not clean up the dir and lead to rmdir failure. |
| rm -rf $SCRATCH_MNT/testdir 2>&1 | _filter_scratch |
| |
| # umount overlay again, create a new file with the same name and |
| # mount overlay again. |
| $UMOUNT_PROG $SCRATCH_MNT |
| touch $lowerdir1/testdir |
| |
| _overlay_scratch_mount_dirs $lowerdir1 $upperdir $workdir |
| |
| # try to remove test dir from overlay dir, trigger ovl_remove_and_whiteout, |
| # it will not clean up the dir and lead to residue. |
| rm -rf $SCRATCH_MNT/testdir 2>&1 | _filter_scratch |
| ls $workdir/work |
| |
| $UMOUNT_PROG $SCRATCH_MNT |
| |
| # let lower dir have invalid whiteouts, repeat ls and rmdir test again. |
| rm -rf $lowerdir1/testdir |
| rm -rf $upperdir/testdir |
| |
| create_whiteout $lowerdir2 $lowerdir1 $workdir1 $testfile1 |
| |
| rm -rf $lowerdir2/testdir |
| |
| _overlay_scratch_mount_dirs "$lowerdir1:$lowerdir2" $upperdir $workdir |
| |
| ls $SCRATCH_MNT/testdir |
| rm -rf $SCRATCH_MNT/testdir 2>&1 | _filter_scratch |
| |
| $UMOUNT_PROG $SCRATCH_MNT |
| |
| # let lower dir and upper dir both have invalid whiteouts, repeat ls and rmdir again. |
| rm -rf $lowerdir1/testdir |
| rm -rf $upperdir/testdir |
| |
| create_whiteout $lowerdir1 $upperdir $workdir $testfile1 |
| |
| rm -rf $lowerdir1/testdir/$testfile1 |
| |
| create_whiteout $lowerdir2 $lowerdir1 $workdir1 $testfile2 |
| |
| _overlay_scratch_mount_dirs $lowerdir1 $upperdir $workdir |
| |
| ls $SCRATCH_MNT/testdir |
| rm -rf $SCRATCH_MNT/testdir 2>&1 | _filter_scratch |
| |
| # success, all done |
| echo "Silence is golden" |
| status=0 |
| exit |