On Tue, May 10, 2022 at 3:05 PM libaokun (A) <libaokun1@xxxxxxxxxx> wrote: > > 在 2022/5/10 15:51, Amir Goldstein 写道: > > On Tue, May 10, 2022 at 4:50 AM Baokun Li <libaokun1@xxxxxxxxxx> wrote: > >> 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. > >> > >> 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/ > >> > >> common/config | 12 ++++++------ > >> common/overlay | 2 +- > >> common/rc | 31 ++++++++++++++++++++++++------- > >> 3 files changed, 31 insertions(+), 14 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..ca465438 100644 > >> --- a/common/rc > >> +++ b/common/rc > >> @@ -410,10 +410,19 @@ _scratch_cycle_mount() > >> { > >> local opts="$1" > >> > >> - if [ "$FSTYP" = tmpfs ]; then > >> - _scratch_remount "$opts" > >> - return > >> - fi > >> + case "$FSTYP" in > >> + tmpfs) > >> + _scratch_remount "$opts" > >> + return > >> + ;; > >> + overlay) > >> + if [ "$OVL_BASE_FSTYP" = tmpfs ]; then > >> + _scratch_remount "$opts" > > > > That doesn't look right. > > _scrtach_cycle_mount is important for several overlay tests and there > > is no reason to > > skip it if base fs is tmpfs. > > What you need to do is cycle mount the overlay without cycle mounting > > the base fs. > > You could do something like this: > > > > local unmounted > > ... > > > > overlay) > > if [ "$OVL_BASE_FSTYP" = tmpfs ]; then > > $UMOUNT_PROG $SCRATCH_MNT > > unmounted=true > > fi > > ;; > > esac > > ... > > [ "$unmounted" = true ] || _scratch_unmount > > _try_scratch_mount "$opts" || _fail "cycle mount failed" > > } > > > > There are some overlay tests that open code this pattern like overlay/077: > > > > # Remove the lower directory and mount overlay again to create > > # a "former merge dir" > > $UMOUNT_PROG $SCRATCH_MNT > > rm -rf $lowerdir/former > > _scratch_mount > > > > So _scratch_mount is expected to work just fine when base fs is already mounted > > assuming that _check_mounted_on works correctly with tmpfs. > > > > Thanks, > > Amir. > > . > > Thank you very much for your advice. > > I will send a patch V4 with the changes suggested by you. To state the obvious that I did not say, please do the same with _test_cycle_mount Thanks, Amir.