public inbox for fstests@vger.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Eryu Guan <eguan@redhat.com>
Cc: Miklos Szeredi <miklos@szeredi.hu>,
	linux-unionfs@vger.kernel.org, fstests@vger.kernel.org
Subject: [PATCH v2 3/3] overlay: mount/unmount base fs before/after running tests
Date: Fri, 27 Jan 2017 10:56:05 +0200	[thread overview]
Message-ID: <1485507365-29012-4-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1485507365-29012-1-git-send-email-amir73il@gmail.com>

Optionally configure TEST/SCRATCH_BASE_DEV, for overlay base fs
to be mounted/unmounted before/after running tests. For example:

+export TEST_BASE_DEV=/dev/mapper/base-test
export TEST_BASE_MNT=/mnt/base/test
+export SCRATCH_BASE_DEV=/dev/mapper/base-scratch
export SCRATCH_BASE_MNT=/mnt/base/scratch
export TEST_DIR=/mnt/test
export SCRATCH_MNT=/mnt/scratch
export FSTYP=overlay

With this change, the base fs is mounted before running tests,
unmounted after running tests and recycled on _test_cycle_mount
along with the overlay mounts.
This helps catching overlayfs bugs related to leaking objects in
underlying (base) fs.

The standard way that overlay tests work is:
- _scratch_mkfs
- setup lower/upper dir files
- _scratch_mount (or custom overlay mount)
- (sometimes) _scratch_unmount/_scratch_mount recycle

To preserve expected tests behavior, the semantics are:
- _scratch_mkfs mounts the base fs, cleans the lower/upper dirs and
  keeps base fs mounted.
- _scratch_mount mounts or recycles base fs and mounts overlay
- _scratch_unmount unmounts overlay and base fs

Tests that use _scratch_unmount to unmount a custom overlay mount
and expect to have access to overlay base dir, were converted to use
explicit umount $SCRATCH_MNT instead.
---
 common/config     |  6 +++++-
 common/rc         | 42 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/003 |  3 ++-
 tests/overlay/004 |  3 ++-
 tests/overlay/014 |  5 +++--
 5 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/common/config b/common/config
index db5721c..f431a8d 100644
--- a/common/config
+++ b/common/config
@@ -35,7 +35,9 @@
 # RMT_TAPE_DEV -    the remote tape device for the xfsdump tests
 # RMT_IRIXTAPE_DEV- the IRIX remote tape device for the xfsdump tests
 # RMT_TAPE_USER -   remote user for tape device
+# TEST_BASE_DEV -   device for base fs containing overlay test dirs
 # TEST_BASE_MNT -   mount point for base fs of overlay test dirs
+# SCRATCH_BASE_DEV- device for base fs containing overlay scratch dirs
 # SCRATCH_BASE_MNT- mount point for base fs of overlay scratch dirs
 #
 # - These can be added to $HOST_CONFIG_DIR (witch default to ./config)
@@ -470,11 +472,12 @@ _config_overlay()
 	[ -z "$TEST_DEV" ] || export TEST_BASE_DIR="$TEST_DEV"
 	[ -z "$SCRATCH_DEV" ] || export SCRATCH_BASE_DIR="$SCRATCH_DEV"
 
-	# 2. set SCRATCH/TEST_BASE_MNT to configure base fs.
+	# 2. set SCRATCH/TEST_BASE_DEV/MNT to configure base fs.
 	#    SCRATCH/TEST_DEV are derived from SCRATCH/TEST_BASE_MNT
 	#    and therein, overlay fs directories will be created.
 	[ -n "$TEST_BASE_MNT" ] || return
 
+	_check_device TEST_BASE_DEV optional $TEST_BASE_DEV
 	if [ ! -d "$TEST_BASE_MNT" ]; then
 		echo "common/config: Error: \$TEST_BASE_MNT ($TEST_BASE_MNT) is not a directory"
 		exit 1
@@ -486,6 +489,7 @@ _config_overlay()
 
 	[ -n "$SCRATCH_BASE_MNT" ] || return
 
+	_check_device SCRATCH_BASE_DEV optional $SCRATCH_BASE_DEV
 	if [ ! -d "$SCRATCH_BASE_MNT" ]; then
 		echo "common/config: Error: \$SCRATCH_BASE_MNT ($SCRATCH_BASE_MNT) is not a directory"
 		exit 1
diff --git a/common/rc b/common/rc
index f5ab869..5033ed4 100644
--- a/common/rc
+++ b/common/rc
@@ -320,24 +320,62 @@ _overlay_mount()
 			    $SELINUX_MOUNT_OPTIONS $* $dir $mnt
 }
 
+_overlay_test_base_mount()
+{
+	if [ -n "$TEST_BASE_DEV" -a -n "$TEST_BASE_MNT" ]; then
+		_mount $TEST_BASE_MOUNT_OPTIONS \
+			$SELINUX_MOUNT_OPTIONS \
+			$TEST_BASE_DEV $TEST_BASE_MNT
+	fi
+}
+
 _overlay_test_mount()
 {
+	_overlay_test_base_mount
 	_overlay_mount $TEST_BASE_DIR $TEST_DIR $*
 }
 
