| #! /bin/bash |
| # FSQA Test No. 038 |
| # |
| # Test consistent d_ino numbers for samefs setup. |
| # |
| #----------------------------------------------------------------------- |
| # |
| # Copyright (C) 2017 IBM Corporation. All Rights Reserved. |
| # Author: Chandan Rajendra <chandan@linux.vnet.ibm.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() |
| { |
| cd / |
| rm -f $tmp.* |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter |
| . ./common/attr |
| |
| # real QA test starts here |
| _supported_fs overlay |
| _supported_os Linux |
| # Use non-default scratch underlying overlay dirs, we need to check |
| # them explicity after test. |
| _require_scratch_nocheck |
| _require_attrs |
| _require_test_program "t_dir_type" |
| |
| rm -f $seqres.full |
| |
| _scratch_mkfs >>$seqres.full 2>&1 |
| |
| # Create our test files. |
| upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER |
| lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER |
| mkdir -p $lowerdir |
| |
| mkdir -p $lowerdir/test_dir/pure_lower_dir/subdir |
| |
| touch $lowerdir/test_file |
| |
| _scratch_mount |
| |
| test_dir=$SCRATCH_MNT/test_dir/ |
| |
| # Verify d_ino of '.' and '..' before and after dir becomes impure. |
| impure_dir=$test_dir/impure_dir |
| mkdir -p $impure_dir/subdir |
| |
| impure_dir_st_ino=$(stat -c '%i' $impure_dir) |
| impure_dir_parent_st_ino=$(stat -c '%i' $test_dir) |
| impure_subdir_st_ino=$(stat -c '%i' $impure_dir/subdir) |
| |
| # Before $impure_dir becomes impure |
| parent_d=$($here/src/t_dir_type $impure_dir $impure_dir_parent_st_ino) |
| [[ $parent_d == ".. d" ]] || \ |
| echo "Pure upper dir: Invalid d_ino reported for .." |
| |
| current_d=$($here/src/t_dir_type $impure_dir $impure_dir_st_ino) |
| [[ $current_d == ". d" ]] || \ |
| echo "Pure upper dir: Invalid d_ino reported for ." |
| |
| subdir_d=$($here/src/t_dir_type $impure_dir $impure_subdir_st_ino) |
| [[ $subdir_d == "subdir d" ]] || \ |
| echo "Pure upper dir: Invalid d_ino reported for subdir" |
| |
| # Move a copied up file into pure dir to make it impure |
| mv $SCRATCH_MNT/test_file $impure_dir |
| test_file_st_ino=$(stat -c '%i' $impure_dir/test_file) |
| |
| impure=$($GETFATTR_PROG --absolute-names --only-values -n 'trusted.overlay.impure' \ |
| $upperdir/test_dir/impure_dir) |
| [[ $impure == "y" ]] || echo "Impure directory missing impure xattr" |
| |
| # After $impure_dir becomes impure |
| parent_d=$($here/src/t_dir_type $impure_dir $impure_dir_parent_st_ino) |
| [[ $parent_d == ".. d" ]] || \ |
| echo "Impure dir: Invalid d_ino reported for .." |
| |
| current_d=$($here/src/t_dir_type $impure_dir $impure_dir_st_ino) |
| [[ $current_d == ". d" ]] || \ |
| echo "Impure dir: Invalid d_ino reported for ." |
| |
| subdir_d=$($here/src/t_dir_type $impure_dir $impure_subdir_st_ino) |
| [[ $subdir_d == "subdir d" ]] || \ |
| echo "Impure dir: Invalid d_ino reported for subdir" |
| |
| # Verify copy up file's d_ino |
| file_d=$($here/src/t_dir_type $impure_dir $test_file_st_ino) |
| [[ $file_d == "test_file f" ]] || \ |
| echo "Impure dir: Invalid d_ino reported for entry with copy-up origin" |
| |
| # Make $impure_dir pure |
| rm -rf $impure_dir/test_file |
| rm -rf $impure_dir/subdir |
| |
| # Verify invalidation of readdir cache |
| $here/src/t_dir_type $impure_dir $test_file_st_ino |
| [[ $? != 0 ]] || echo "Directory's readdir cache has stale file entries" |
| $here/src/t_dir_type $impure_dir $impure_subdir_st_ino |
| [[ $? != 0 ]] || echo "Directory's readdir cache has stale subdir entries" |
| |
| impure=$($GETFATTR_PROG --absolute-names --only-values -n 'trusted.overlay.impure' \ |
| $upperdir/test_dir/impure_dir 2>/dev/null) |
| [[ -z $impure ]] || echo "Pure directory has impure xattr" |
| |
| # Verify d_ino values of subdir entries of a pure lower dir. |
| parent_st_ino=$(stat -c '%i' $test_dir) |
| pure_lower_dir=$SCRATCH_MNT/test_dir/pure_lower_dir |
| pure_lower_dir_st_ino=$(stat -c '%i' $pure_lower_dir) |
| pure_lower_subdir_st_ino=$(stat -c '%i' $pure_lower_dir/subdir) |
| |
| parent_d=$($here/src/t_dir_type $pure_lower_dir $parent_st_ino) |
| [[ $parent_d == ".. d" ]] || \ |
| echo "Pure lower dir: Invalid d_ino reported for .." |
| |
| current_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_dir_st_ino) |
| [[ $current_d == ". d" ]] || \ |
| echo "Pure lower dir: Invalid d_ino reported for ." |
| |
| subdir_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_subdir_st_ino) |
| [[ $subdir_d == "subdir d" ]] || \ |
| echo "Pure lower dir: Invalid d_ino reported for subdir" |
| |
| # Create a file in pure lower dir to make it a merge dir |
| touch $pure_lower_dir/newfile |
| |
| parent_d=$($here/src/t_dir_type $pure_lower_dir $parent_st_ino) |
| [[ $parent_d == ".. d" ]] || \ |
| echo "Merged dir: Invalid d_ino reported for .." |
| |
| current_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_dir_st_ino) |
| [[ $current_d == ". d" ]] || \ |
| echo "Merged dir: Invalid d_ino reported for ." |
| |
| subdir_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_subdir_st_ino) |
| [[ $subdir_d == "subdir d" ]] || \ |
| echo "Merged dir: Invalid d_ino reported for subdir" |
| |
| _scratch_unmount |
| |
| # check overlayfs |
| _check_scratch_fs |
| |
| # Verify pure lower residing in dir which has another lower layer |
| _scratch_mkfs |
| |
| OVL_LOWER0=${OVL_LOWER}0 |
| OVL_LOWER1=${OVL_LOWER}1 |
| |
| middir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER0 |
| lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER1 |
| upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER |
| workdir=$OVL_BASE_SCRATCH_MNT/$OVL_WORK |
| |
| mkdir -p $middir |
| mkdir -p $lowerdir |
| mkdir -p $upperdir |
| mkdir -p $workdir |
| |
| mkdir -p $lowerdir/test_dir/pure_lower_dir/subdir |
| |
| _overlay_scratch_mount_dirs "$middir:$lowerdir" $upperdir $workdir |
| |
| # Copy up test_dir |
| touch $test_dir/test_file |
| |
| test_dir_st_ino=$(stat -c '%i' $test_dir) |
| pure_lower_dir=$test_dir/pure_lower_dir |
| pure_lower_dir_st_ino=$(stat -c '%i' $pure_lower_dir) |
| pure_lower_subdir_st_ino=$(stat -c '%i' $pure_lower_dir/subdir) |
| |
| parent_d=$($here/src/t_dir_type $pure_lower_dir $test_dir_st_ino) |
| [[ $parent_d == ".. d" ]] || \ |
| echo "Pure lower in dir which has another lower layer: Invalid d_ino reported for .." |
| current_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_dir_st_ino) |
| [[ $current_d == ". d" ]] || \ |
| echo "Pure lower in dir which has another lower layer: Invalid d_ino reported for ." |
| |
| subdir_d=$($here/src/t_dir_type $pure_lower_dir $pure_lower_subdir_st_ino) |
| [[ $subdir_d == "subdir d" ]] || \ |
| echo "Pure lower in dir which has another lower layer: Invalid d_ino reported for subdir" |
| |
| # check overlayfs |
| _overlay_check_scratch_dirs "$middir:$lowerdir" $upperdir $workdir |
| |
| echo "Silence is golden" |
| status=0 |
| exit |