mbox series

[v2,0/2] Test for overlayfs fix in v6.6-rc2

Message ID 20230921143102.127526-1-amir73il@gmail.com (mailing list archive)
Headers show
Series Test for overlayfs fix in v6.6-rc2 | expand

Message

Amir Goldstein Sept. 21, 2023, 2:31 p.m. UTC
Zorro,

This is a test for a regression in kernel v5.15.
The fix was merged for 6.6-rc2 and has been picked for
the upcoming LTS releases 5.15, 6.1, 6.5.

The reproducer only manifests the bug in fs that inherit noatime flag
on symlink namely ext4, btrfs, ... but not xfs.

The test does _notrun on overlayfs over xfs for that reason.

Thanks,
Amir.

Changes since v1:
- Create helper _require_chattr_inherit
- Improve documnetation of the regression

Amir Goldstein (2):
  common: add helper _require_chattr_inherit
  overlay: add test for rename of lower symlink with NOATIME attr

 common/rc             | 52 ++++++++++++++++++++++++++++------
 tests/overlay/082     | 66 +++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/082.out |  2 ++
 3 files changed, 111 insertions(+), 9 deletions(-)
 create mode 100755 tests/overlay/082
 create mode 100644 tests/overlay/082.out

Comments

Amir Goldstein Sept. 21, 2023, 3:40 p.m. UTC | #1
On Thu, Sep 21, 2023 at 6:26 PM Zorro Lang <zlang@redhat.com> wrote:
>
> On Thu, Sep 21, 2023 at 05:31:01PM +0300, Amir Goldstein wrote:
> > Similar to _require_chattr, but also checks if an attribute is
> > inheritted from parent dir to children.
> >
> > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > ---
> >  common/rc | 52 +++++++++++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 43 insertions(+), 9 deletions(-)
> >
> > diff --git a/common/rc b/common/rc
> > index 1618ded5..00cfd434 100644
> > --- a/common/rc
> > +++ b/common/rc
> > @@ -4235,23 +4235,57 @@ _require_test_lsattr()
> >               _notrun "lsattr not supported by test filesystem type: $FSTYP"
> >  }
> >
> > +_check_chattr_inherit()
> > +{
> > +     local attribute=$1
> > +     local path=$2
> > +     local inherit=$3
>
> As I understand, this function calls _check_chattr_inherit, so it will
> return zero or non-zero to clarify if $path support $attribute inheritance.
> ...
>
> > +
> > +     touch $path
> > +     $CHATTR_PROG "+$attribute" $path > $tmp.chattr 2>&1
> > +     local ret=$?
> > +     if [ -n "$inherit" ]; then
> > +             touch "$path/$inherit"
> > +     fi
>
> ... but looks like it doesn't, it only create a $inherit file, then let the
> caller check if the $attribute is inherited.
>
> I think that's a little confused.

I agree.

> I think we can name the function as _check_chattr()

I agree.

> and the 3rd argument $inherit as a bool variable, to
> decide if we check inheritance or not.
>

Not my prefered choice.

> Or you'd like to have two functions _check_chattr and _check_chattr_inherit,
> _check_chattr_inherit calls _check_chattr then keep checking inheritance.
>
> What do you think?

I think this is over engineering for a helper that may not
be ever used by any other test.

Suggest to just change the name to _check_chattr()
to match the meaning to the return value.

The 3rd inherit argument just means that we request
to create a file after chattr + and before chattr -,
so that the caller could check it itself later.

If you accept this minor change is enough
can you apply it yourself on commit?

Thanks,
Amir.
Amir Goldstein Sept. 21, 2023, 4:46 p.m. UTC | #2
On Thu, Sep 21, 2023 at 7:23 PM Zorro Lang <zlang@redhat.com> wrote:
>
> On Thu, Sep 21, 2023 at 06:40:49PM +0300, Amir Goldstein wrote:
> > On Thu, Sep 21, 2023 at 6:26 PM Zorro Lang <zlang@redhat.com> wrote:
> > >
> > > On Thu, Sep 21, 2023 at 05:31:01PM +0300, Amir Goldstein wrote:
> > > > Similar to _require_chattr, but also checks if an attribute is
> > > > inheritted from parent dir to children.
> > > >
> > > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > > ---
> > > >  common/rc | 52 +++++++++++++++++++++++++++++++++++++++++++---------
> > > >  1 file changed, 43 insertions(+), 9 deletions(-)
> > > >
> > > > diff --git a/common/rc b/common/rc
> > > > index 1618ded5..00cfd434 100644
> > > > --- a/common/rc
> > > > +++ b/common/rc
> > > > @@ -4235,23 +4235,57 @@ _require_test_lsattr()
> > > >               _notrun "lsattr not supported by test filesystem type: $FSTYP"
> > > >  }
> > > >
> > > > +_check_chattr_inherit()
> > > > +{
> > > > +     local attribute=$1
> > > > +     local path=$2
> > > > +     local inherit=$3
> > >
> > > As I understand, this function calls _check_chattr_inherit, so it will
> > > return zero or non-zero to clarify if $path support $attribute inheritance.
> > > ...
> > >
> > > > +
> > > > +     touch $path
> > > > +     $CHATTR_PROG "+$attribute" $path > $tmp.chattr 2>&1
> > > > +     local ret=$?
> > > > +     if [ -n "$inherit" ]; then
> > > > +             touch "$path/$inherit"
> > > > +     fi
> > >
> > > ... but looks like it doesn't, it only create a $inherit file, then let the
> > > caller check if the $attribute is inherited.
> > >
> > > I think that's a little confused.
> >
> > I agree.
> >
> > > I think we can name the function as _check_chattr()
> >
> > I agree.
> >
> > > and the 3rd argument $inherit as a bool variable, to
> > > decide if we check inheritance or not.
> > >
> >
> > Not my prefered choice.
> >
> > > Or you'd like to have two functions _check_chattr and _check_chattr_inherit,
> > > _check_chattr_inherit calls _check_chattr then keep checking inheritance.
> > >
> > > What do you think?
> >
> > I think this is over engineering for a helper that may not
> > be ever used by any other test.
> >
> > Suggest to just change the name to _check_chattr()
> > to match the meaning to the return value.
> >
> > The 3rd inherit argument just means that we request
> > to create a file after chattr + and before chattr -,
> > so that the caller could check it itself later.
>
> I still think it doesn't make sense ... but I don't want to give you
> that pressure, so ...
>
> >
> > If you accept this minor change is enough
> > can you apply it yourself on commit?
>
> ... If you think it's too complicated, we can drop the inheritance checking
> common helper. Just change the _require_chattr(), make it to accept one more
> *directory* argument (use $TEST_DIR by default). Then we can do:
>
> _require_chattr A $BASE_SCRATCH_MNT

This is not needed.
Overlayfs (on $SCRATCH_MNT) will not pass the require_chattr
check if the base fs does not support chattr.

> _require_chattr A $SCRATCH_MNT

This is practically equivalent to _require_chattr A
on the test partition, there is no reason to test the
scratch partition specifically.

So there is no need for the proposed change in _require_chattr.

>
> And then do all inheritance checking in the overlay case itself (likes you did in
> V1), don't make them to be a common helper. Due to only this case need the
> _require_chattr_inheritance, so we can think about that common helper when more
> cases need that :)
>
> I think this change is simple enough (base on your V1 patch). Is that good to
> you :)

