($INBOX_DIR/description missing)
 help / color / Atom feed
* [PATCH 0/3] Nested overlay exportfs tests
@ 2019-12-21 18:51 Amir Goldstein
  2019-12-21 18:51 ` [PATCH 1/3] overlay: create the overlay/nested test group Amir Goldstein
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Amir Goldstein @ 2019-12-21 18:51 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, linux-unionfs, fstests

Eryu,

There is a somewhat convoluted story behind those tests...

At the time when overlay NFS export support was merged (v4.16),
nested overlay NFS export was not supported, because of the requirement
that all layers must have non null s_uuid. I had private patches to add
support for nested overlay NFS export, which I tested with these tests.

In kernel v4.20, commit 9df085f3c9a2 ("ovl: relax requirement for non
null uuid ...") was merged to enable NFS export of overlayfs with lower
squashfs. As a by-product from this change, nested overlay NFS export
is since supported.

v5.5-rc2 includes a fix to the v4.20 commit above ("ovl: fix lookup
failure on multi lower squashfs"). I used these tests to verify that
the change did not break the single lower layer with no uuid case.

v5.5-rc2 also includes a fix to how overlayfs encodes file handles in
memory ("ovl: make sure that real fid is 32bit aligned in memory").
I also use those test to verify this change and they flushed out several
bugs in my initial implementation that the existing overlay/exportfs
test did not catch.

Since those test have proven to be useful in catching bugs not directly
related to the less interesting case of nested overlay NFS export, I
decided it is now prime time for me to post them.

Thanks,
Amir.

Amir Goldstein (3):
  overlay: create the overlay/nested test group
  overlay: test file handles with nested overlay on the same fs
  overlay: test file handles with nested overlay on another fs

 tests/overlay/068     | 304 +++++++++++++++++++++++++++++++++++++++++
 tests/overlay/068.out |  50 +++++++
 tests/overlay/069     | 306 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/069.out |  50 +++++++
 tests/overlay/group   |   6 +-
 5 files changed, 714 insertions(+), 2 deletions(-)
 create mode 100755 tests/overlay/068
 create mode 100644 tests/overlay/068.out
 create mode 100755 tests/overlay/069
 create mode 100644 tests/overlay/069.out

-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] overlay: create the overlay/nested test group
  2019-12-21 18:51 [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
@ 2019-12-21 18:51 ` Amir Goldstein
  2019-12-21 18:51 ` [PATCH 2/3] overlay: test file handles with nested overlay on the same fs Amir Goldstein
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Amir Goldstein @ 2019-12-21 18:51 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, linux-unionfs, fstests

For tests that mount an overlayfs over overlayfs.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 tests/overlay/group | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/overlay/group b/tests/overlay/group
index b7cd7774..e809f7f2 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -24,14 +24,14 @@
 019 auto stress
 020 auto quick copyup perms
 021 auto quick copyup
-022 auto quick mount
+022 auto quick mount nested
 023 auto quick attr
 024 auto quick mount
 025 auto quick attr
 026 auto attr quick
 027 auto quick perms
 028 auto copyup quick
-029 auto quick
+029 auto quick nested
 030 auto quick perms
 031 auto quick whiteout
 032 auto quick copyup hardlink
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/3] overlay: test file handles with nested overlay on the same fs
  2019-12-21 18:51 [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
  2019-12-21 18:51 ` [PATCH 1/3] overlay: create the overlay/nested test group Amir Goldstein
