Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1468672 > unrolled thread

[PATCH] Make __xfs_xattr_put_listen preperly report errors.

Started byArtem Savkov <asavkov@redhat.com>
First post2016-08-23 18:00 +0200
Last post2016-08-25 10:00 +0200
Articles 4 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] Make __xfs_xattr_put_listen preperly report errors. Artem Savkov <asavkov@redhat.com> - 2016-08-23 18:00 +0200
    Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Dave Chinner <david@fromorbit.com> - 2016-08-24 04:00 +0200
      Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Artem Savkov <asavkov@redhat.com> - 2016-08-24 10:10 +0200
        Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Dave Chinner <david@fromorbit.com> - 2016-08-25 10:00 +0200

#1468672 — [PATCH] Make __xfs_xattr_put_listen preperly report errors.

FromArtem Savkov <asavkov@redhat.com>
Date2016-08-23 18:00 +0200
Subject[PATCH] Make __xfs_xattr_put_listen preperly report errors.
Message-ID<s9mhj-5XZ-15@gated-at.bofh.it>
Commit "xfs: only return -errno or success from attr ->put_listent" changes the
returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient
space in the buffer assuming that setting context->count to -1 would be enough,
but all of the ->put_listent callers only check seen_enough. This results in
a failed assertion:
XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175
in insufficient buffer size case.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
---
 fs/xfs/xfs_xattr.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c