V1 is good enough for me as is. :)
You can take the commit message and test
header comment fixes from V2.

Note that the common _require_chattr_inheritance in V2
almost did not remove any lines from the test at all -
it moved one _notrun line into _require_chattr_inheritance
and turned another _notrun into echo "fail".

So I agree that if no other test is going to use the new helpers
their value is limited.

Thanks,
Amir.
Zorro Lang Sept. 21, 2023, 5:06 p.m. UTC | #3
On Thu, Sep 21, 2023 at 07:46:12PM +0300, Amir Goldstein wrote:
> On Thu, Sep 21, 2023 at 7:23 PM Zorro Lang <zlang@redhat.com> wrote:
> >
> > On Thu, Sep 21, 2023 at 06:40:49PM +0300, Amir Goldstein wrote:
> > > On Thu, Sep 21, 2023 at 6:26 PM Zorro Lang <zlang@redhat.com> wrote:
> > > >
> > > > On Thu, Sep 21, 2023 at 05:31:01PM +0300, Amir Goldstein wrote:
> > > > > Similar to _require_chattr, but also checks if an attribute is
> > > > > inheritted from parent dir to children.
> > > > >
> > > > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > > > ---
> > > > >  common/rc | 52 +++++++++++++++++++++++++++++++++++++++++++---------
> > > > >  1 file changed, 43 insertions(+), 9 deletions(-)
> > > > >
> > > > > diff --git a/common/rc b/common/rc
> > > > > index 1618ded5..00cfd434 100644
> > > > > --- a/common/rc
> > > > > +++ b/common/rc
> > > > > @@ -4235,23 +4235,57 @@ _require_test_lsattr()
> > > > >               _notrun "lsattr not supported by test filesystem type: $FSTYP"
> > > > >  }
> > > > >
> > > > > +_check_chattr_inherit()
> > > > > +{
> > > > > +     local attribute=$1
> > > > > +     local path=$2
> > > > > +     local inherit=$3
> > > >
> > > > As I understand, this function calls _check_chattr_inherit, so it will
> > > > return zero or non-zero to clarify if $path support $attribute inheritance.
> > > > ...
> > > >
> > > > > +
> > > > > +     touch $path
> > > > > +     $CHATTR_PROG "+$attribute" $path > $tmp.chattr 2>&1
> > > > > +     local ret=$?
> > > > > +     if [ -n "$inherit" ]; then
> > > > > +             touch "$path/$inherit"
> > > > > +     fi
> > > >
> > > > ... but looks like it doesn't, it only create a $inherit file, then let the
> > > > caller check if the $attribute is inherited.
> > > >
> > > > I think that's a little confused.
> > >
> > > I agree.
> > >
> > > > I think we can name the function as _check_chattr()
> > >
> > > I agree.
> > >
> > > > and the 3rd argument $inherit as a bool variable, to
> > > > decide if we check inheritance or not.
> > > >
> > >
> > > Not my prefered choice.
> > >
> > > > Or you'd like to have two functions _check_chattr and _check_chattr_inherit,
> > > > _check_chattr_inherit calls _check_chattr then keep checking inheritance.
> > > >
> > > > What do you think?
> > >
> > > I think this is over engineering for a helper that may not
> > > be ever used by any other test.
> > >
> > > Suggest to just change the name to _check_chattr()
> > > to match the meaning to the return value.
> > >
> > > The 3rd inherit argument just means that we request
> > > to create a file after chattr + and before chattr -,
> > > so that the caller could check it itself later.
> >
> > I still think it doesn't make sense ... but I don't want to give you
> > that pressure, so ...
> >
> > >
> > > If you accept this minor change is enough
> > > can you apply it yourself on commit?
> >
> > ... If you think it's too complicated, we can drop the inheritance checking
> > common helper. Just change the _require_chattr(), make it to accept one more
> > *directory* argument (use $TEST_DIR by default). Then we can do:
> >
> > _require_chattr A $BASE_SCRATCH_MNT
> 
> This is not needed.
> Overlayfs (on $SCRATCH_MNT) will not pass the require_chattr
> check if the base fs does not support chattr.

Oh, I saw you wrote as this:

  +# prepare lower test dir with NOATIME flag
  +lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
  +mkdir -p $lowerdir/testdir
  +$CHATTR_PROG +A $lowerdir/testdir >> $seqres.full 2>&1 ||
  +       _notrun "base fs $OVL_BASE_FSTYP does not support No_Atime flag"

so I thought you might want a `_require_chattr A $BASE_SCRATCH_MNT`.

> 
> > _require_chattr A $SCRATCH_MNT
> 
> This is practically equivalent to _require_chattr A
> on the test partition, there is no reason to test the
> scratch partition specifically.
> 
> So there is no need for the proposed change in _require_chattr.
> 
> >
> > And then do all inheritance checking in the overlay case itself (likes you did in
> > V1), don't make them to be a common helper. Due to only this case need the
> > _require_chattr_inheritance, so we can think about that common helper when more
> > cases need that :)
> >
> > I think this change is simple enough (base on your V1 patch). Is that good to
> > you :)
> 
> V1 is good enough for me as is. :)
> You can take the commit message and test
> header comment fixes from V2.