@ 2019-12-21 18:51 ` Amir Goldstein
  2019-12-21 18:51 ` [PATCH 3/3] overlay: test file handles with nested overlay on another fs Amir Goldstein
  2019-12-22 21:19 ` [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
  3 siblings, 0 replies; 5+ messages in thread
From: Amir Goldstein @ 2019-12-21 18:51 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, linux-unionfs, fstests

This is a variant of overlay file handles test for an overlayfs that
is nested over another lower overlayfs on the same fs.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 tests/overlay/068     | 304 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/068.out |  50 +++++++
 tests/overlay/group   |   1 +
 3 files changed, 355 insertions(+)
 create mode 100755 tests/overlay/068
 create mode 100644 tests/overlay/068.out

diff --git a/tests/overlay/068 b/tests/overlay/068
new file mode 100755
index 00000000..2b533f22
--- /dev/null
+++ b/tests/overlay/068
@@ -0,0 +1,304 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2018 CTERA Networks. All Rights Reserved.
+#
+# FS QA Test No. 068
+#
+# Test encode/decode of nested overlay file handles
+#
+# This is a variant of overlay file handles test for an overlayfs that is
+# nested over another lower overlayfs on the same fs.
+#
+# - Check encode/write/decode/read content of lower/upper file handles
+# - Check encode/decode/write/read content of lower/upper file handles
+# - Check decode/read of unlinked lower/upper files and directories
+# - Check decode/read of lower file handles after copy up, link and unlink
+# - Check decode/read of lower file handles after rename of parent and self
+#
+# This test does not cover connectable file handles of non-directories,
+# because name_to_handle_at() syscall does not support requesting connectable
+# file handles.
+#
+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.*
+	# Unmount the nested overlay mount
+	$UMOUNT_PROG $mnt2 2>/dev/null
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# real QA test starts here
+
+_supported_fs overlay
+_supported_os Linux
+_require_scratch
+# _require_exportfs already requires open_by_handle, but let's not count on it
+_require_test_program "open_by_handle"
+# We need to require all features together, because nfs_export cannot
+# be enabled when index is disabled
+_require_scratch_overlay_features index nfs_export redirect_dir
+
+# Lower dir of nested overlay is the scratch overlay mount at SCRATCH_MNT
+upper2=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER.2
+work2=$OVL_BASE_SCRATCH_MNT/$OVL_WORK.2
+mnt2=$OVL_BASE_SCRATCH_MNT/$OVL_MNT.2
+
+lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER/lowertestdir
+upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER/uppertestdir
+lowertestdir=$mnt2/lowertestdir
+uppertestdir=$mnt2/uppertestdir
+NUMFILES=1
+
+# Create test dir and empty test files
+create_test_files()
+{
+	local dir=$1
+	local opt=$2
+
+	src/open_by_handle -cp $opt $dir $NUMFILES
+}
+
+# Test encode/decode file handles on overlay mount
+test_file_handles()
+{
+	local dir=$1
+	shift
+
+	echo test_file_handles $dir $* | _filter_scratch | _filter_ovl_dirs | \
+				sed -e "s,$tmp\.,,g"
+	$here/src/open_by_handle $* $dir $NUMFILES
+}
+
+# Re-create lower/upper/work dirs
+create_dirs()
+{
+	# Create the underlying overlay dirs
+	_scratch_mkfs
+
+	# Create the nested overlay upper dirs
+	mkdir -p $upper2 $work2 $mnt2
+}
+
+# Mount a nested overlay with $SCRATCH_MNT as lower layer
+mount_dirs()
+{
+	# Mount the underlying overlay
+	_scratch_mount -o "index=on,nfs_export=on,redirect_dir=on"
+
+	# Mount the nested overlay
+	_overlay_mount_dirs $SCRATCH_MNT $upper2 $work2 overlay2 $mnt2 \
+		-o "index=on,nfs_export=on,redirect_dir=on" 2>/dev/null ||
+		_notrun "cannot mount nested overlay with nfs_export=on option"
+	_fs_options overlay2 | grep -q "nfs_export=on" || \
+		_notrun "cannot enable nfs_export feature on nested overlay"
+}
+
+# Unmount the nested overlay mount and check underlying overlay layers
+unmount_dirs()
+{
+	# unmount & check nested overlay
+	$UMOUNT_PROG $mnt2
+	_overlay_check_dirs $SCRATCH_MNT $upper2 $work2 \
+		-o "index=on,nfs_export=on,redirect_dir=on"
+
+	# unmount & check underlying overlay
+	_scratch_unmount
+	_check_scratch_fs
+}
+
+# Check non-stale file handles of lower/upper files and verify
+# that handle decoded before copy up is encoded to upper after
+# copy up. Verify reading data from file open by file handle
+# and verify access_at() with dirfd open by file handle.
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode of upper regular file handles
+test_file_handles $uppertestdir
+# Check encode/decode of upper dir file handle
+test_file_handles $uppertestdir -p
+# Check encode/write/decode/read/write of upper file handles
+test_file_handles $uppertestdir -wrap
+# Check encode/decode of lower regular file handles before copy up
+test_file_handles $lowertestdir
+# Check encode/decode of lower dir file handles before copy up
+test_file_handles $lowertestdir -p
+# Check encode/write/decode/read/write of lower file handles across copy up
+test_file_handles $lowertestdir -wrap
+unmount_dirs
+
+# Check copy up after encode/decode of lower/upper files
+# (copy up of disconnected dentry to index dir)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode/write/read of upper regular file handles
+test_file_handles $uppertestdir -a
+test_file_handles $uppertestdir -r
+# Check encode/decode/write/read of lower regular file handles
+test_file_handles $lowertestdir -a
+test_file_handles $lowertestdir -r
+unmount_dirs
+
+# Check non-stale handles to unlinked but open lower/upper files
+create_dirs
+create_test_files $upperdir
+create_test_files $upperdir.rw
+create_test_files $lowerdir
+create_test_files $lowerdir.rw
+mount_dirs
+test_file_handles $uppertestdir -dk
+# Check encode/write/unlink/decode/read of upper regular file handles
+test_file_handles $uppertestdir.rw -rwdk
+test_file_handles $lowertestdir -dk
+# Check encode/write/unlink/decode/read of lower file handles across copy up
+test_file_handles $lowertestdir.rw -rwdk
+unmount_dirs
+
+# Check stale handles of unlinked lower/upper files (nlink = 1,0)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check decode of upper file handles after unlink/rmdir (nlink == 0)
+test_file_handles $uppertestdir -dp
+# Check decode of lower file handles after unlink/rmdir (nlink == 0)
+test_file_handles $lowertestdir -dp
+unmount_dirs
+
+# Check non-stale file handles of linked lower/upper files (nlink = 1,2,1)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode of upper file handles (nlink == 1)
+test_file_handles $uppertestdir
+# Check decode/read of upper file handles after link (nlink == 2)
+test_file_handles $uppertestdir -wlr
+# Check decode/read of upper file handles after link + unlink (nlink == 1)
+test_file_handles $uppertestdir -ur
+# Check encode/decode of lower file handles before copy up (nlink == 1)
+test_file_handles $lowertestdir
+# Check decode/read of lower file handles after copy up + link (nlink == 2)
+test_file_handles $lowertestdir -wlr
+# Check decode/read of lower file handles after copy up + link + unlink (nlink == 1)
+test_file_handles $lowertestdir -ur
+unmount_dirs
+
+# Check non-stale file handles of linked lower/upper hardlinks (nlink = 2,1)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+# Create lower/upper hardlinks
+test_file_handles $lowerdir -l >/dev/null
+test_file_handles $upperdir -l >/dev/null
+mount_dirs
+# Check encode/decode of upper hardlink file handles (nlink == 2)
+test_file_handles $uppertestdir
+# Check decode/read of upper hardlink file handles after unlink (nlink == 1)
+test_file_handles $uppertestdir -wur
+# Check encode/decode of lower hardlink file handles before copy up (nlink == 2)
+test_file_handles $lowertestdir
+# Check decode/read of lower hardlink file handles after copy up + unlink (nlink == 1)
+test_file_handles $lowertestdir -wur
+unmount_dirs
+
+# Check stale file handles of unlinked lower/upper hardlinks (nlink = 2,0)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+# Create lower/upper hardlinks
+test_file_handles $lowerdir -l >/dev/null
+test_file_handles $upperdir -l >/dev/null
+mount_dirs
+# Check encode/decode of upper hardlink file handles (nlink == 2)
+test_file_handles $uppertestdir
+# Check decode of upper hardlink file handles after 2*unlink (nlink == 0)
+test_file_handles $uppertestdir -d
+# Check encode/decode of lower hardlink file handles before copy up (nlink == 2)
+test_file_handles $lowertestdir
+# Check decode of lower hardlink file handles after copy up + 2*unlink (nlink == 0)
+test_file_handles $lowertestdir -d
+unmount_dirs
+
+# Check non-stale file handles of lower/upper renamed files
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check decode/read of upper file handles after rename in same upper parent
+test_file_handles $uppertestdir -wmr
+# Check decode/read of lower file handles after copy up + rename in same merge parent
+test_file_handles $lowertestdir -wmr
+unmount_dirs
+
+# Check non-stale file handles of lower/upper moved files
+create_dirs
+create_test_files $upperdir -w
+create_test_files $lowerdir -w
+mkdir -p $lowerdir.lo $lowerdir.up $upperdir.lo $upperdir.up
+mount_dirs
+# Check encode/decode/read of lower/upper file handles after move to new upper testdir
+test_file_handles $uppertestdir -o $tmp.upper_file_handles
+test_file_handles $lowertestdir -o $tmp.lower_file_handles
+mv $uppertestdir/* $uppertestdir.up/
+mv $lowertestdir/* $uppertestdir.lo/
+# Check open and read from stored file handles
+test_file_handles $mnt2 -r -i $tmp.upper_file_handles
+test_file_handles $mnt2 -r -i $tmp.lower_file_handles
+# Check encode/decode/read of lower/upper file handles after move to new merge testdir
+test_file_handles $uppertestdir.up -o $tmp.upper_file_handles
+test_file_handles $uppertestdir.lo -o $tmp.lower_file_handles
+mv $uppertestdir.up/* $lowertestdir.up/
+mv $uppertestdir.lo/* $lowertestdir.lo/
+# Check open and read from stored file handles
+test_file_handles $mnt2 -r -i $tmp.upper_file_handles
+test_file_handles $mnt2 -r -i $tmp.lower_file_handles
+unmount_dirs
+
+# Check non-stale file handles of lower/upper renamed dirs
+create_dirs
+create_test_files $upperdir -w
+create_test_files $lowerdir -w
+create_test_files $upperdir/subdir -w
+create_test_files $lowerdir/subdir -w
+mount_dirs
+# Check encode/decode/read of lower/upper file handles after rename of testdir
+test_file_handles $uppertestdir -p -o $tmp.upper_file_handles
+test_file_handles $lowertestdir -p -o $tmp.lower_file_handles
+# Check encode/decode/read of lower/upper file handles after rename of testdir's parent
+test_file_handles $uppertestdir/subdir -p -o $tmp.upper_subdir_file_handles
+test_file_handles $lowertestdir/subdir -p -o $tmp.lower_subdir_file_handles
+# Rename pure upper dir
+mv $uppertestdir $uppertestdir.new/
+# Copy up lower dir, index and rename
+mv $lowertestdir $lowertestdir.new/
+# Check open, read and readdir from stored file handles
+# (testdir argument is the mount point and NOT the dir
+#  we are trying to open by stored file handle)
+test_file_handles $mnt2 -rp -i $tmp.upper_file_handles
+test_file_handles $mnt2 -rp -i $tmp.lower_file_handles
+test_file_handles $mnt2 -rp -i $tmp.upper_subdir_file_handles
+test_file_handles $mnt2 -rp -i $tmp.lower_subdir_file_handles
+# Retry decoding lower subdir file handle when indexed testdir is in dcache
+# (providing renamed testdir argument pins the indexed testdir to dcache)
+test_file_handles $lowertestdir.new -rp -i $tmp.lower_subdir_file_handles
+unmount_dirs
+
+status=0
+exit
diff --git a/tests/overlay/068.out b/tests/overlay/068.out
new file mode 100644
index 00000000..9fd75c7f
--- /dev/null
+++ b/tests/overlay/068.out
@@ -0,0 +1,50 @@
+QA output created by 068
+test_file_handles SCRATCH_MNT.2/uppertestdir
+test_file_handles SCRATCH_MNT.2/uppertestdir -p
+test_file_handles SCRATCH_MNT.2/uppertestdir -wrap
+test_file_handles SCRATCH_MNT.2/lowertestdir
+test_file_handles SCRATCH_MNT.2/lowertestdir -p
+test_file_handles SCRATCH_MNT.2/lowertestdir -wrap
+test_file_handles SCRATCH_MNT.2/uppertestdir -a
+test_file_handles SCRATCH_MNT.2/uppertestdir -r
+test_file_handles SCRATCH_MNT.2/lowertestdir -a
+test_file_handles SCRATCH_MNT.2/lowertestdir -r
+test_file_handles SCRATCH_MNT.2/uppertestdir -dk
+test_file_handles SCRATCH_MNT.2/uppertestdir.rw -rwdk
+test_file_handles SCRATCH_MNT.2/lowertestdir -dk
+test_file_handles SCRATCH_MNT.2/lowertestdir.rw -rwdk
+test_file_handles SCRATCH_MNT.2/uppertestdir -dp
+test_file_handles SCRATCH_MNT.2/lowertestdir -dp
+test_file_handles SCRATCH_MNT.2/uppertestdir
+test_file_handles SCRATCH_MNT.2/uppertestdir -wlr
+test_file_handles SCRATCH_MNT.2/uppertestdir -ur
+test_file_handles SCRATCH_MNT.2/lowertestdir
+test_file_handles SCRATCH_MNT.2/lowertestdir -wlr
+test_file_handles SCRATCH_MNT.2/lowertestdir -ur
+test_file_handles SCRATCH_MNT.2/uppertestdir
+test_file_handles SCRATCH_MNT.2/uppertestdir -wur
+test_file_handles SCRATCH_MNT.2/lowertestdir
+test_file_handles SCRATCH_MNT.2/lowertestdir -wur
+test_file_handles SCRATCH_MNT.2/uppertestdir
+test_file_handles SCRATCH_MNT.2/uppertestdir -d
+test_file_handles SCRATCH_MNT.2/lowertestdir
+test_file_handles SCRATCH_MNT.2/lowertestdir -d
+test_file_handles SCRATCH_MNT.2/uppertestdir -wmr
+test_file_handles SCRATCH_MNT.2/lowertestdir -wmr
+test_file_handles SCRATCH_MNT.2/uppertestdir -o upper_file_handles
+test_file_handles SCRATCH_MNT.2/lowertestdir -o lower_file_handles
+test_file_handles SCRATCH_MNT.2 -r -i upper_file_handles
+test_file_handles SCRATCH_MNT.2 -r -i lower_file_handles
+test_file_handles SCRATCH_MNT.2/uppertestdir.up -o upper_file_handles
+test_file_handles SCRATCH_MNT.2/uppertestdir.lo -o lower_file_handles
+test_file_handles SCRATCH_MNT.2 -r -i upper_file_handles
+test_file_handles SCRATCH_MNT.2 -r -i lower_file_handles
+test_file_handles SCRATCH_MNT.2/uppertestdir -p -o upper_file_handles
+test_file_handles SCRATCH_MNT.2/lowertestdir -p -o lower_file_handles
+test_file_handles SCRATCH_MNT.2/uppertestdir/subdir -p -o upper_subdir_file_handles
+test_file_handles SCRATCH_MNT.2/lowertestdir/subdir -p -o lower_subdir_file_handles
+test_file_handles SCRATCH_MNT.2 -rp -i upper_file_handles
+test_file_handles SCRATCH_MNT.2 -rp -i lower_file_handles
+test_file_handles SCRATCH_MNT.2 -rp -i upper_subdir_file_handles
+test_file_handles SCRATCH_MNT.2 -rp -i lower_subdir_file_handles
+test_file_handles SCRATCH_MNT.2/lowertestdir.new -rp -i lower_subdir_file_handles
diff --git a/tests/overlay/group b/tests/overlay/group
index e809f7f2..be628dd1 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -70,3 +70,4 @@
 065 auto quick mount
 066 auto quick copyup
 067 auto quick copyup nonsamefs
+068 auto quick copyup hardlink exportfs nested
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/3] overlay: test file handles with nested overlay on another fs
  2019-12-21 18:51 [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
  2019-12-21 18:51 ` [PATCH 1/3] overlay: create the overlay/nested test group Amir Goldstein
  2019-12-21 18:51 ` [PATCH 2/3] overlay: test file handles with nested overlay on the same fs Amir Goldstein
@ 2019-12-21 18:51 ` Amir Goldstein
  2019-12-22 21:19 ` [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
  3 siblings, 0 replies; 5+ messages in thread
From: Amir Goldstein @ 2019-12-21 18:51 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, linux-unionfs, fstests

This is a variant of overlay file handles test for an overlayfs that
is nested over another lower overlayfs on another fs.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 tests/overlay/069     | 306 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/069.out |  50 +++++++
 tests/overlay/group   |   1 +
 3 files changed, 357 insertions(+)
 create mode 100755 tests/overlay/069
 create mode 100644 tests/overlay/069.out

diff --git a/tests/overlay/069 b/tests/overlay/069
new file mode 100755
index 00000000..50799960
--- /dev/null
+++ b/tests/overlay/069
@@ -0,0 +1,306 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2018 CTERA Networks. All Rights Reserved.
+#
+# FS QA Test No. 069
+#
+# Test encode/decode of nested overlay file handles
+#
+# This is a variant of overlay file handles test for an overlayfs that is
+# nested over another lower overlayfs on another fs.
+#
+# - Check encode/write/decode/read content of lower/upper file handles
+# - Check encode/decode/write/read content of lower/upper file handles
+# - Check decode/read of unlinked lower/upper files and directories
+# - Check decode/read of lower file handles after copy up, link and unlink
+# - Check decode/read of lower file handles after rename of parent and self
+#
+# This test does not cover connectable file handles of non-directories,
+# because name_to_handle_at() syscall does not support requesting connectable
+# file handles.
+#
+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.*
+	# Unmount the nested overlay mount
+	$UMOUNT_PROG $mnt2 2>/dev/null
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# real QA test starts here
+
+_supported_fs overlay
+_supported_os Linux
+_require_test
+_require_scratch
+# _require_exportfs already requires open_by_handle, but let's not count on it
+_require_test_program "open_by_handle"
+# We need to require all features together, because nfs_export cannot
+# be enabled when index is disabled
+_require_scratch_overlay_features index nfs_export redirect_dir
+
+# Lower dir of nested overlay is the scratch overlay mount at SCRATCH_MNT
+upper2=$OVL_BASE_TEST_DIR/$OVL_UPPER.2
+work2=$OVL_BASE_TEST_DIR/$OVL_WORK.2
+mnt2=$OVL_BASE_TEST_DIR/$OVL_MNT.2
+
+lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER/lowertestdir
+upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER/uppertestdir
+lowertestdir=$mnt2/lowertestdir
+uppertestdir=$mnt2/uppertestdir
+NUMFILES=1
+
+# Create test dir and empty test files
+create_test_files()
+{
+	local dir=$1
+	local opt=$2
+
+	src/open_by_handle -cp $opt $dir $NUMFILES
+}
+
+# Test encode/decode file handles on overlay mount
+test_file_handles()
+{
+	local dir=$1
+	shift
+
+	echo test_file_handles $dir $* | _filter_test_dir | _filter_ovl_dirs | \
+				sed -e "s,$tmp\.,,g"
+	$here/src/open_by_handle $* $dir $NUMFILES
+}
+
+# Re-create lower/upper/work dirs
+create_dirs()
+{
+	# Create the underlying overlay dirs
+	_scratch_mkfs
+
+	# Re-create the nested overlay upper dirs
+	rm -rf $upper2 $work2 $mnt2
+	mkdir $upper2 $work2 $mnt2
+}
+
+# Mount a nested overlay with $SCRATCH_MNT as lower layer
+mount_dirs()
+{
+	# Mount the underlying overlay
+	_scratch_mount -o "index=on,nfs_export=on,redirect_dir=on"
+
+	# Mount the nested overlay
+	_overlay_mount_dirs $SCRATCH_MNT $upper2 $work2 overlay2 $mnt2 \
+		-o "index=on,nfs_export=on,redirect_dir=on" 2>/dev/null ||
+		_notrun "cannot mount nested overlay with nfs_export=on option"
+	_fs_options overlay2 | grep -q "nfs_export=on" || \
+		_notrun "cannot enable nfs_export feature on nested overlay"
+}
+
+# Unmount the nested overlay mount and check underlying overlay layers
+unmount_dirs()
+{
+	# unmount & check nested overlay
+	$UMOUNT_PROG $mnt2
+	_overlay_check_dirs $SCRATCH_MNT $upper2 $work2 \
+		-o "index=on,nfs_export=on,redirect_dir=on"
+
+	# unmount & check underlying overlay
+	_scratch_unmount
+	_check_scratch_fs
+}
+
+# Check non-stale file handles of lower/upper files and verify
+# that handle decoded before copy up is encoded to upper after
+# copy up. Verify reading data from file open by file handle
+# and verify access_at() with dirfd open by file handle.
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode of upper regular file handles
+test_file_handles $uppertestdir
+# Check encode/decode of upper dir file handle
+test_file_handles $uppertestdir -p
+# Check encode/write/decode/read/write of upper file handles
+test_file_handles $uppertestdir -wrap
+# Check encode/decode of lower regular file handles before copy up
+test_file_handles $lowertestdir
+# Check encode/decode of lower dir file handles before copy up
+test_file_handles $lowertestdir -p
+# Check encode/write/decode/read/write of lower file handles across copy up
+test_file_handles $lowertestdir -wrap
+unmount_dirs
+
+# Check copy up after encode/decode of lower/upper files
+# (copy up of disconnected dentry to index dir)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode/write/read of upper regular file handles
+test_file_handles $uppertestdir -a
+test_file_handles $uppertestdir -r
+# Check encode/decode/write/read of lower regular file handles
+test_file_handles $lowertestdir -a
+test_file_handles $lowertestdir -r
+unmount_dirs
+
+# Check non-stale handles to unlinked but open lower/upper files
+create_dirs
+create_test_files $upperdir
+create_test_files $upperdir.rw
+create_test_files $lowerdir
+create_test_files $lowerdir.rw
+mount_dirs
+test_file_handles $uppertestdir -dk
+# Check encode/write/unlink/decode/read of upper regular file handles
+test_file_handles $uppertestdir.rw -rwdk
+test_file_handles $lowertestdir -dk
+# Check encode/write/unlink/decode/read of lower file handles across copy up
+test_file_handles $lowertestdir.rw -rwdk
+unmount_dirs
+
+# Check stale handles of unlinked lower/upper files (nlink = 1,0)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check decode of upper file handles after unlink/rmdir (nlink == 0)
+test_file_handles $uppertestdir -dp
+# Check decode of lower file handles after unlink/rmdir (nlink == 0)
+test_file_handles $lowertestdir -dp
+unmount_dirs
+
+# Check non-stale file handles of linked lower/upper files (nlink = 1,2,1)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check encode/decode of upper file handles (nlink == 1)
+test_file_handles $uppertestdir
+# Check decode/read of upper file handles after link (nlink == 2)
+test_file_handles $uppertestdir -wlr
+# Check decode/read of upper file handles after link + unlink (nlink == 1)
+test_file_handles $uppertestdir -ur
+# Check encode/decode of lower file handles before copy up (nlink == 1)
+test_file_handles $lowertestdir
+# Check decode/read of lower file handles after copy up + link (nlink == 2)
+test_file_handles $lowertestdir -wlr
+# Check decode/read of lower file handles after copy up + link + unlink (nlink == 1)
+test_file_handles $lowertestdir -ur
+unmount_dirs
+
+# Check non-stale file handles of linked lower/upper hardlinks (nlink = 2,1)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+# Create lower/upper hardlinks
+test_file_handles $lowerdir -l >/dev/null
+test_file_handles $upperdir -l >/dev/null
+mount_dirs
+# Check encode/decode of upper hardlink file handles (nlink == 2)
+test_file_handles $uppertestdir
+# Check decode/read of upper hardlink file handles after unlink (nlink == 1)
+test_file_handles $uppertestdir -wur
+# Check encode/decode of lower hardlink file handles before copy up (nlink == 2)
+test_file_handles $lowertestdir
+# Check decode/read of lower hardlink file handles after copy up + unlink (nlink == 1)
+test_file_handles $lowertestdir -wur
+unmount_dirs
+
+# Check stale file handles of unlinked lower/upper hardlinks (nlink = 2,0)
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+# Create lower/upper hardlinks
+test_file_handles $lowerdir -l >/dev/null
+test_file_handles $upperdir -l >/dev/null
+mount_dirs
+# Check encode/decode of upper hardlink file handles (nlink == 2)
+test_file_handles $uppertestdir
+# Check decode of upper hardlink file handles after 2*unlink (nlink == 0)
+test_file_handles $uppertestdir -d
+# Check encode/decode of lower hardlink file handles before copy up (nlink == 2)
+test_file_handles $lowertestdir
+# Check decode of lower hardlink file handles after copy up + 2*unlink (nlink == 0)
+test_file_handles $lowertestdir -d
+unmount_dirs
+
+# Check non-stale file handles of lower/upper renamed files
+create_dirs
+create_test_files $upperdir
+create_test_files $lowerdir
+mount_dirs
+# Check decode/read of upper file handles after rename in same upper parent
+test_file_handles $uppertestdir -wmr
+# Check decode/read of lower file handles after copy up + rename in same merge parent
+test_file_handles $lowertestdir -wmr
+unmount_dirs
+
+# Check non-stale file handles of lower/upper moved files
+create_dirs
+create_test_files $upperdir -w
+create_test_files $lowerdir -w
+mkdir -p $lowerdir.lo $lowerdir.up $upperdir.lo $upperdir.up
+mount_dirs
+# Check encode/decode/read of lower/upper file handles after move to new upper testdir
+test_file_handles $uppertestdir -o $tmp.upper_file_handles
+test_file_handles $lowertestdir -o $tmp.lower_file_handles
+mv $uppertestdir/* $uppertestdir.up/
+mv $lowertestdir/* $uppertestdir.lo/
+# Check open and read from stored file handles
+test_file_handles $mnt2 -r -i $tmp.upper_file_handles
+test_file_handles $mnt2 -r -i $tmp.lower_file_handles
+# Check encode/decode/read of lower/upper file handles after move to new merge testdir
+test_file_handles $uppertestdir.up -o $tmp.upper_file_handles
+test_file_handles $uppertestdir.lo -o $tmp.lower_file_handles
+mv $uppertestdir.up/* $lowertestdir.up/
+mv $uppertestdir.lo/* $lowertestdir.lo/
+# Check open and read from stored file handles
+test_file_handles $mnt2 -r -i $tmp.upper_file_handles
+test_file_handles $mnt2 -r -i $tmp.lower_file_handles
+unmount_dirs
+
+# Check non-stale file handles of lower/upper renamed dirs
+create_dirs
+create_test_files $upperdir -w
+create_test_files $lowerdir -w
+create_test_files $upperdir/subdir -w
+create_test_files $lowerdir/subdir -w
+mount_dirs
+# Check encode/decode/read of lower/upper file handles after rename of testdir
+test_file_handles $uppertestdir -p -o $tmp.upper_file_handles
+test_file_handles $lowertestdir -p -o $tmp.lower_file_handles
+# Check encode/decode/read of lower/upper file handles after rename of testdir's parent
+test_file_handles $uppertestdir/subdir -p -o $tmp.upper_subdir_file_handles
+test_file_handles $lowertestdir/subdir -p -o $tmp.lower_subdir_file_handles
+# Rename pure upper dir
+mv $uppertestdir $uppertestdir.new/
+# Copy up lower dir, index and rename
+mv $lowertestdir $lowertestdir.new/
+# Check open, read and readdir from stored file handles
+# (testdir argument is the mount point and NOT the dir
+#  we are trying to open by stored file handle)
+test_file_handles $mnt2 -rp -i $tmp.upper_file_handles
+test_file_handles $mnt2 -rp -i $tmp.lower_file_handles
+test_file_handles $mnt2 -rp -i $tmp.upper_subdir_file_handles
+test_file_handles $mnt2 -rp -i $tmp.lower_subdir_file_handles
+# Retry decoding lower subdir file handle when indexed testdir is in dcache
+# (providing renamed testdir argument pins the indexed testdir to dcache)
+test_file_handles $lowertestdir.new -rp -i $tmp.lower_subdir_file_handles
+unmount_dirs
+
+status=0
+exit
diff --git a/tests/overlay/069.out b/tests/overlay/069.out
new file mode 100644
index 00000000..583588c0
--- /dev/null
+++ b/tests/overlay/069.out
@@ -0,0 +1,50 @@
+QA output created by 069
+test_file_handles TEST_DIR.2/uppertestdir
+test_file_handles TEST_DIR.2/uppertestdir -p
+test_file_handles TEST_DIR.2/uppertestdir -wrap
+test_file_handles TEST_DIR.2/lowertestdir
+test_file_handles TEST_DIR.2/lowertestdir -p
+test_file_handles TEST_DIR.2/lowertestdir -wrap
+test_file_handles TEST_DIR.2/uppertestdir -a
+test_file_handles TEST_DIR.2/uppertestdir -r
+test_file_handles TEST_DIR.2/lowertestdir -a
+test_file_handles TEST_DIR.2/lowertestdir -r
+test_file_handles TEST_DIR.2/uppertestdir -dk
+test_file_handles TEST_DIR.2/uppertestdir.rw -rwdk
+test_file_handles TEST_DIR.2/lowertestdir -dk
+test_file_handles TEST_DIR.2/lowertestdir.rw -rwdk
+test_file_handles TEST_DIR.2/uppertestdir -dp
+test_file_handles TEST_DIR.2/lowertestdir -dp
+test_file_handles TEST_DIR.2/uppertestdir
+test_file_handles TEST_DIR.2/uppertestdir -wlr
+test_file_handles TEST_DIR.2/uppertestdir -ur
+test_file_handles TEST_DIR.2/lowertestdir
+test_file_handles TEST_DIR.2/lowertestdir -wlr
+test_file_handles TEST_DIR.2/lowertestdir -ur
+test_file_handles TEST_DIR.2/uppertestdir
+test_file_handles TEST_DIR.2/uppertestdir -wur
+test_file_handles TEST_DIR.2/lowertestdir
+test_file_handles TEST_DIR.2/lowertestdir -wur
+test_file_handles TEST_DIR.2/uppertestdir
+test_file_handles TEST_DIR.2/uppertestdir -d
+test_file_handles TEST_DIR.2/lowertestdir
+test_file_handles TEST_DIR.2/lowertestdir -d
+test_file_handles TEST_DIR.2/uppertestdir -wmr
+test_file_handles TEST_DIR.2/lowertestdir -wmr
+test_file_handles TEST_DIR.2/uppertestdir -o upper_file_handles
+test_file_handles TEST_DIR.2/lowertestdir -o lower_file_handles
+test_file_handles TEST_DIR.2 -r -i upper_file_handles
+test_file_handles TEST_DIR.2 -r -i lower_file_handles
+test_file_handles TEST_DIR.2/uppertestdir.up -o upper_file_handles
+test_file_handles TEST_DIR.2/uppertestdir.lo -o lower_file_handles
+test_file_handles TEST_DIR.2 -r -i upper_file_handles
+test_file_handles TEST_DIR.2 -r -i lower_file_handles
+test_file_handles TEST_DIR.2/uppertestdir -p -o upper_file_handles
+test_file_handles TEST_DIR.2/lowertestdir -p -o lower_file_handles
+test_file_handles TEST_DIR.2/uppertestdir/subdir -p -o upper_subdir_file_handles
+test_file_handles TEST_DIR.2/lowertestdir/subdir -p -o lower_subdir_file_handles
+test_file_handles TEST_DIR.2 -rp -i upper_file_handles
+test_file_handles TEST_DIR.2 -rp -i lower_file_handles
+test_file_handles TEST_DIR.2 -rp -i upper_subdir_file_handles
+test_file_handles TEST_DIR.2 -rp -i lower_subdir_file_handles
+test_file_handles TEST_DIR.2/lowertestdir.new -rp -i lower_subdir_file_handles
diff --git a/tests/overlay/group b/tests/overlay/group
index be628dd1..9290ce99 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -71,3 +71,4 @@
 066 auto quick copyup
 067 auto quick copyup nonsamefs
 068 auto quick copyup hardlink exportfs nested
+069 auto quick copyup hardlink exportfs nested nonsamefs
-- 
2.17.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] Nested overlay exportfs tests
  2019-12-21 18:51 [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
                   ` (2 preceding siblings ...)
  2019-12-21 18:51 ` [PATCH 3/3] overlay: test file handles with nested overlay on another fs Amir Goldstein
@ 2019-12-22 21:19 ` Amir Goldstein
  3 siblings, 0 replies; 5+ messages in thread
