All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
@ 2009-04-15 14:10 Suresh Jayaraman
  2009-04-15 18:00 ` Trond Myklebust
  0 siblings, 1 reply; 7+ messages in thread
From: Suresh Jayaraman @ 2009-04-15 14:10 UTC (permalink / raw)
  To: Trond.Myklebust; +Cc: linux-nfs

The recent posixacl fix(commit ae46141ff08f1965b17c531b571953c39ce8b9e2)
seems to have introduced a bug that will lead to -EINVAL errors during
normal setfacl operations on file or dir. This patch attempts to fix
this.

Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>
---

diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
index e6a1932..7cd0069 100644
--- a/fs/nfs/nfs3xdr.c
+++ b/fs/nfs/nfs3xdr.c
@@ -702,18 +702,19 @@ nfs3_xdr_setaclargs(struct rpc_rqst *req, __be32 *p,
                    struct nfs3_setaclargs *args)
 {
 	struct xdr_buf *buf = &req->rq_snd_buf;
-	unsigned int base;
+	unsigned int base, len;
+	unsigned int len_in_head = 2 * (2 + 3 * NFS_ACL_MAX_ENTRIES_INLINE);
 	int err;
 
 	p = xdr_encode_fhandle(p, NFS_FH(args->inode));
 	*p++ = htonl(args->mask);
-	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
-	base = req->rq_slen;
+	len = xdr_adjust_iovec(req->rq_svec, p);
+	base = len;
+	len -= len_in_head; 
+	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p + (len >> 2));
 
 	if (args->npages != 0)
-		xdr_encode_pages(buf, args->pages, 0, args->len);
-	else
-		req->rq_slen += args->len;
+		xdr_encode_pages(buf, args->pages, 0, len);
 
 	err = nfsacl_encode(buf, base, args->inode,
 			    (args->mask & NFS_ACL) ?



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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
  2009-04-15 14:10 [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs() Suresh Jayaraman
@ 2009-04-15 18:00 ` Trond Myklebust
       [not found]   ` <1239818456.5177.88.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Trond Myklebust @ 2009-04-15 18:00 UTC (permalink / raw)
  To: Suresh Jayaraman; +Cc: linux-nfs

On Wed, 2009-04-15 at 19:40 +0530, Suresh Jayaraman wrote:
> The recent posixacl fix(commit ae46141ff08f1965b17c531b571953c39ce8b9e2)
> seems to have introduced a bug that will lead to -EINVAL errors during
> normal setfacl operations on file or dir. This patch attempts to fix
> this.

To start with, your len_in_head is in units of 32-bit _words_, whereas
len, base, and req->rq_slen are in units of bytes.

Then, 'len' is initialised to the length of the currently encoded part
of the RPC header before subtracting 'len_in_head'. The resulting number
is then used both as the length of the page array, and to extend the
length of the req->rq_svec??? That makes absolutely no sense...


Please check if the following patch fixes things for you.

Trond
------------------------------------------------------------
>From b273b42f8b793a4a446015b50a5c1473553af48b Mon Sep 17 00:00:00 2001
From: Trond Myklebust <Trond.Myklebust@netapp.com>
Date: Wed, 15 Apr 2009 13:58:45 -0400
Subject: [PATCH] NFS: Fix the XDR iovec calculation in nfs3_xdr_setaclargs

Commit ae46141ff08f1965b17c531b571953c39ce8b9e2 (NFSv3: Fix posix ACL code)
introduces a bug in the calculation of the XDR header iovec. In the case
where we are inlining the acls, we need to adjust the length of the iovec
req->rq_svec, in addition to adjusting the total buffer length.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---
 fs/nfs/nfs3xdr.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
index e6a1932..35869a4 100644
--- a/fs/nfs/nfs3xdr.c
+++ b/fs/nfs/nfs3xdr.c
@@ -713,7 +713,8 @@ nfs3_xdr_setaclargs(struct rpc_rqst *req, __be32 *p,
 	if (args->npages != 0)
 		xdr_encode_pages(buf, args->pages, 0, args->len);
 	else
-		req->rq_slen += args->len;
+		req->rq_slen = xdr_adjust_iovec(req->rq_svec,
+				p + XDR_QUADLEN(args->len));
 
 	err = nfsacl_encode(buf, base, args->inode,
 			    (args->mask & NFS_ACL) ?
-- 
1.6.0.4


-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@netapp.com
www.netapp.com

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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
       [not found]   ` <1239818456.5177.88.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