+_overlay_scratch_base_mount()
+{
+	if [ -n "$SCRATCH_BASE_DEV" -a -n "$SCRATCH_BASE_MNT" ]; then
+		_mount $SCRATCH_BASE_MOUNT_OPTIONS \
+			$SELINUX_MOUNT_OPTIONS \
+			$SCRATCH_BASE_DEV $SCRATCH_BASE_MNT
+	fi
+}
+
+_overlay_scratch_base_unmount()
+{
+	if [ -n "$SCRATCH_BASE_DEV" -a -n "$SCRATCH_BASE_MNT" ]; then
+		$UMOUNT_PROG $SCRATCH_BASE_MNT
+	fi
+}
+
 _overlay_scratch_mount()
 {
+	# base fs may be mounted after overlay mkfs
+	_overlay_scratch_base_unmount 2>/dev/null
+	_overlay_scratch_base_mount
 	_overlay_mount $SCRATCH_BASE_DIR $SCRATCH_MNT $*
 }
 
+_overlay_test_base_unmount()
+{
+	if [ -n "$TEST_BASE_DEV" -a -n "$TEST_BASE_MNT" ]; then
+		$UMOUNT_PROG $TEST_BASE_MNT
+	fi
+}
+
 _overlay_test_unmount()
 {
 	$UMOUNT_PROG $TEST_DIR
+	_overlay_test_base_unmount
 }
 
 _overlay_scratch_unmount()
 {
 	$UMOUNT_PROG $SCRATCH_MNT
+	_overlay_scratch_base_unmount
 }
 
 _scratch_mount()
@@ -643,7 +681,11 @@ _scratch_cleanup_files()
 	overlay)
 		# Avoid rm -rf /* if we messed up
 		[ -n "$SCRATCH_BASE_DIR" ] || return
+		# overlay 'mkfs' needs to make sure base fs is mounted and clean
+		_overlay_scratch_base_unmount 2>/dev/null
+		_overlay_scratch_base_mount
 		rm -rf $SCRATCH_BASE_DIR/*
+		# leave base fs mouted so tests can setup lower dir
 		;;
 	*)
 		[ -n "$SCRATCH_MNT" ] || return
diff --git a/tests/overlay/003 b/tests/overlay/003
index bb59700..81aea85 100755
--- a/tests/overlay/003
+++ b/tests/overlay/003
@@ -89,7 +89,8 @@ rm -rf ${SCRATCH_MNT}/*
 # nothing should be listed
 ls ${SCRATCH_MNT}/
 
-_scratch_unmount
+# unmount overlayfs but not base fs
+$UMOUNT_PROG $SCRATCH_MNT
 
 rm -rf $lowerdir
 echo "Silence is golden"
diff --git a/tests/overlay/004 b/tests/overlay/004
index 6d78f9f..26ac547 100755
--- a/tests/overlay/004
+++ b/tests/overlay/004
@@ -85,7 +85,8 @@ _user_do "chmod g+t ${SCRATCH_MNT}/attr_file2 > /dev/null 2>&1"
 _user_do "chmod u-X ${SCRATCH_MNT}/attr_file2 > /dev/null 2>&1"
 stat -c %a ${SCRATCH_MNT}/attr_file2
 
-_scratch_unmount
+# unmount overlayfs but not base fs
+$UMOUNT_PROG $SCRATCH_MNT
 
 # check mode bits of the file that has been copied up, and
 # the file that should not have been copied up.
diff --git a/tests/overlay/014 b/tests/overlay/014
index 7426c31..6519432 100755
--- a/tests/overlay/014
+++ b/tests/overlay/014
@@ -73,7 +73,8 @@ mkdir -p $lowerdir1/testdir/d
 _overlay_mount_dirs $lowerdir1 $lowerdir2 $workdir $SCRATCH_BASE_DIR $SCRATCH_MNT
 rm -rf $SCRATCH_MNT/testdir
 mkdir -p $SCRATCH_MNT/testdir/visibledir
-_scratch_unmount
+# unmount overlayfs but not base fs
+$UMOUNT_PROG $SCRATCH_MNT
 
 # mount overlay again, with lowerdir1 and lowerdir2 as multiple lowerdirs,
 # and create a new file in testdir, triggers copyup from lowerdir,
@@ -84,7 +85,7 @@ touch $SCRATCH_MNT/testdir/visiblefile
 
 # umount and mount overlay again, buggy kernel treats the copied-up dir as
 # opaque, visibledir is not seen in merged dir.
-_scratch_unmount
+$UMOUNT_PROG $SCRATCH_MNT
 _overlay_mount_dirs "$lowerdir2:$lowerdir1" $upperdir $workdir \
 		    $SCRATCH_BASE_DIR $SCRATCH_MNT
 ls $SCRATCH_MNT/testdir
-- 
2.7.4


  parent reply	other threads:[~2017-01-27  9:23 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-27  8:56 [PATCH v2 0/3] xfstests: mount cycle overlay base fs Amir Goldstein
2017-01-27  8:56 ` [PATCH v2 1/3] overlay: configure base fs mount point for running tests Amir Goldstein
2017-02-07 12:35   ` Eryu Guan
2017-02-07 13:32     ` Amir Goldstein
2017-01-27  8:56 ` [PATCH v2 2/3] overlay: use SCRATCH_BASE_DIR instead of SCRATCH_DEV Amir Goldstein
2017-01-27  8:56 ` Amir Goldstein [this message]
2017-02-07 12:47   ` [PATCH v2 3/3] overlay: mount/unmount base fs before/after running tests Eryu Guan
2017-02-07 13:24     ` Amir Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1485507365-29012-4-git-send-email-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=eguan@redhat.com \
    --cc=fstests@vger.kernel.org \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox