linux-unionfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] Nested overlay tests
@ 2019-12-30 14:14 Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 1/5] overlay: create the overlay/nested test group Amir Goldstein
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, linux-unionfs, fstests

Hi Eryu,

This v2 post includes two more nested overlay tests.

As described in previous post [1] the purpose of these tests
is not so much to validate the setup of nested overlayfs, which
is a less common setup, but to provide test coverage for some
overlayfs fixes that were merge in v5.5-rc2 as well as some fixes
that have been posted since.

Specifically, test overlay/071 exercises a "nested xino setup".
This setup results in "xino bit overlflow", a corner case that did
not have test coverage until now. This test fails on current upstream
because of an overlayfs bug [2].

On top of that, both overlay/070 and overlay/071 fail on current
upstream, because of a /proc/locks format bug [3].

Thanks,
Amir.

[1] https://lore.kernel.org/fstests/20191221185149.17509-1-amir73il@gmail.com/
[2] https://marc.info/?l=linux-unionfs&m=157708323410613&w=2
[3] https://lore.kernel.org/linux-fsdevel/e5d1c0a5e5e92083d8ce0bc1e48194a6d70fb918.camel@kernel.org/

Amir Goldstein (5):
  overlay: create the overlay/nested test group
  overlay: test file handles with nested overlay over samefs lower
  overlay: test file handles with nested overlay over non-samefs lower
  overlay: test constant ino with nested overlay over samefs lower
  overlay: test constant ino with nested overlay over non-samefs lower

 tests/overlay/068     | 304 ++++++++++++++++++++++++++++++++++++++++
 tests/overlay/068.out |  50 +++++++
 tests/overlay/069     | 313 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/069.out |  50 +++++++
 tests/overlay/070     | 222 ++++++++++++++++++++++++++++++
 tests/overlay/070.out |   2 +
 tests/overlay/071     | 236 +++++++++++++++++++++++++++++++
 tests/overlay/071.out |   2 +
 tests/overlay/group   |   8 +-
 9 files changed, 1185 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
 create mode 100755 tests/overlay/070
 create mode 100644 tests/overlay/070.out
 create mode 100755 tests/overlay/071
 create mode 100644 tests/overlay/071.out

-- 
2.17.1

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

* [PATCH v2 1/5] overlay: create the overlay/nested test group
  2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
@ 2019-12-30 14:14 ` Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 2/5] overlay: test file handles with nested overlay over samefs lower Amir Goldstein
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, 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 related	[flat|nested] 9+ messages in thread

* [PATCH v2 2/5] overlay: test file handles with nested overlay over samefs lower
  2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 1/5] overlay: create the overlay/nested test group Amir Goldstein
@ 2019-12-30 14:14 ` Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 3/5] overlay: test file handles with nested overlay over non-samefs lower Amir Goldstein
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, 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) 2019 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 related	[flat|nested] 9+ messages in thread

* [PATCH v2 3/5] overlay: test file handles with nested overlay over non-samefs lower
  2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 1/5] overlay: create the overlay/nested test group Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 2/5] overlay: test file handles with nested overlay over samefs lower Amir Goldstein
@ 2019-12-30 14:14 ` Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower Amir Goldstein
  2019-12-30 14:14 ` [PATCH v2 5/5] overlay: test constant ino with nested overlay over non-samefs lower Amir Goldstein
  4 siblings, 0 replies; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, linux-unionfs, fstests

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

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 tests/overlay/069     | 313 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/069.out |  50 +++++++
 tests/overlay/group   |   1 +
 3 files changed, 364 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..efa95f38