index ea62245..6290093 100644
--- a/fs/xfs/xfs_xattr.c
+++ b/fs/xfs/xfs_xattr.c
@@ -147,6 +147,7 @@ __xfs_xattr_put_listent(
 	arraytop = context->count + prefix_len + namelen + 1;
 	if (arraytop > context->firstu) {
 		context->count = -1;	/* insufficient space */
+		context->seen_enough = 1;
 		return 0;
 	}
 	offset = (char *)context->alist + context->count;
-- 
2.7.4

[toc] | [next] | [standalone]


#1469022

FromDave Chinner <david@fromorbit.com>
Date2016-08-24 04:00 +0200
Message-ID<s9vDX-3Ld-3@gated-at.bofh.it>
In reply to#1468672
On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote:
> Commit "xfs: only return -errno or success from attr ->put_listent" changes the

Please quote commits in --oneline format in changelogs - it makes it
much easier to find the change you are refering to if there is both
a commit ID and the text string in the commit message. (i.e. text
string confirms the commit id is the one you meant to quote).

commit 2a6fba6 ("xfs: only return -errno or success from attr
->put_listent") is the one you are refering to here, right?

> returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient
> space in the buffer assuming that setting context->count to -1 would be enough,
> but all of the ->put_listent callers only check seen_enough. This results in
> a failed assertion:
> XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175
> in insufficient buffer size case.

You have a test case? Can you turn it into an xfstest? We really
need regression tests that cover issues like this....

> Signed-off-by: Artem Savkov <asavkov@redhat.com>
> ---
>  fs/xfs/xfs_xattr.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c
> index ea62245..6290093 100644
> --- a/fs/xfs/xfs_xattr.c
> +++ b/fs/xfs/xfs_xattr.c
> @@ -147,6 +147,7 @@ __xfs_xattr_put_listent(
>  	arraytop = context->count + prefix_len + namelen + 1;
>  	if (arraytop > context->firstu) {
>  		context->count = -1;	/* insufficient space */
> +		context->seen_enough = 1;
>  		return 0;
>  	}
>  	offset = (char *)context->alist + context->count;

Looks sane, though I don't know how to test it yet....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

[toc] | [prev] | [next] | [standalone]


#1469164

FromArtem Savkov <asavkov@redhat.com>
Date2016-08-24 10:10 +0200
Message-ID<s9Bq1-7WK-13@gated-at.bofh.it>
In reply to#1469022
On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote:
> On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote:
> > Commit "xfs: only return -errno or success from attr ->put_listent" changes the
> 
> Please quote commits in --oneline format in changelogs - it makes it
> much easier to find the change you are refering to if there is both
> a commit ID and the text string in the commit message. (i.e. text
> string confirms the commit id is the one you meant to quote).

Noted, thanks.

> 
> commit 2a6fba6 ("xfs: only return -errno or success from attr
> ->put_listent") is the one you are refering to here, right?

Yes, that is the one.

> > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient
> > space in the buffer assuming that setting context->count to -1 would be enough,
> > but all of the ->put_listent callers only check seen_enough. This results in
> > a failed assertion:
> > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175
> > in insufficient buffer size case.
> 
> You have a test case? Can you turn it into an xfstest? We really
> need regression tests that cover issues like this....
> 

llistxattr02 test from LTP reliably hits this, I'll see how this can be
ported to xfstest.

> > Signed-off-by: Artem Savkov <asavkov@redhat.com>
> > ---
> >  fs/xfs/xfs_xattr.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c
> > index ea62245..6290093 100644
> > --- a/fs/xfs/xfs_xattr.c
> > +++ b/fs/xfs/xfs_xattr.c
> > @@ -147,6 +147,7 @@ __xfs_xattr_put_listent(
> >  	arraytop = context->count + prefix_len + namelen + 1;
> >  	if (arraytop > context->firstu) {
> >  		context->count = -1;	/* insufficient space */
> > +		context->seen_enough = 1;
> >  		return 0;
> >  	}
> >  	offset = (char *)context->alist + context->count;
> 
> Looks sane, though I don't know how to test it yet....
> 
> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@fromorbit.com

-- 
Regards,
  Artem

[toc] | [prev] | [next] | [standalone]


#1469937

FromDave Chinner <david@fromorbit.com>
Date2016-08-25 10:00 +0200
Message-ID<s9XJY-6yg-3@gated-at.bofh.it>
In reply to#1469164
On Wed, Aug 24, 2016 at 10:08:33AM +0200, Artem Savkov wrote:
> On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote:
> > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote:
> > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the
> > 
> > Please quote commits in --oneline format in changelogs - it makes it
> > much easier to find the change you are refering to if there is both
> > a commit ID and the text string in the commit message. (i.e. text
> > string confirms the commit id is the one you meant to quote).
> 
> Noted, thanks.
> 
> > 
> > commit 2a6fba6 ("xfs: only return -errno or success from attr
> > ->put_listent") is the one you are refering to here, right?
> 
> Yes, that is the one.
> 
> > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient
> > > space in the buffer assuming that setting context->count to -1 would be enough,
> > > but all of the ->put_listent callers only check seen_enough. This results in
> > > a failed assertion:
> > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175
> > > in insufficient buffer size case.
> > 
> > You have a test case? Can you turn it into an xfstest? We really
> > need regression tests that cover issues like this....
> > 
> 
> llistxattr02 test from LTP reliably hits this, I'll see how this can be
> ported to xfstest.

So, after battling the obtuse, completely useless ltp install
documentation and having to resort to reverse engineering a working
configuration using strace, I finally got this running, I think, on
an XFS filesystem:

/mnt/scratch/ltp$ sudo ./runltp -b /dev/pmem1 -B xfs -z /dev/vdc -Z xfs -q -p -s llistxattr -I 100
....
Summary:
passed   1
failed   0
skipped  0
warnings 0
tst_test.c:756: INFO: Timeout per run is 0h 05m 00s
llistxattr02.c:76: PASS: llistxattr() failed as expected: ERANGE
llistxattr02.c:76: PASS: llistxattr() failed as expected: ENOENT
llistxattr02.c:76: PASS: llistxattr() failed as expected: EFAULT
....

And it doesn't fail. strace output:

24833 lsetxattr("symlink", "security.ltptest", "test", 4, XATTR_CREATE) = 0
24833 llistxattr("symlink", 0x7ffe312356b0, 1) = -1 ERANGE (Numerical result out of range)
24833 llistxattr("", 0x7ffe312356a0, 20) = -1 ENOENT (No such file or directory)
24833 llistxattr(0xffffffffffffffff, 0x7ffe312356a0, 20) = -1 EFAULT (Bad address)

I'm assuming from your description that it is the first one of these
that fails for you as it is the "buffer too small" test case. So,
not as obvious as it first seems - ltp doesn't appear to be a
reliable reproducer of the problem, so we are going to need a custom
test to exercise it....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web