xfstest: overlay: Absolute redirect should be followed even if ancestor is opaque
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
@@ -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
@@ -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
@@ -0,0 +1,2 @@ +QA output created by 057 +foo
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_dirscall.Signed-off-by Vivek Goyal <[email protected]>
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 +exitIndex: 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 redirectIndex: 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
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_dirscall.Signed-off-by Vivek Goyal <[email protected]>--- 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 +exitIndex: 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 redirectIndex: 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
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/redirectI 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
@@ -1,2 +1,3 @@ QA output created by 057 foo +foo
Thanks,
Eryu
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/redirectI 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
index10b46bfa8cff..d54024e98bcd100644tests/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_MNTtests/overlay/057.out +1
-0@@ -1,2 +1,3 @@ QA output created by 057 foo +fooThanks,
Eryu
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/redirectI 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
index10b46bfa8cff..d54024e98bcd100644tests/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 followedThe 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