@ 2009-04-15 20:11     ` Leonardo Chiquitto
  2009-04-16  5:17     ` Suresh Jayaraman
  1 sibling, 0 replies; 7+ messages in thread
From: Leonardo Chiquitto @ 2009-04-15 20:11 UTC (permalink / raw)
  To: Trond Myklebust; +Cc: linux-nfs

> Please check if the following patch fixes things for you.
>
> Trond
> ------------------------------------------------------------
> >From b273b42f8b793a4a446015b50a5c1473553af48b Mon Sep 17 00:00:00 2001
> From: Trond Myklebust <Trond.Myklebust@netapp.com>
> Date: Wed, 15 Apr 2009 13:58:45 -0400
> Subject: [PATCH] NFS: Fix the XDR iovec calculation in nfs3_xdr_setaclargs
>
> Commit ae46141ff08f1965b17c531b571953c39ce8b9e2 (NFSv3: Fix posix ACL code)
> introduces a bug in the calculation of the XDR header iovec. In the case
> where we are inlining the acls, we need to adjust the length of the iovec
> req->rq_svec, in addition to adjusting the total buffer length.
>
> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

I just tested and it fixes the problem for me.

Thanks!
Leonardo

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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
       [not found]   ` <1239818456.5177.88.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
  2009-04-15 20:11     ` Leonardo Chiquitto
@ 2009-04-16  5:17     ` Suresh Jayaraman
  2009-04-16 13:52       ` Chuck Lever
  1 sibling, 1 reply; 7+ messages in thread
From: Suresh Jayaraman @ 2009-04-16  5:17 UTC (permalink / raw)
  To: Trond Myklebust; +Cc: linux-nfs

Trond Myklebust wrote:
> On Wed, 2009-04-15 at 19:40 +0530, Suresh Jayaraman wrote:
>> The recent posixacl fix(commit ae46141ff08f1965b17c531b571953c39ce8b9e2)
>> seems to have introduced a bug that will lead to -EINVAL errors during
>> normal setfacl operations on file or dir. This patch attempts to fix
>> this.
> 
> To start with, your len_in_head is in units of 32-bit _words_, whereas
> len, base, and req->rq_slen are in units of bytes.
> 
> Then, 'len' is initialised to the length of the currently encoded part
> of the RPC header before subtracting 'len_in_head'. The resulting number

Doh, I got it wrong totally. Thanks for the explaination.

On a side note, I think it would be nice to add little comments in xdr
code to explain non-obvious pieces.

> 
> Please check if the following patch fixes things for you.

Yes, the below patch fixes the issue for me too.

Thanks,

