The local.config of overlay+tmpfs is as follows: ```local.config.example export FSTYP=tmpfs export TEST_DEV=tmpfs_test export TEST_DIR=/tmp/test export SCRATCH_DEV=tmpfs_scratch export SCRATCH_MNT=/tmp/scratch ``` Run `./check -overlay tests` to execute test case on overlay+tmpfs. Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx> --- V1->V2: Fix the bug in version V1 and fix the issue in cycle_mount. V2->V3: Merge two patches into one completed patch. V3->V4: Cycle mount the overlay without cycle mounting the base fs. V1: https://patchwork.kernel.org/project/fstests/patch/20220424063751.1067376-1-libaokun1@xxxxxxxxxx/ V2: https://patchwork.kernel.org/project/fstests/cover/20220507094524.949615-1-libaokun1@xxxxxxxxxx/ V3: https://patchwork.kernel.org/project/fstests/patch/20220510020434.2561224-1-libaokun1@xxxxxxxxxx/ common/config | 12 ++++++------ common/overlay | 2 +- common/rc | 39 ++++++++++++++++++++++++++++++--------- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/common/config b/common/config index 1033b890..d5953176 100644 --- a/common/config +++ b/common/config @@ -610,15 +610,15 @@ _overlay_config_override() [ ! -d "$TEST_DEV" ] || export OVL_BASE_TEST_DIR="$TEST_DEV" [ ! -d "$SCRATCH_DEV" ] || export OVL_BASE_SCRATCH_MNT="$SCRATCH_DEV" + # Config file may specify base fs type, but we obay -overlay flag + [ "$FSTYP" == overlay ] || export OVL_BASE_FSTYP="$FSTYP" + export FSTYP=overlay + # 2. SCRATCH/TEST_DEV point to the base fs partitions. In this case, # the new OVL_BASE_SCRATCH/TEST_DEV/MNT vars are set to the values # of the configured base fs and SCRATCH/TEST_DEV vars are set to the # overlayfs base and mount dirs inside base fs mount. - [ -b "$TEST_DEV" ] || [ -c "$TEST_DEV" ] || return 0 - - # Config file may specify base fs type, but we obay -overlay flag - [ "$FSTYP" == overlay ] || export OVL_BASE_FSTYP="$FSTYP" - export FSTYP=overlay + [ -b "$TEST_DEV" ] || [ -c "$TEST_DEV" ] || [ "$OVL_BASE_FSTYP" == tmpfs ] || return 0 # Store original base fs vars export OVL_BASE_TEST_DEV="$TEST_DEV" @@ -634,7 +634,7 @@ _overlay_config_override() export TEST_DIR="$OVL_BASE_TEST_DIR/$OVL_MNT" export MOUNT_OPTIONS="$OVERLAY_MOUNT_OPTIONS" - [ -b "$SCRATCH_DEV" ] || [ -c "$SCRATCH_DEV" ] || return 0 + [ -b "$SCRATCH_DEV" ] || [ -c "$SCRATCH_DEV" ] || [ "$OVL_BASE_FSTYP" == tmpfs ] || return 0 # Store original base fs vars export OVL_BASE_SCRATCH_DEV="$SCRATCH_DEV" diff --git a/common/overlay b/common/overlay index fff67ba1..c4e7ee58 100644 --- a/common/overlay +++ b/common/overlay @@ -81,7 +81,7 @@ _overlay_base_mount() return 1 fi - _mount $* $dev $mnt + _mount -t $OVL_BASE_FSTYP $* $dev $mnt _idmapped_mount $dev $mnt } diff --git a/common/rc b/common/rc index 553ae350..0d50cc22 100644 --- a/common/rc +++ b/common/rc @@ -409,15 +409,25 @@ _scratch_remount() _scratch_cycle_mount() { local opts="$1" + local unmounted + + case "$FSTYP" in + tmpfs) + _scratch_remount "$opts" + return + ;; + overlay) + if [ "$OVL_BASE_FSTYP" = tmpfs ]; then + $UMOUNT_PROG $SCRATCH_MNT + unmounted=true + fi + ;; + esac - if [ "$FSTYP" = tmpfs ]; then - _scratch_remount "$opts" - return - fi if test -n "$opts"; then opts="-o $opts" fi - _scratch_unmount + [ "$unmounted" = true ] || _scratch_unmount _try_scratch_mount "$opts" || _fail "cycle mount failed" } @@ -522,10 +532,21 @@ _test_unmount() _test_cycle_mount() { - if [ "$FSTYP" = tmpfs ]; then - return - fi - _test_unmount + local unmounted + + case "$FSTYP" in + tmpfs) + return + ;; + overlay) + if [ "$OVL_BASE_FSTYP" = tmpfs ]; then + $UMOUNT_PROG $TEST_DIR + unmounted=true + fi + ;; + esac + + [ "$unmounted" = true ] || _test_unmount _test_mount } -- 2.31.1