Skip to contentSkip to conversation

xfstest: overlay: Absolute redirect should be followed even if ancestor is opaque

PATCH In review Vivek Goyal 3 participants 6 messages Mar 14, 2018 – Mar 16, 2018

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 xfstest: overlay: Absolute redirect should be followed even if ancestor is opaque

Typically, when following absolute redirect, if an opauqe dentry is found, lookup in further lower directories is stopped. But if a child dentry has another absolute redirect, then lookup in further lower layers should continue.

Say, following is example setup.

upper:  /redirect (redirect=/a/b/c)
lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
lower0: /a/b/d/foo

"redirect" directory in upper should merge with lower1:/a/b/c/ and lower0:/a/b/d/, despite lower1:/a/b/ being opaque.

This example and kernel fix has come from Amir Goldstein. I am just putting a test for it to make sure its not broken down the line.

v3: Took care of more comments from amir.
- Added some comments.
- Added _overlay_check_scratch_dirs call.

---
 tests/overlay/057     |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/057.out |    2 +
 tests/overlay/group   |    1 
 3 files changed, 103 insertions(+)
tests/overlay/057 new file +100 -0
Index: xfstests-dev/tests/overlay/057
===================================================================
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 057
+#
+# Test absolute redirect is followed even if ancestor is opaque
+#
+# Typically, when following absolute redirect, if an opauqe dentry is
+# found, lookup in further lower directories is stopped. But if a
+# child dentry has another absolute redirect, then lookup in further
+# lower layers should continue.
+#
+# Say, following is example setup.
+# upper:  /redirect (redirect=/a/b/c)
+# lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
+# lower0: /a/b/d/foo
+#
+# "redirect" directory in upper should merge with lower1:/a/b/c/ and
+# lower0:/a/b/d/, despite lower1:/a/b/ being opaque.
+#
+#-----------------------------------------------------------------------
+# Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
+# Author: Vivek Goyal <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+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.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs overlay
+_supported_os Linux
+# We use non-default scratch underlying overlay dirs, we need to check
+# them explicity after test.
+_require_scratch_nocheck
+_require_scratch_overlay_features redirect_dir
+
+# remove all files from previous tests
+_scratch_mkfs
+
+# Create test directories
+lowerdir=$OVL_BASE_SCRATCH_MNT/lower
+lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
+upperdir=$OVL_BASE_SCRATCH_MNT/upper
+workdir=$OVL_BASE_SCRATCH_MNT/workdir
+workdir2=$OVL_BASE_SCRATCH_MNT/workdir2
+
+mkdir -p $lowerdir $lowerdir2 $upperdir $workdir $workdir2
+mkdir -p $lowerdir/origin
+touch $lowerdir/origin/foo
+_overlay_scratch_mount_dirs $lowerdir $lowerdir2 $workdir2 -o redirect_dir=on
+
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect
+
+# Verify that redirects are followed after mount cycle
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+ls $SCRATCH_MNT/redirect/
+
+# check overlayfs
+_overlay_check_scratch_dirs "$lowerdir2:$lowerdir" $upperdir $workdir -o redirect_dir=on
+
+# success, all done
+status=0
+exit
tests/overlay/group +1 -0
Index: xfstests-dev/tests/overlay/group
===================================================================
@@ -59,3 +59,4 @@
 054 auto quick copyup redirect exportfs
 055 auto quick copyup redirect exportfs nonsamefs
 056 auto quick fsck
+057 auto quick redirect
tests/overlay/057.out new file +2 -0
Index: xfstests-dev/tests/overlay/057.out
===================================================================
@@ -0,0 +1,2 @@
+QA output created by 057
+foo
Reviewed-by on v3 1/1
#1 lore raw
Quoted 13 lines · Vivek Goyal

Typically, when following absolute redirect, if an opauqe dentry is found, lookup in further lower directories is stopped. But if a child dentry has another absolute redirect, then lookup in further lower layers should continue.

Say, following is example setup.

upper:  /redirect (redirect=/a/b/c)
lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
lower0: /a/b/d/foo

"redirect" directory in upper should merge with lower1:/a/b/c/ and lower0:/a/b/d/, despite lower1:/a/b/ being opaque.

Quoted 8 lines

This example and kernel fix has come from Amir Goldstein. I am just putting a test for it to make sure its not broken down the line.

v3: Took care of more comments from amir.
- Added some comments.
- Added _overlay_check_scratch_dirs call.

Thanks,

Quoted 127 lines
---
 tests/overlay/057     |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/057.out |    2 +
 tests/overlay/group   |    1
 3 files changed, 103 insertions(+)

Index: xfstests-dev/tests/overlay/057
===================================================================

tests/overlay/057 2018-03-14 09:10:00.577179042 -0400 renamed from dev/null 1970-01-01 00:00:00.000000000 +0000 +100 -0
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 057
+#
+# Test absolute redirect is followed even if ancestor is opaque
+#
+# Typically, when following absolute redirect, if an opauqe dentry is
+# found, lookup in further lower directories is stopped. But if a
+# child dentry has another absolute redirect, then lookup in further
+# lower layers should continue.
+#
+# Say, following is example setup.
+# upper:  /redirect (redirect=/a/b/c)
+# lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
+# lower0: /a/b/d/foo
+#
+# "redirect" directory in upper should merge with lower1:/a/b/c/ and
+# lower0:/a/b/d/, despite lower1:/a/b/ being opaque.
+#
+#-----------------------------------------------------------------------
+# Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
+# Author: Vivek Goyal <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+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.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs overlay
+_supported_os Linux
+# We use non-default scratch underlying overlay dirs, we need to check
+# them explicity after test.
+_require_scratch_nocheck
+_require_scratch_overlay_features redirect_dir
+
+# remove all files from previous tests
+_scratch_mkfs
+
+# Create test directories
+lowerdir=$OVL_BASE_SCRATCH_MNT/lower
+lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
+upperdir=$OVL_BASE_SCRATCH_MNT/upper
+workdir=$OVL_BASE_SCRATCH_MNT/workdir
+workdir2=$OVL_BASE_SCRATCH_MNT/workdir2
+
+mkdir -p $lowerdir $lowerdir2 $upperdir $workdir $workdir2
+mkdir -p $lowerdir/origin
+touch $lowerdir/origin/foo
+_overlay_scratch_mount_dirs $lowerdir $lowerdir2 $workdir2 -o redirect_dir=on
+
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect
+
+# Verify that redirects are followed after mount cycle
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+ls $SCRATCH_MNT/redirect/
+
+# check overlayfs
+_overlay_check_scratch_dirs "$lowerdir2:$lowerdir" $upperdir $workdir -o redirect_dir=on
+
+# success, all done
+status=0
+exit

Index: xfstests-dev/tests/overlay/group
===================================================================

tests/overlay/group 2018-03-12 09:31:45.692818432 -0400 renamed from tests/overlay/group 2018-02-28 15:27:29.981693615 -0500 +1 -0
@@ -59,3 +59,4 @@
 054 auto quick copyup redirect exportfs
 055 auto quick copyup redirect exportfs nonsamefs
 056 auto quick fsck
+057 auto quick redirect

Index: xfstests-dev/tests/overlay/057.out
===================================================================

tests/overlay/057.out 2018-03-12 13:09:42.061818432 -0400 renamed from dev/null 1970-01-01 00:00:00.000000000 +0000 +2 -0
@@ -0,0 +1,2 @@
+QA output created by 057
+foo
#2 lore raw
In reply to Vivek Goyal
Quoted 110 lines · Vivek Goyal

Typically, when following absolute redirect, if an opauqe dentry is found, lookup in further lower directories is stopped. But if a child dentry has another absolute redirect, then lookup in further lower layers should continue.

Say, following is example setup.

upper:  /redirect (redirect=/a/b/c)
lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
lower0: /a/b/d/foo

"redirect" directory in upper should merge with lower1:/a/b/c/ and lower0:/a/b/d/, despite lower1:/a/b/ being opaque.