> Trond
> ------------------------------------------------------------
>>From b273b42f8b793a4a446015b50a5c1473553af48b Mon Sep 17 00:00:00 2001
> From: Trond Myklebust <Trond.Myklebust@netapp.com>
> Date: Wed, 15 Apr 2009 13:58:45 -0400
> Subject: [PATCH] NFS: Fix the XDR iovec calculation in nfs3_xdr_setaclargs
> 
> Commit ae46141ff08f1965b17c531b571953c39ce8b9e2 (NFSv3: Fix posix ACL code)
> introduces a bug in the calculation of the XDR header iovec. In the case
> where we are inlining the acls, we need to adjust the length of the iovec
> req->rq_svec, in addition to adjusting the total buffer length.
> 
> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
> ---
>  fs/nfs/nfs3xdr.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
> index e6a1932..35869a4 100644
> --- a/fs/nfs/nfs3xdr.c
> +++ b/fs/nfs/nfs3xdr.c
> @@ -713,7 +713,8 @@ nfs3_xdr_setaclargs(struct rpc_rqst *req, __be32 *p,
>  	if (args->npages != 0)
>  		xdr_encode_pages(buf, args->pages, 0, args->len);
>  	else
> -		req->rq_slen += args->len;
> +		req->rq_slen = xdr_adjust_iovec(req->rq_svec,
> +				p + XDR_QUADLEN(args->len));
>  
>  	err = nfsacl_encode(buf, base, args->inode,
>  			    (args->mask & NFS_ACL) ?


-- 
Suresh Jayaraman

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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
  2009-04-16  5:17     ` Suresh Jayaraman
@ 2009-04-16 13:52       ` Chuck Lever
  2009-04-16 16:42         ` Trond Myklebust
  0 siblings, 1 reply; 7+ messages in thread
From: Chuck Lever @ 2009-04-16 13:52 UTC (permalink / raw)
  To: Suresh Jayaraman; +Cc: Trond Myklebust, linux-nfs

On Apr 16, 2009, at 1:17 AM, Suresh Jayaraman wrote:
> Trond Myklebust wrote:
>> On Wed, 2009-04-15 at 19:40 +0530, Suresh Jayaraman wrote:
>>> The recent posixacl fix(commit  
>>> ae46141ff08f1965b17c531b571953c39ce8b9e2)
>>> seems to have introduced a bug that will lead to -EINVAL errors  
>>> during
>>> normal setfacl operations on file or dir. This patch attempts to fix
>>> this.
>>
>> To start with, your len_in_head is in units of 32-bit _words_,  
>> whereas
>> len, base, and req->rq_slen are in units of bytes.
>>
>> Then, 'len' is initialised to the length of the currently encoded  
>> part
>> of the RPC header before subtracting 'len_in_head'. The resulting  
>> number
>
> Doh, I got it wrong totally. Thanks for the explaination.
>
> On a side note, I think it would be nice to add little comments in xdr
> code to explain non-obvious pieces.

As an aside, I think implementing this with xdr_streams might have  
some clarity benefits.

>> Please check if the following patch fixes things for you.
>
> Yes, the below patch fixes the issue for me too.
>
> Thanks,
>
>> Trond
>> ------------------------------------------------------------
>>> From b273b42f8b793a4a446015b50a5c1473553af48b Mon Sep 17 00:00:00  
>>> 2001
>> From: Trond Myklebust <Trond.Myklebust@netapp.com>
>> Date: Wed, 15 Apr 2009 13:58:45 -0400
>> Subject: [PATCH] NFS: Fix the XDR iovec calculation in  
>> nfs3_xdr_setaclargs
>>
>> Commit ae46141ff08f1965b17c531b571953c39ce8b9e2 (NFSv3: Fix posix  
>> ACL code)
>> introduces a bug in the calculation of the XDR header iovec. In the  
>> case
>> where we are inlining the acls, we need to adjust the length of the  
>> iovec
>> req->rq_svec, in addition to adjusting the total buffer length.
>>
>> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
>> ---
>> fs/nfs/nfs3xdr.c |    3 ++-
>> 1 files changed, 2 insertions(+), 1 deletions(-)
>>
>> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
>> index e6a1932..35869a4 100644
>> --- a/fs/nfs/nfs3xdr.c
>> +++ b/fs/nfs/nfs3xdr.c
>> @@ -713,7 +713,8 @@ nfs3_xdr_setaclargs(struct rpc_rqst *req,  
>> __be32 *p,
>> 	if (args->npages != 0)
>> 		xdr_encode_pages(buf, args->pages, 0, args->len);
>> 	else
>> -		req->rq_slen += args->len;
>> +		req->rq_slen = xdr_adjust_iovec(req->rq_svec,
>> +				p + XDR_QUADLEN(args->len));
>>
>> 	err = nfsacl_encode(buf, base, args->inode,
>> 			    (args->mask & NFS_ACL) ?
>
>
> -- 
> Suresh Jayaraman
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"  
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com





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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
  2009-04-16 13:52       ` Chuck Lever
@ 2009-04-16 16:42         ` Trond Myklebust
       [not found]           ` <1239900127.4198.5.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Trond Myklebust @ 2009-04-16 16:42 UTC (permalink / raw)
  To: Chuck Lever; +Cc: Suresh Jayaraman, linux-nfs

On Thu, 2009-04-16 at 09:52 -0400, Chuck Lever wrote:
> On Apr 16, 2009, at 1:17 AM, Suresh Jayaraman wrote:
> > Trond Myklebust wrote:
> >> On Wed, 2009-04-15 at 19:40 +0530, Suresh Jayaraman wrote:
> >>> The recent posixacl fix(commit  
> >>> ae46141ff08f1965b17c531b571953c39ce8b9e2)
> >>> seems to have introduced a bug that will lead to -EINVAL errors  
> >>> during
> >>> normal setfacl operations on file or dir. This patch attempts to fix
> >>> this.
> >>
> >> To start with, your len_in_head is in units of 32-bit _words_,  
> >> whereas
> >> len, base, and req->rq_slen are in units of bytes.
> >>
> >> Then, 'len' is initialised to the length of the currently encoded  
> >> part
> >> of the RPC header before subtracting 'len_in_head'. The resulting  
> >> number
> >
> > Doh, I got it wrong totally. Thanks for the explaination.
> >
> > On a side note, I think it would be nice to add little comments in xdr
> > code to explain non-obvious pieces.
> 
> As an aside, I think implementing this with xdr_streams might have  
> some clarity benefits.

Possibly, but right now, I just want to merge the one-liner fix into
2.6.30-rc2 and 2.6.29-stable...

Cheers
  Trond
-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@netapp.com
www.netapp.com

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

* Re: [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs()
       [not found]           ` <1239900127.4198.5.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
@ 2009-04-16 18:00             ` Chuck Lever
  0 siblings, 0 replies; 7+ messages in thread
From: Chuck Lever @ 2009-04-16 18:00 UTC (permalink / raw)
  To: Trond Myklebust; +Cc: Suresh Jayaraman, linux-nfs

On Apr 16, 2009, at 12:42 PM, Trond Myklebust wrote:
> On Thu, 2009-04-16 at 09:52 -0400, Chuck Lever wrote:
>> On Apr 16, 2009, at 1:17 AM, Suresh Jayaraman wrote:
>>> Trond Myklebust wrote:
>>>> On Wed, 2009-04-15 at 19:40 +0530, Suresh Jayaraman wrote:
>>>>> The recent posixacl fix(commit
>>>>> ae46141ff08f1965b17c531b571953c39ce8b9e2)
>>>>> seems to have introduced a bug that will lead to -EINVAL errors
>>>>> during
>>>>> normal setfacl operations on file or dir. This patch attempts to  
>>>>> fix
>>>>> this.
>>>>
>>>> To start with, your len_in_head is in units of 32-bit _words_,
>>>> whereas
>>>> len, base, and req->rq_slen are in units of bytes.
>>>>
>>>> Then, 'len' is initialised to the length of the currently encoded
>>>> part
>>>> of the RPC header before subtracting 'len_in_head'. The resulting
>>>> number
>>>
>>> Doh, I got it wrong totally. Thanks for the explaination.
>>>
>>> On a side note, I think it would be nice to add little comments in  
>>> xdr
>>> code to explain non-obvious pieces.
>>
>> As an aside, I think implementing this with xdr_streams might have
>> some clarity benefits.
>
> Possibly, but right now, I just want to merge the one-liner fix into
> 2.6.30-rc2 and 2.6.29-stable...

No rush, just a suggestion.

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com

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

end of thread, other threads:[~2009-04-16 18:38 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-15 14:10 [PATCH] NFS: Fix send buffer length calculation in nfs3_xdr_setaclargs() Suresh Jayaraman
2009-04-15 18:00 ` Trond Myklebust
     [not found]   ` <1239818456.5177.88.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-04-15 20:11     ` Leonardo Chiquitto
2009-04-16  5:17     ` Suresh Jayaraman
2009-04-16 13:52       ` Chuck Lever
2009-04-16 16:42         ` Trond Myklebust
     [not found]           ` <1239900127.4198.5.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-04-16 18:00             ` Chuck Lever

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.