--- /dev/null
+++ b/tests/overlay/069
@@ -0,0 +1,313 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2019 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 non-samefs.
+#
+# - 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_nocheck
+# _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 overlay lower layer is on test fs, upper is on scratch fs
+lower=$OVL_BASE_TEST_MNT/$OVL_LOWER-$seq
+upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
+work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
+
+# 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=$lower/lowertestdir
+upperdir=$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 $lower $upper2 $work2 $mnt2
+	mkdir $lower $upper2 $work2 $mnt2
+}
+
+# Mount a nested overlay with $SCRATCH_MNT as lower layer
+mount_dirs()
+{
+	# Mount the underlying non-samefs overlay
+	_overlay_mount_dirs $lower $upper $work overlay1 $SCRATCH_MNT \
+		-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
+	$UMOUNT_PROG $SCRATCH_MNT
+	_overlay_check_dirs $lower $upper $work \
+		-o "index=on,nfs_export=on,redirect_dir=on"
+}
+
+# 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 related	[flat|nested] 9+ messages in thread

* [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower
  2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
                   ` (2 preceding siblings ...)
  2019-12-30 14:14 ` [PATCH v2 3/5] overlay: test file handles with nested overlay over non-samefs lower Amir Goldstein
@ 2019-12-30 14:14 ` Amir Goldstein
  2020-03-16 12:28   ` Miklos Szeredi
  2019-12-30 14:14 ` [PATCH v2 5/5] overlay: test constant ino with nested overlay over non-samefs lower Amir Goldstein
  4 siblings, 1 reply; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, linux-unionfs, fstests

Also test that d_ino of readdir entries and i_ino from /proc/locks are
consistent with st_ino and that inode numbers persist after rename to
new parent, drop caches and mount cycle.

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

diff --git a/tests/overlay/070 b/tests/overlay/070
new file mode 100755
index 00000000..5782ecdd
--- /dev/null
+++ b/tests/overlay/070
@@ -0,0 +1,222 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2019 CTERA Networks. All Rights Reserved.
+#
+# FSQA Test No. 070
+#
+# This is a variant of overlay/017 to test constant st_ino numbers for
+# nested overlay setup, where all layers of both overlays are on the
+# same fs.
+#
+# This simple test demonstrates a known issue with overlayfs:
+# - stat file A shows inode number X
+# - modify A to trigger copy up
+# - stat file A shows inode number Y != X
+#
+# Also test that d_ino of readdir entries and i_ino from /proc/locks are
+# consistent with st_ino and that inode numbers persist after rename to
+# new parent, drop caches and mount cycle.
+#
+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_nocheck
+_require_test_program "af_unix"
+_require_test_program "t_dir_type"
+# 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=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
+upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
+work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
+# 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=$lower/lowertestdir
+upperdir=$upper/uppertestdir
+lowertestdir=$mnt2/lowertestdir
+uppertestdir=$mnt2/uppertestdir
+
+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 with file handle support
+	_scratch_mount -o "index=on,nfs_export=on"
+
+	# Mount the nested overlay
+	# Enable redirect_dir for renaming a merge directory.
+	# Enabling xino in this test requires that base filesystem inode numbers will
+	# not use bit 63 in inode number of the test files, because bit 63 is used by
+	# overlayfs to indicate the layer. Let's just assume that this is true for all
+	# tested filesystems and if we are wrong, the test may fail.
+	_overlay_mount_dirs $SCRATCH_MNT $upper2 $work2 overlay2 $mnt2 \
+		-o "redirect_dir=on,index=on,xino=on" || \
+		_notrun "cannot mount nested overlay with xino=on option"
+	_fs_options overlay2 | grep -q "xino=on" || \
+		_notrun "cannot enable xino 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 "redirect_dir=on,index=on,xino=on"
+
+	# unmount & check underlying overlay
+	$UMOUNT_PROG $SCRATCH_MNT
+	_overlay_check_scratch_dirs $lower $upper $work \
+		-o "index=on,nfs_export=on"
+}
+
+FILES="dir file symlink link chrdev blkdev fifo socket"
+
+create_test_files()
+{
+	local dir=$1
+
+	# Create our test files.
+	mkdir -p $dir/dir
+	touch $dir/file
+	ln -s $dir/file $dir/symlink
+	touch $dir/link
+	ln $dir/link $dir/link2
+	mknod $dir/chrdev c 1 1
+	mknod $dir/blkdev b 1 1
+	mknod $dir/fifo p
+	$here/src/af_unix $dir/socket
+}
+
+# Record inode numbers in format <ino> <basename>
+record_inode_numbers()
+{
+	local dir=$1
+	local outfile=$2
+
+	echo "record_inode_numbers $outfile" >> $seqres.full
+
+	for n in $FILES; do
+		ls -id $dir/$n
+	done | \
+	while read ino file; do
+		f=`basename $file`
+		echo $ino $f | tee -a $seqres.full >> $outfile
+		# /proc/locks exposes i_ino - compare it to st_ino. flock -n
+		# doesn't follow symlink, blocks on fifo and fails on socket
+		[[ $f =~ fifo|socket|symlink ]] || \
+		flock -n $file cat /proc/locks | tee -a $seqres.full | grep -q ":$ino " || \
+			echo "lock for $f not found by ino $ino ($outfile) - see $seqres.full"
+	done
+}
+
+# Check inode numbers match recorder inode numbers
+check_inode_numbers()
+{
+	local dir=$1
+	local before=$2
+	local after=$3
+
+	record_inode_numbers $dir $after
+
+	# Test constant stat(2) st_ino -
+	# Compare before..after - expect silence
+	# We use diff -u so out.bad will tell us which stage failed
+	diff -u $before $after
+
+	# Test constant readdir(3)/getdents(2) d_ino -
+	# Expect to find file by inode number
+	cat $before | while read ino f; do
+		$here/src/t_dir_type $dir $ino | tee -a $seqres.full | grep -q $f || \
+			echo "$f not found by ino $ino (from $before) - see $seqres.full"
+	done
+}
+
+rm -f $seqres.full
+
+create_dirs
+
+create_test_files $lowerdir
+create_test_files $upperdir
+
+mount_dirs
+
+# Record inode numbers in the lower overlay
+record_inode_numbers $SCRATCH_MNT/lowertestdir $tmp.lower.lo
+record_inode_numbers $SCRATCH_MNT/uppertestdir $tmp.lower.up
+
+# Record inode numbers before copy up
+record_inode_numbers $lowertestdir $tmp.before.lo
+record_inode_numbers $uppertestdir $tmp.before.up
+
+# Copy up all files
+for f in $FILES; do
+	# chown -h modifies all those file types
+	chown -h 100 $lowertestdir/$f
+	chown -h 100 $uppertestdir/$f
+done
+
+# Compare inode numbers before/after copy up
+check_inode_numbers $lowertestdir $tmp.before.lo $tmp.after_copyup.lo
+check_inode_numbers $uppertestdir $tmp.before.up $tmp.after_copyup.up
+
+# Move all files to another dir
+mkdir $lowertestdir.2 $uppertestdir.2
+
+for f in $FILES; do
+	mv $lowertestdir/$f $lowertestdir.2/
+	mv $uppertestdir/$f $uppertestdir.2/
+done
+
+echo 3 > /proc/sys/vm/drop_caches
+
+# Compare inode numbers before/after rename and drop caches
+check_inode_numbers $lowertestdir.2 $tmp.after_copyup.lo $tmp.after_move.lo
+check_inode_numbers $uppertestdir.2 $tmp.after_copyup.up $tmp.after_move.up
+
+# Verify that the inode numbers survive a mount cycle
+unmount_dirs
+mount_dirs
+
+# Compare inode numbers before/after mount cycle
+check_inode_numbers $lowertestdir.2 $tmp.after_move.lo $tmp.after_cycle.lo
+check_inode_numbers $uppertestdir.2 $tmp.after_move.up $tmp.after_cycle.up
+
+unmount_dirs
+
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/overlay/070.out b/tests/overlay/070.out
new file mode 100644
index 00000000..8940c5da
--- /dev/null
+++ b/tests/overlay/070.out
@@ -0,0 +1,2 @@
+QA output created by 070
+Silence is golden
diff --git a/tests/overlay/group b/tests/overlay/group
index 9290ce99..45f6885b 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -72,3 +72,4 @@
 067 auto quick copyup nonsamefs
 068 auto quick copyup hardlink exportfs nested
 069 auto quick copyup hardlink exportfs nested nonsamefs
+070 auto quick copyup redirect nested
-- 
2.17.1

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

* [PATCH v2 5/5] overlay: test constant ino with nested overlay over non-samefs lower
  2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
                   ` (3 preceding siblings ...)
  2019-12-30 14:14 ` [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower Amir Goldstein
@ 2019-12-30 14:14 ` Amir Goldstein
  4 siblings, 0 replies; 9+ messages in thread
From: Amir Goldstein @ 2019-12-30 14:14 UTC (permalink / raw)
  To: Eryu Guan; +Cc: Miklos Szeredi, Jeff Layton, linux-unionfs, fstests

Also test that d_ino of readdir entries and i_ino from /proc/locks are
consistent with st_ino and that inode numbers persist after rename to
new parent, drop caches and mount cycle.

With nested xino configuration, directory st_ino is not persistent and
its st_ino/d_ino/i_ino values are not consistent, so test only non-dir
in this test.

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

diff --git a/tests/overlay/071 b/tests/overlay/071
new file mode 100755
index 00000000..31a9d54e
--- /dev/null
+++ b/tests/overlay/071
@@ -0,0 +1,236 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2019 CTERA Networks. All Rights Reserved.
+#
+# FSQA Test No. 071
+#
+# This is a variant of overlay/017 to test constant st_ino numbers for
+# nested overlay setup, where lower overlay layers are not on the same fs.
+#
+# This simple test demonstrates a known issue with overlayfs:
+# - stat file A shows inode number X
+# - modify A to trigger copy up
+# - stat file A shows inode number Y != X
+#
+# Also test that d_ino of readdir entries and i_ino from /proc/locks are
+# consistent with st_ino and that inode numbers persist after rename to
+# new parent, drop caches and mount cycle.
+#
+# With nested xino configuration, directory st_ino is not persistent and
+# its st_ino/d_ino/i_ino values are not consistent, so test only non-dir
+# in this test.
+#
+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_nocheck
+_require_test_program "af_unix"
+_require_test_program "t_dir_type"
+# 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 overlay lower layer is on test fs, upper is on scratch fs
+lower=$OVL_BASE_TEST_MNT/$OVL_LOWER-$seq
+upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
+work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
+# Lower dir of nested overlay is the scratch overlay mount at SCRATCH_MNT
+upper2=$OVL_BASE_SCRATCH_DIR/$OVL_UPPER.2
+work2=$OVL_BASE_SCRATCH_DIR/$OVL_WORK.2
+mnt2=$OVL_BASE_SCRATCH_DIR/$OVL_MNT.2
+
+lowerdir=$lower/lowertestdir
+upperdir=$upper/uppertestdir
+lowertestdir=$mnt2/lowertestdir
+uppertestdir=$mnt2/uppertestdir
+
+create_dirs()
+{
+	# Create the underlying overlay dirs
+	_scratch_mkfs
+
+	# Re-create the nested overlay upper dirs
+	rm -rf $lower $upper2 $work2 $mnt2
+	mkdir $lower $upper2 $work2 $mnt2
+}
+
+# Mount a nested overlay with $SCRATCH_MNT as lower layer
+mount_dirs()
+{
+	# Mount the underlying overlay with file handle support
+	_overlay_mount_dirs $lower $upper $work overlay1 $SCRATCH_MNT \
+		-o "index=on,nfs_export=on,xino=on" || \
+                _notrun "cannot mount overlay with xino=on option"
+	_fs_options overlay1 | grep -q "xino=on" || \
+		_notrun "cannot enable xino feature on overlay"
+
+	# Mount the nested overlay
+	# Enable redirect_dir for renaming a merge directory.
+	# Enabling xino in this test requires that base filesystem inode numbers will
+	# not use bit 63 in inode number of the test files, because bit 63 is used by
+	# overlayfs to indicate the layer. Let's just assume that this is true for all
+	# tested filesystems and if we are wrong, the test may fail.
+	_overlay_mount_dirs $SCRATCH_MNT $upper2 $work2 overlay2 $mnt2 \
+		-o "redirect_dir=on,index=on,xino=on" || \
+		_notrun "cannot mount nested overlay with xino=on option"
+	_fs_options overlay2 | grep -q "xino=on" || \
+		_notrun "cannot enable xino 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 "redirect_dir=on,index=on,xino=on"
+
+	# unmount & check underlying overlay
+	$UMOUNT_PROG $SCRATCH_MNT
+	_overlay_check_dirs $lower $upper $work \
+		-o "index=on,nfs_export=on"
+}
+
+FILES="file symlink link chrdev blkdev fifo socket"
+
+create_test_files()
+{
+	local dir=$1
+
+	# Create our test files.
+	mkdir -p $dir
+	touch $dir/file
+	ln -s $dir/file $dir/symlink
+	touch $dir/link
+	ln $dir/link $dir/link2
+	mknod $dir/chrdev c 1 1
+	mknod $dir/blkdev b 1 1
+	mknod $dir/fifo p
+	$here/src/af_unix $dir/socket
+}
+
+# Record inode numbers in format <ino> <basename>
+record_inode_numbers()
+{
+	local dir=$1
+	local outfile=$2
+
+	echo "record_inode_numbers $outfile" >> $seqres.full
+
+	for n in $FILES; do
+		ls -id $dir/$n
+	done | \
+	while read ino file; do
+		f=`basename $file`
+		echo $ino $f | tee -a $seqres.full >> $outfile
+		# /proc/locks exposes i_ino - compare it to st_ino. flock -n
+		# doesn't follow symlink, blocks on fifo and fails on socket
+		[[ $f =~ fifo|socket|symlink ]] || \
+		flock -n $file cat /proc/locks | tee -a $seqres.full | grep -q ":$ino " || \
+			echo "lock for $f not found by ino $ino ($outfile) - see $seqres.full"
+	done
+}
+
+# Check inode numbers match recorder inode numbers
+check_inode_numbers()
+{
+	local dir=$1
+	local before=$2
+	local after=$3
+
+	record_inode_numbers $dir $after
+
+	# Test constant stat(2) st_ino -
+	# Compare before..after - expect silence
+	# We use diff -u so out.bad will tell us which stage failed
+	diff -u $before $after
+
+	# Test constant readdir(3)/getdents(2) d_ino -
+	# Expect to find file by inode number
+	cat $before | while read ino f; do
+		$here/src/t_dir_type $dir $ino | tee -a $seqres.full | grep -q $f || \
+			echo "$f not found by ino $ino (from $before) - see $seqres.full"
+	done
+}
+
+rm -f $seqres.full
+
+create_dirs
+
+create_test_files $lowerdir
+create_test_files $upperdir
+
+mount_dirs
+
+# Record inode numbers in the lower overlay
+record_inode_numbers $SCRATCH_MNT/lowertestdir $tmp.lower.lo
+record_inode_numbers $SCRATCH_MNT/uppertestdir $tmp.lower.up
+
+# Compare inode numbers in lower overlay vs. nested overlay
+# With nested xino lower/lower, all inode numbers overflow xino bits and
+# d_ino/i_ino in nested overlay are the same as in lower overlay.
+check_inode_numbers $lowertestdir $tmp.lower.lo $tmp.before.lo
+
+# Record inode numbers before copy up from nested upper
+record_inode_numbers $uppertestdir $tmp.before.up
+
+# Copy up all files
+for f in $FILES; do
+	# chown -h modifies all those file types
+	chown -h 100 $lowertestdir/$f
+	chown -h 100 $uppertestdir/$f
+done
+
+# Compare inode numbers before/after copy up
+check_inode_numbers $lowertestdir $tmp.before.lo $tmp.after_copyup.lo
+check_inode_numbers $uppertestdir $tmp.before.up $tmp.after_copyup.up
+
+# Move all files to another dir
+mkdir $lowertestdir.2 $uppertestdir.2
+
+for f in $FILES; do
+	mv $lowertestdir/$f $lowertestdir.2/
+	mv $uppertestdir/$f $uppertestdir.2/
+done
+
+echo 3 > /proc/sys/vm/drop_caches
+
+# Compare inode numbers before/after rename and drop caches
+check_inode_numbers $lowertestdir.2 $tmp.after_copyup.lo $tmp.after_move.lo
+check_inode_numbers $uppertestdir.2 $tmp.after_copyup.up $tmp.after_move.up
+
+# Verify that the inode numbers survive a mount cycle
+unmount_dirs
+mount_dirs
+
+# Compare inode numbers before/after mount cycle
+check_inode_numbers $lowertestdir.2 $tmp.after_move.lo $tmp.after_cycle.lo
+check_inode_numbers $uppertestdir.2 $tmp.after_move.up $tmp.after_cycle.up
+
+unmount_dirs
+
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/overlay/071.out b/tests/overlay/071.out
new file mode 100644
index 00000000..9a9ef40a
--- /dev/null
+++ b/tests/overlay/071.out
@@ -0,0 +1,2 @@
+QA output created by 071
+Silence is golden
diff --git a/tests/overlay/group b/tests/overlay/group
index 45f6885b..2a45ae5f 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -73,3 +73,4 @@
 068 auto quick copyup hardlink exportfs nested
 069 auto quick copyup hardlink exportfs nested nonsamefs
 070 auto quick copyup redirect nested
+071 auto quick copyup redirect nested nonsamefs
-- 
2.17.1

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

* Re: [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower
  2019-12-30 14:14 ` [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower Amir Goldstein
@ 2020-03-16 12:28   ` Miklos Szeredi
  2020-03-16 13:52     ` Amir Goldstein
  0 siblings, 1 reply; 9+ messages in thread
From: Miklos Szeredi @ 2020-03-16 12:28 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Eryu Guan, Jeff Layton, overlayfs, fstests

On Mon, Dec 30, 2019 at 3:14 PM Amir Goldstein <amir73il@gmail.com> wrote:
>
> Also test that d_ino of readdir entries and i_ino from /proc/locks are
> consistent with st_ino and that inode numbers persist after rename to
> new parent, drop caches and mount cycle.

overlay/070 and overlay/071 fail for me like this:

     QA output created by 071
    +flock: cannot open lock file
/scratch/ovl-mnt/lowertestdir/blkdev: No such device or address
...

I.e. there's no block dev with rdev=1/1.

I don't see any other way to fix this, than to remove the device
tests.  Why are these needed?  Is locking code in any way dependent on
file type?

Thanks,
Miklos

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

* Re: [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower
  2020-03-16 12:28   ` Miklos Szeredi
@ 2020-03-16 13:52     ` Amir Goldstein
  2020-03-16 14:01       ` Miklos Szeredi
  0 siblings, 1 reply; 9+ messages in thread
From: Amir Goldstein @ 2020-03-16 13:52 UTC (permalink / raw)
  To: Miklos Szeredi; +Cc: Eryu Guan, Jeff Layton, overlayfs, fstests

On Mon, Mar 16, 2020 at 2:29 PM Miklos Szeredi <miklos@szeredi.hu> wrote:
>
> On Mon, Dec 30, 2019 at 3:14 PM Amir Goldstein <amir73il@gmail.com> wrote:
> >
> > Also test that d_ino of readdir entries and i_ino from /proc/locks are
> > consistent with st_ino and that inode numbers persist after rename to
> > new parent, drop caches and mount cycle.
>
> overlay/070 and overlay/071 fail for me like this:
>
>      QA output created by 071
>     +flock: cannot open lock file
> /scratch/ovl-mnt/lowertestdir/blkdev: No such device or address
> ...
>
> I.e. there's no block dev with rdev=1/1.
>
> I don't see any other way to fix this, than to remove the device
> tests.

I ran into similar complain when I worked on generic/564.
Apparently, this is not the first test that uses rdev b/1/1 and c/1/1
so not sure how those tests work for everyone.
In generic/564 I used a loopdev as blockdev and /dev/zero as chardev.

> Why are these needed?  Is locking code in any way dependent on
> file type?
>

Not strictly needed.
See that they already skip file types fifo|socket|symlink.

But note that we are not testing locking, we are using /proc/locks
to get a peek at i_ino, so if we skip also blockdev and chardev, we
end up testing no special files at all for i_ino consistency.
Not the end of the world, but then again using loop dev and /dev/zero
would be quite trivial as well.

If it bothers you, I can post a fix.

Thanks,
Amir.

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

* Re: [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower
  2020-03-16 13:52     ` Amir Goldstein
@ 2020-03-16 14:01       ` Miklos Szeredi
  0 siblings, 0 replies; 9+ messages in thread
From: Miklos Szeredi @ 2020-03-16 14:01 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Eryu Guan, Jeff Layton, overlayfs, fstests

On Mon, Mar 16, 2020 at 2:52 PM Amir Goldstein <amir73il@gmail.com> wrote:
>
> On Mon, Mar 16, 2020 at 2:29 PM Miklos Szeredi <miklos@szeredi.hu> wrote:
> >
> > On Mon, Dec 30, 2019 at 3:14 PM Amir Goldstein <amir73il@gmail.com> wrote:
> > >
> > > Also test that d_ino of readdir entries and i_ino from /proc/locks are
> > > consistent with st_ino and that inode numbers persist after rename to
> > > new parent, drop caches and mount cycle.
> >
> > overlay/070 and overlay/071 fail for me like this:
> >
> >      QA output created by 071
> >     +flock: cannot open lock file
> > /scratch/ovl-mnt/lowertestdir/blkdev: No such device or address
> > ...
> >
> > I.e. there's no block dev with rdev=1/1.
> >
> > I don't see any other way to fix this, than to remove the device
> > tests.
>
> I ran into similar complain when I worked on generic/564.
> Apparently, this is not the first test that uses rdev b/1/1 and c/1/1
> so not sure how those tests work for everyone.
> In generic/564 I used a loopdev as blockdev and /dev/zero as chardev.
>
> > Why are these needed?  Is locking code in any way dependent on
> > file type?
> >
>
> Not strictly needed.
> See that they already skip file types fifo|socket|symlink.
>
> But note that we are not testing locking, we are using /proc/locks
> to get a peek at i_ino, so if we skip also blockdev and chardev, we
> end up testing no special files at all for i_ino consistency.
> Not the end of the world, but then again using loop dev and /dev/zero
> would be quite trivial as well.
>
> If it bothers you, I can post a fix.

Using /dev/loop and /dev/zero sounds good.

Thanks,
Miklos

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

end of thread, other threads:[~2020-03-16 14:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-30 14:14 [PATCH v2 0/5] Nested overlay tests Amir Goldstein
2019-12-30 14:14 ` [PATCH v2 1/5] overlay: create the overlay/nested test group Amir Goldstein
2019-12-30 14:14 ` [PATCH v2 2/5] overlay: test file handles with nested overlay over samefs lower Amir Goldstein
2019-12-30 14:14 ` [PATCH v2 3/5] overlay: test file handles with nested overlay over non-samefs lower Amir Goldstein
2019-12-30 14:14 ` [PATCH v2 4/5] overlay: test constant ino with nested overlay over samefs lower Amir Goldstein
2020-03-16 12:28   ` Miklos Szeredi
2020-03-16 13:52     ` Amir Goldstein
2020-03-16 14:01       ` Miklos Szeredi
2019-12-30 14:14 ` [PATCH v2 5/5] overlay: test constant ino with nested overlay over non-samefs lower Amir Goldstein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).