From: Amir Goldstein @ 2019-12-22 21:19 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, overlayfs, fstests

On Sat, Dec 21, 2019 at 8:51 PM Amir Goldstein <amir73il@gmail.com> wrote:
>
> Eryu,
>

Eryu,

Actually, I needed to make a change to overlay/069, so please hold on
with these.

For test coverage, the interesting cases for nested overlay are:
- lower overlay is samefs
- lower overlay is non-samefs

That last case is especially interesting to exercise xino bit overflow,
because lower overlay uses the high ino bits.

This is not how I implemented overlay/069, so I made this change and
it caught another bug in upstream.

I have more nested tests coming soon, so I will post those along
with v2 of these tests.

Thanks and sorry for the noise,
Amir.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, back to index

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-21 18:51 [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein
2019-12-21 18:51 ` [PATCH 1/3] overlay: create the overlay/nested test group Amir Goldstein
2019-12-21 18:51 ` [PATCH 2/3] overlay: test file handles with nested overlay on the same fs Amir Goldstein
2019-12-21 18:51 ` [PATCH 3/3] overlay: test file handles with nested overlay on another fs Amir Goldstein
2019-12-22 21:19 ` [PATCH 0/3] Nested overlay exportfs tests Amir Goldstein

($INBOX_DIR/description missing)

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-unionfs/0 linux-unionfs/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-unionfs linux-unionfs/ https://lore.kernel.org/linux-unionfs \
		linux-unionfs@vger.kernel.org
	public-inbox-index linux-unionfs

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-unionfs


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git