I'll merge v2 patch 2/2, with ...
1) Change _require_chattr_inherit to _require_chattr.
2) Add `sleep 2s` under the "before=$(stat -c %x $lowerdir/testdir/lnk)" line.

Thanks,
Zorro

> 
> Note that the common _require_chattr_inheritance in V2
> almost did not remove any lines from the test at all -
> it moved one _notrun line into _require_chattr_inheritance
> and turned another _notrun into echo "fail".
> 
> So I agree that if no other test is going to use the new helpers
> their value is limited.
> 
> Thanks,
> Amir.
>
Amir Goldstein Sept. 21, 2023, 5:12 p.m. UTC | #4
On Thu, Sep 21, 2023 at 8:06 PM Zorro Lang <zlang@redhat.com> wrote:
>
> On Thu, Sep 21, 2023 at 07:46:12PM +0300, Amir Goldstein wrote:
> > On Thu, Sep 21, 2023 at 7:23 PM Zorro Lang <zlang@redhat.com> wrote:
> > >
> > > On Thu, Sep 21, 2023 at 06:40:49PM +0300, Amir Goldstein wrote:
> > > > On Thu, Sep 21, 2023 at 6:26 PM Zorro Lang <zlang@redhat.com> wrote:
> > > > >
> > > > > On Thu, Sep 21, 2023 at 05:31:01PM +0300, Amir Goldstein wrote:
> > > > > > Similar to _require_chattr, but also checks if an attribute is
> > > > > > inheritted from parent dir to children.
> > > > > >
> > > > > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > > > > ---
> > > > > >  common/rc | 52 +++++++++++++++++++++++++++++++++++++++++++---------
> > > > > >  1 file changed, 43 insertions(+), 9 deletions(-)
> > > > > >
> > > > > > diff --git a/common/rc b/common/rc
> > > > > > index 1618ded5..00cfd434 100644
> > > > > > --- a/common/rc
> > > > > > +++ b/common/rc
> > > > > > @@ -4235,23 +4235,57 @@ _require_test_lsattr()
> > > > > >               _notrun "lsattr not supported by test filesystem type: $FSTYP"
> > > > > >  }
> > > > > >
> > > > > > +_check_chattr_inherit()
> > > > > > +{
> > > > > > +     local attribute=$1
> > > > > > +     local path=$2
> > > > > > +     local inherit=$3
> > > > >
> > > > > As I understand, this function calls _check_chattr_inherit, so it will
> > > > > return zero or non-zero to clarify if $path support $attribute inheritance.
> > > > > ...
> > > > >
> > > > > > +
> > > > > > +     touch $path
> > > > > > +     $CHATTR_PROG "+$attribute" $path > $tmp.chattr 2>&1
> > > > > > +     local ret=$?
> > > > > > +     if [ -n "$inherit" ]; then
> > > > > > +             touch "$path/$inherit"
> > > > > > +     fi
> > > > >
> > > > > ... but looks like it doesn't, it only create a $inherit file, then let the
> > > > > caller check if the $attribute is inherited.
> > > > >
> > > > > I think that's a little confused.
> > > >
> > > > I agree.
> > > >
> > > > > I think we can name the function as _check_chattr()
> > > >
> > > > I agree.
> > > >
> > > > > and the 3rd argument $inherit as a bool variable, to
> > > > > decide if we check inheritance or not.
> > > > >
> > > >
> > > > Not my prefered choice.
> > > >
> > > > > Or you'd like to have two functions _check_chattr and _check_chattr_inherit,
> > > > > _check_chattr_inherit calls _check_chattr then keep checking inheritance.
> > > > >
> > > > > What do you think?
> > > >
> > > > I think this is over engineering for a helper that may not
> > > > be ever used by any other test.
> > > >
> > > > Suggest to just change the name to _check_chattr()
> > > > to match the meaning to the return value.
> > > >
> > > > The 3rd inherit argument just means that we request
> > > > to create a file after chattr + and before chattr -,
> > > > so that the caller could check it itself later.
> > >
> > > I still think it doesn't make sense ... but I don't want to give you
> > > that pressure, so ...
> > >
> > > >
> > > > If you accept this minor change is enough
> > > > can you apply it yourself on commit?
> > >
> > > ... If you think it's too complicated, we can drop the inheritance checking
> > > common helper. Just change the _require_chattr(), make it to accept one more
> > > *directory* argument (use $TEST_DIR by default). Then we can do:
> > >
> > > _require_chattr A $BASE_SCRATCH_MNT
> >
> > This is not needed.
> > Overlayfs (on $SCRATCH_MNT) will not pass the require_chattr
> > check if the base fs does not support chattr.
>
> Oh, I saw you wrote as this:
>
>   +# prepare lower test dir with NOATIME flag
>   +lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
>   +mkdir -p $lowerdir/testdir
>   +$CHATTR_PROG +A $lowerdir/testdir >> $seqres.full 2>&1 ||
>   +       _notrun "base fs $OVL_BASE_FSTYP does not support No_Atime flag"
>
> so I thought you might want a `_require_chattr A $BASE_SCRATCH_MNT`.
>

You are right. it should have been an error, not _notrun
as it is in V2.

> >
> > > _require_chattr A $SCRATCH_MNT
> >
> > This is practically equivalent to _require_chattr A
> > on the test partition, there is no reason to test the
> > scratch partition specifically.
> >
> > So there is no need for the proposed change in _require_chattr.
> >
> > >
> > > And then do all inheritance checking in the overlay case itself (likes you did in
> > > V1), don't make them to be a common helper. Due to only this case need the
> > > _require_chattr_inheritance, so we can think about that common helper when more
> > > cases need that :)
> > >
> > > I think this change is simple enough (base on your V1 patch). Is that good to
> > > you :)
> >
> > V1 is good enough for me as is. :)
> > You can take the commit message and test
> > header comment fixes from V2.
>
> I'll merge v2 patch 2/2, with ...
> 1) Change _require_chattr_inherit to _require_chattr.
> 2) Add `sleep 2s` under the "before=$(stat -c %x $lowerdir/testdir/lnk)" line.
>

OK.

Thanks!
Amir.