| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2019 CTERA Networks. All Rights Reserved. |
| # |
| # FSQA Test No. 067 |
| # |
| # Test unique st_dev;st_ino on non-samefs setup. |
| # |
| # Check that files from middle layer on same fs as upper layer |
| # are not allowed to export the real inode st_dev;st_ino. |
| # |
| # This is a regression test for kernel commit: |
| # 9c6d8f13e9da ovl: fix corner case of non-unique st_dev;st_ino |
| # |
| 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 |
| |
| rm -f $seqres.full |
| |
| # 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_test |
| |
| # Lower is on test partition |
| lower=$OVL_BASE_TEST_DIR/$OVL_LOWER-$seq |
| # Upper/work are on scratch partition |
| middle=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER |
| upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER |
| work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK |
| |
| rm -rf $lower |
| mkdir $lower |
| |
| _scratch_mkfs >>$seqres.full 2>&1 |
| |
| realfile=$middle/file |
| testfile=$SCRATCH_MNT/file |
| |
| # Create a file on middle layer on same fs as upper layer |
| echo wrong > $realfile |
| |
| # Mount an overlay on $SCRATCH_MNT with lower layer on test partition |
| # and middle and upper layer on scratch partition. |
| # Disable xino, so not all overlay inodes are on the same st_dev. |
| _overlay_scratch_mount_dirs $middle:$lower $upper $work -o xino=off || \ |
| _notrun "cannot mount overlay with xino=off option" |
| |
| stat $realfile >>$seqres.full |
| stat $testfile >>$seqres.full |
| |
| # Diverge the content of the overlay file from its origin |
| echo right > $testfile |
| |
| stat $testfile >>$seqres.full |
| |
| # Expect the overlay file to differ from the original lower file |
| diff -q $realfile $testfile >>$seqres.full && |
| echo "diff with middle layer file doesn't know right from wrong! (warm cache)" |
| |
| echo 3 > /proc/sys/vm/drop_caches |
| |
| stat $testfile >>$seqres.full |
| |
| # Expect the overlay file to differ from the original lower file |
| diff -q $realfile $testfile >>$seqres.full && |
| echo "diff with middle layer file doesn't know right from wrong! (cold cache)" |
| |
| $UMOUNT_PROG $SCRATCH_MNT |
| # check overlayfs |
| _overlay_check_scratch_dirs $middle:$lower $upper $work -o xino=off |
| |
| echo "Silence is golden" |
| status=0 |
| exit |