This example and kernel fix has come from Amir Goldstein. I am just putting a test for it to make sure its not broken down the line.

v3: Took care of more comments from amir.
- Added some comments.
- Added _overlay_check_scratch_dirs call.

---
 tests/overlay/057     |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/057.out |    2 +
 tests/overlay/group   |    1 
 3 files changed, 103 insertions(+)

Index: xfstests-dev/tests/overlay/057
===================================================================

tests/overlay/057 new file +78 -0
@@ -0,0 +1,100 @@
+#! /bin/bash
+# FS QA Test No. 057
+#
+# Test absolute redirect is followed even if ancestor is opaque
+#
+# Typically, when following absolute redirect, if an opauqe dentry is
+# found, lookup in further lower directories is stopped. But if a
+# child dentry has another absolute redirect, then lookup in further
+# lower layers should continue.
+#
+# Say, following is example setup.
+# upper:  /redirect (redirect=/a/b/c)
+# lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
+# lower0: /a/b/d/foo
+#
+# "redirect" directory in upper should merge with lower1:/a/b/c/ and
+# lower0:/a/b/d/, despite lower1:/a/b/ being opaque.
+#
+#-----------------------------------------------------------------------
+# Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
+# Author: Vivek Goyal <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+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.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs overlay
+_supported_os Linux
+# We use non-default scratch underlying overlay dirs, we need to check
+# them explicity after test.
+_require_scratch_nocheck
+_require_scratch_overlay_features redirect_dir
+
+# remove all files from previous tests
+_scratch_mkfs
+
+# Create test directories
+lowerdir=$OVL_BASE_SCRATCH_MNT/lower
+lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
+upperdir=$OVL_BASE_SCRATCH_MNT/upper
+workdir=$OVL_BASE_SCRATCH_MNT/workdir
+workdir2=$OVL_BASE_SCRATCH_MNT/workdir2
+
+mkdir -p $lowerdir $lowerdir2 $upperdir $workdir $workdir2

tests/overlay/057 line 88

Quoted 10 lines
tests/overlay/057 new file +10 -0
+mkdir -p $lowerdir/origin
+touch $lowerdir/origin/foo
+_overlay_scratch_mount_dirs $lowerdir $lowerdir2 $workdir2 -o redirect_dir=on
+
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect

I think we'd better do a "ls $SCRATCH_MNT/redirect/" here too, right after the rename and before mount cycle, to make sure 'foo' is there as well. I can add it on commit (and change the .out file too) if this change looks OK to you.

BTW, I stopped using [email protected], please refer to the following email (though it's not so obvious..)

[ANNOUNCE] fstests: master branch updated to 5e6514523342, and Eryu's comming role change
https://www.spinics.net/lists/fstests/msg09052.html

Thanks,
Eryu

Quoted 32 lines
tests/overlay/057 new file +12 -0
+
+# Verify that redirects are followed after mount cycle
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+ls $SCRATCH_MNT/redirect/
+
+# check overlayfs
+_overlay_check_scratch_dirs "$lowerdir2:$lowerdir" $upperdir $workdir -o redirect_dir=on
+
+# success, all done
+status=0
+exit

Index: xfstests-dev/tests/overlay/group
===================================================================

tests/overlay/group +1 -0
@@ -59,3 +59,4 @@
 054 auto quick copyup redirect exportfs
 055 auto quick copyup redirect exportfs nonsamefs
 056 auto quick fsck
+057 auto quick redirect

Index: xfstests-dev/tests/overlay/057.out
===================================================================

tests/overlay/057.out new file +2 -1
@@ -0,0 +1,2 @@
+QA output created by 057
+foo
--

To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw
Quoted 11 lines · Eryu Guan

Review

Quoted 6 lines
(quoted diff) +6 -0
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect

I think we'd better do a "ls $SCRATCH_MNT/redirect/" here too, right after the rename and before mount cycle, to make sure 'foo' is there as well. I can add it on commit (and change the .out file too) if this change looks OK to you.

Something like this:

git a/tests/overlay/057 b/tests/overlay/057
index 10b46bfa8cff..d54024e98bcd 100644

tests/overlay/057 +2 -0
@@ -86,6 +86,8 @@ mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
 $UMOUNT_PROG $SCRATCH_MNT
 _overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
 mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect
+# Verify that redirects are followed
+ls $SCRATCH_MNT/redirect/
 
 # Verify that redirects are followed after mount cycle
 $UMOUNT_PROG $SCRATCH_MNT
tests/overlay/057.out +1 -0
index 750830212460..b3b4017d32ae 100644
@@ -1,2 +1,3 @@
 QA output created by 057
 foo
+foo

Thanks,
Eryu

#4 lore raw
Quoted 14 lines · Eryu Guan
Quoted 11 lines · Eryu Guan

Review

Quoted 6 lines
(quoted diff) +6 -0
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect

I think we'd better do a "ls $SCRATCH_MNT/redirect/" here too, right after the rename and before mount cycle, to make sure 'foo' is there as well. I can add it on commit (and change the .out file too) if this change looks OK to you.

OK, but...

tests/overlay/057 mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect · line 89

Quoted 11 lines

Something like this:

git a/tests/overlay/057 b/tests/overlay/057
index 10b46bfa8cff..d54024e98bcd 100644

tests/overlay/057 +1 -0
@@ -86,6 +86,8 @@ mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
 $UMOUNT_PROG $SCRATCH_MNT
 _overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
 mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect
+# Verify that redirects are followed

The wording here is not technically accurate.
"redirect" are "followed" on lookup and there is no lookup here (dentry is already in cache). It would be more accurate to say some thing like "List content of renamed merge dir before mount cycle" and then maybe to use the same language, "Verify that redirects are followed by listing content of renamed merge dir after after cycle".

Quoted 15 lines
tests/overlay/057 +1 -0
+ls $SCRATCH_MNT/redirect/
 
 # Verify that redirects are followed after mount cycle
 $UMOUNT_PROG $SCRATCH_MNT
tests/overlay/057.out +1 -0
index 750830212460..b3b4017d32ae 100644
@@ -1,2 +1,3 @@
 QA output created by 057
 foo
+foo

Thanks,
Eryu

#5 lore raw
Quoted 20 lines · Amir Goldstein
Quoted 14 lines · Eryu Guan
Quoted 11 lines · Eryu Guan

Review

Quoted 6 lines
(quoted diff) +6 -0
+# Create opaque parent with absolute redirect child in middle layer
+mkdir $SCRATCH_MNT/pure
+mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
+$UMOUNT_PROG $SCRATCH_MNT
+_overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
+mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect

I think we'd better do a "ls $SCRATCH_MNT/redirect/" here too, right after the rename and before mount cycle, to make sure 'foo' is there as well. I can add it on commit (and change the .out file too) if this change looks OK to you.

OK, but...

Quoted 2 lines

Something like this:

Quoted 16 lines

tests/overlay/057 mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect · line 89

Quoted 9 lines

git a/tests/overlay/057 b/tests/overlay/057
index 10b46bfa8cff..d54024e98bcd 100644

tests/overlay/057 +1 -0
@@ -86,6 +86,8 @@ mv $SCRATCH_MNT/origin $SCRATCH_MNT/pure/redirect
 $UMOUNT_PROG $SCRATCH_MNT
 _overlay_scratch_mount_dirs $lowerdir2:$lowerdir $upperdir $workdir -o redirect_dir=on
 mv $SCRATCH_MNT/pure/redirect $SCRATCH_MNT/redirect
+# Verify that redirects are followed

The wording here is not technically accurate.
"redirect" are "followed" on lookup and there is no lookup here (dentry is already in cache). It would be more accurate to say some thing like "List content of renamed merge dir before mount cycle" and then maybe to use the same language, "Verify that redirects are followed by listing content of renamed merge dir after after cycle".

I'll update as suggested. Thanks!

Eryu