netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch] svcrdma: endian bug in send_write_chunks()
@ 2012-01-12  6:47 Dan Carpenter
  2012-01-12 16:21 ` J. Bruce Fields
  0 siblings, 1 reply; 8+ messages in thread
From: Dan Carpenter @ 2012-01-12  6:47 UTC (permalink / raw)
  To: Trond Myklebust
  Cc: J. Bruce Fields, David S. Miller,
	linux-nfs-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
	kernel-janitors-u79uwXL29TY76Z2rM5mHXA

Sparse complains because arg_ch->rs_length is declared as network
endian but we're treating it as CPU endian.

Signed-off-by: Dan Carpenter <dan.carpenter-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>

diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
index 249a835..30fda86 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
@@ -409,7 +409,7 @@ static int send_write_chunks(struct svcxprt_rdma *xprt,
 		u64 rs_offset;
 
 		arg_ch = &arg_ary->wc_array[chunk_no].wc_target;
-		write_len = min(xfer_len, arg_ch->rs_length);
+		write_len = min(xfer_len, ntohl(arg_ch->rs_length));
 
 		/* Prepare the response chunk given the length actually
 		 * written */
@@ -481,7 +481,7 @@ static int send_reply_chunks(struct svcxprt_rdma *xprt,
 	     chunk_no++) {
 		u64 rs_offset;
 		ch = &arg_ary->wc_array[chunk_no].wc_target;
-		write_len = min(xfer_len, ch->rs_length);
+		write_len = min(xfer_len, ntohl(ch->rs_length));
 
 		/* Prepare the reply chunk given the length actually
 		 * written */
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
  2012-01-12  6:47 [patch] svcrdma: endian bug in send_write_chunks() Dan Carpenter
@ 2012-01-12 16:21 ` J. Bruce Fields
  2012-01-12 19:15   ` Trond Myklebust
       [not found]   ` <20120112162141.GC6563-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
  0 siblings, 2 replies; 8+ messages in thread
From: J. Bruce Fields @ 2012-01-12 16:21 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: Trond Myklebust, David S. Miller, linux-nfs, netdev,
	kernel-janitors, Tom Tucker

On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
> Sparse complains because arg_ch->rs_length is declared as network
> endian but we're treating it as CPU endian.

This looks like it would actually change behavior on a little endian
architecture, so how did this work before?

>From some quick grepping, I see assignments both of the form

	...rs_length = ntohl(...)

and

	...rs_length = htonl(...)

but only see one declaration for a field named rs_length.

So my best guess would be that the code is ugly but working as is, and
needs cleanup by someone who knows how this field was intended to be
used.

?

--b.

> 
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> 
> diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
> index 249a835..30fda86 100644
> --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
> +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
> @@ -409,7 +409,7 @@ static int send_write_chunks(struct svcxprt_rdma *xprt,
>  		u64 rs_offset;
>  
>  		arg_ch = &arg_ary->wc_array[chunk_no].wc_target;
> -		write_len = min(xfer_len, arg_ch->rs_length);
> +		write_len = min(xfer_len, ntohl(arg_ch->rs_length));
>  
>  		/* Prepare the response chunk given the length actually
>  		 * written */
> @@ -481,7 +481,7 @@ static int send_reply_chunks(struct svcxprt_rdma *xprt,
>  	     chunk_no++) {
>  		u64 rs_offset;
>  		ch = &arg_ary->wc_array[chunk_no].wc_target;
> -		write_len = min(xfer_len, ch->rs_length);
> +		write_len = min(xfer_len, ntohl(ch->rs_length));
>  
>  		/* Prepare the reply chunk given the length actually
>  		 * written */

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
  2012-01-12 16:21 ` J. Bruce Fields
@ 2012-01-12 19:15   ` Trond Myklebust
  2012-01-12 19:24     ` Tom Tucker
       [not found]     ` <1326395759.6198.7.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
       [not found]   ` <20120112162141.GC6563-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
  1 sibling, 2 replies; 8+ messages in thread
From: Trond Myklebust @ 2012-01-12 19:15 UTC (permalink / raw)
  To: J. Bruce Fields
  Cc: Dan Carpenter, David S. Miller, linux-nfs, netdev,
	kernel-janitors, Tom Tucker

On Thu, 2012-01-12 at 11:21 -0500, J. Bruce Fields wrote: 
> On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
> > Sparse complains because arg_ch->rs_length is declared as network
> > endian but we're treating it as CPU endian.
> 
> This looks like it would actually change behavior on a little endian
> architecture, so how did this work before?
> 
> >From some quick grepping, I see assignments both of the form
> 
> 	...rs_length = ntohl(...)
> 
> and
> 
> 	...rs_length = htonl(...)
> 
> but only see one declaration for a field named rs_length.
> 
> So my best guess would be that the code is ugly but working as is, and
> needs cleanup by someone who knows how this field was intended to be
> used.

It looks to me as if rs_handle and rs_offset are being similarly abused.
Basically, we need a serious clean up in svc_rdma_marshall.c to separate
out those variables that are in XDR-encoded form and those that are not.

-- 
Trond Myklebust
Linux NFS client maintainer

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

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
  2012-01-12 19:15   ` Trond Myklebust
@ 2012-01-12 19:24     ` Tom Tucker
       [not found]       ` <4F0F3380.4000406-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
       [not found]     ` <1326395759.6198.7.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
  1 sibling, 1 reply; 8+ messages in thread
From: Tom Tucker @ 2012-01-12 19:24 UTC (permalink / raw)
  To: Trond Myklebust
  Cc: J. Bruce Fields, Dan Carpenter, David S. Miller, linux-nfs,
	netdev, kernel-janitors

On 1/12/12 1:15 PM, Trond Myklebust wrote:
> On Thu, 2012-01-12 at 11:21 -0500, J. Bruce Fields wrote:
>> On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
>>> Sparse complains because arg_ch->rs_length is declared as network
>>> endian but we're treating it as CPU endian.
>> This looks like it would actually change behavior on a little endian
>> architecture, so how did this work before?
>>
>> > From some quick grepping, I see assignments both of the form
>>
>> 	...rs_length = ntohl(...)
>>
>> and
>>
>> 	...rs_length = htonl(...)
>>
>> but only see one declaration for a field named rs_length.
>>
>> So my best guess would be that the code is ugly but working as is, and
>> needs cleanup by someone who knows how this field was intended to be
>> used.
> It looks to me as if rs_handle and rs_offset are being similarly abused.
> Basically, we need a serious clean up in svc_rdma_marshall.c to separate
> out those variables that are in XDR-encoded form and those that are not.
>
The abuse is taking place because the marshal/unmarshall is being done 
in-place and it seemed wasteful at the time to add a chunk of memory to 
preserve the aesthetic. A union would 'work', but you still wouldn't 
'know' whether the data was NBO or not by where it was -- which seems like 
the intent of the __beXX in the first place.

Tom

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
       [not found]     ` <1326395759.6198.7.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
@ 2012-01-12 19:28       ` J. Bruce Fields
  0 siblings, 0 replies; 8+ messages in thread
From: J. Bruce Fields @ 2012-01-12 19:28 UTC (permalink / raw)
  To: Trond Myklebust
  Cc: Dan Carpenter, David S. Miller, linux-nfs-u79uwXL29TY76Z2rM5mHXA,
	netdev-u79uwXL29TY76Z2rM5mHXA,
	kernel-janitors-u79uwXL29TY76Z2rM5mHXA, Tom Tucker

On Thu, Jan 12, 2012 at 02:15:59PM -0500, Trond Myklebust wrote:
> On Thu, 2012-01-12 at 11:21 -0500, J. Bruce Fields wrote: 
> > On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
> > > Sparse complains because arg_ch->rs_length is declared as network
> > > endian but we're treating it as CPU endian.
> > 
> > This looks like it would actually change behavior on a little endian
> > architecture, so how did this work before?
> > 
> > >From some quick grepping, I see assignments both of the form
> > 
> > 	...rs_length = ntohl(...)
> > 
> > and
> > 
> > 	...rs_length = htonl(...)
> > 
> > but only see one declaration for a field named rs_length.
> > 
> > So my best guess would be that the code is ugly but working as is, and
> > needs cleanup by someone who knows how this field was intended to be
> > used.
> 
> It looks to me as if rs_handle and rs_offset are being similarly abused.
> Basically, we need a serious clean up in svc_rdma_marshall.c to separate
> out those variables that are in XDR-encoded form and those that are not.

(Here everybody takes one step back and pretends to be engrossed in some
other thread.)

--b.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
       [not found]       ` <4F0F3380.4000406-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
@ 2012-01-12 19:28         ` Trond Myklebust
       [not found]           ` <1326396510.6198.12.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Trond Myklebust @ 2012-01-12 19:28 UTC (permalink / raw)
  To: Tom Tucker
  Cc: J. Bruce Fields, Dan Carpenter, David S. Miller,
	linux-nfs-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
	kernel-janitors-u79uwXL29TY76Z2rM5mHXA

On Thu, 2012-01-12 at 13:24 -0600, Tom Tucker wrote: 
> On 1/12/12 1:15 PM, Trond Myklebust wrote:
> > On Thu, 2012-01-12 at 11:21 -0500, J. Bruce Fields wrote:
> >> On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
> >>> Sparse complains because arg_ch->rs_length is declared as network
> >>> endian but we're treating it as CPU endian.
> >> This looks like it would actually change behavior on a little endian
> >> architecture, so how did this work before?
> >>
> >> > From some quick grepping, I see assignments both of the form
> >>
> >> 	...rs_length = ntohl(...)
> >>
> >> and
> >>
> >> 	...rs_length = htonl(...)
> >>
> >> but only see one declaration for a field named rs_length.
> >>
> >> So my best guess would be that the code is ugly but working as is, and
> >> needs cleanup by someone who knows how this field was intended to be
> >> used.
> > It looks to me as if rs_handle and rs_offset are being similarly abused.
> > Basically, we need a serious clean up in svc_rdma_marshall.c to separate
> > out those variables that are in XDR-encoded form and those that are not.
> >
> The abuse is taking place because the marshal/unmarshall is being done 
> in-place and it seemed wasteful at the time to add a chunk of memory to 
> preserve the aesthetic. A union would 'work', but you still wouldn't 
> 'know' whether the data was NBO or not by where it was -- which seems like 
> the intent of the __beXX in the first place.

These are not variables that are used in hundreds of different places:
why not just do the conversion from big-endian to cpu-endian when you
actually need to use them?

-- 
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org
www.netapp.com

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
       [not found]           ` <1326396510.6198.12.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
@ 2012-01-12 19:37             ` Tom Tucker
  0 siblings, 0 replies; 8+ messages in thread
From: Tom Tucker @ 2012-01-12 19:37 UTC (permalink / raw)
  To: Trond Myklebust
  Cc: J. Bruce Fields, Dan Carpenter, David S. Miller,
	linux-nfs-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
	kernel-janitors-u79uwXL29TY76Z2rM5mHXA

On 1/12/12 1:28 PM, Trond Myklebust wrote:
> On Thu, 2012-01-12 at 13:24 -0600, Tom Tucker wrote:
>> On 1/12/12 1:15 PM, Trond Myklebust wrote:
>>> On Thu, 2012-01-12 at 11:21 -0500, J. Bruce Fields wrote:
>>>> On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
>>>>> Sparse complains because arg_ch->rs_length is declared as network
>>>>> endian but we're treating it as CPU endian.
>>>> This looks like it would actually change behavior on a little endian
>>>> architecture, so how did this work before?
>>>>
>>>>>  From some quick grepping, I see assignments both of the form
>>>> 	...rs_length = ntohl(...)
>>>>
>>>> and
>>>>
>>>> 	...rs_length = htonl(...)
>>>>
>>>> but only see one declaration for a field named rs_length.
>>>>
>>>> So my best guess would be that the code is ugly but working as is, and
>>>> needs cleanup by someone who knows how this field was intended to be
>>>> used.
>>> It looks to me as if rs_handle and rs_offset are being similarly abused.
>>> Basically, we need a serious clean up in svc_rdma_marshall.c to separate
>>> out those variables that are in XDR-encoded form and those that are not.
>>>
>> The abuse is taking place because the marshal/unmarshall is being done
>> in-place and it seemed wasteful at the time to add a chunk of memory to
>> preserve the aesthetic. A union would 'work', but you still wouldn't
>> 'know' whether the data was NBO or not by where it was -- which seems like
>> the intent of the __beXX in the first place.
> These are not variables that are used in hundreds of different places:
> why not just do the conversion from big-endian to cpu-endian when you
> actually need to use them?

That would work fine actually. At the time, I was trying to put all that 
marshalling logic in that one file and reuse the already present 
client-side header file that copies that stuff when it decodes it.

I'll dig around a little bit and see what might be the simplest way to 
clean this up.

Tom


--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [patch] svcrdma: endian bug in send_write_chunks()
       [not found]   ` <20120112162141.GC6563-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
@ 2012-01-12 21:32     ` Dan Carpenter
  0 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2012-01-12 21:32 UTC (permalink / raw)
  To: J. Bruce Fields
  Cc: Trond Myklebust, David S. Miller,
	linux-nfs-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
	kernel-janitors-u79uwXL29TY76Z2rM5mHXA, Tom Tucker

[-- Attachment #1: Type: text/plain, Size: 986 bytes --]

On Thu, Jan 12, 2012 at 11:21:41AM -0500, J. Bruce Fields wrote:
> On Thu, Jan 12, 2012 at 09:47:22AM +0300, Dan Carpenter wrote:
> > Sparse complains because arg_ch->rs_length is declared as network
> > endian but we're treating it as CPU endian.
> 
> This looks like it would actually change behavior on a little endian
> architecture, so how did this work before?
> 
> >From some quick grepping, I see assignments both of the form
> 
> 	...rs_length = ntohl(...)
> 
> and
> 
> 	...rs_length = htonl(...)
> 
> but only see one declaration for a field named rs_length.
> 
> So my best guess would be that the code is ugly but working as is, and
> needs cleanup by someone who knows how this field was intended to be
> used.

Gar.  Sorry for that.  I knew it changed the behavior, and I tried
to see how the original code worked, but I didn't read carefully
enough.  I'll try be more careful next time.

Thanks for catching that.

regards,
dan carpenter


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

end of thread, other threads:[~2012-01-12 21:32 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-12  6:47 [patch] svcrdma: endian bug in send_write_chunks() Dan Carpenter
2012-01-12 16:21 ` J. Bruce Fields
2012-01-12 19:15   ` Trond Myklebust
2012-01-12 19:24     ` Tom Tucker
     [not found]       ` <4F0F3380.4000406-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
2012-01-12 19:28         ` Trond Myklebust
     [not found]           ` <1326396510.6198.12.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
2012-01-12 19:37             ` Tom Tucker
     [not found]     ` <1326395759.6198.7.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
2012-01-12 19:28       ` J. Bruce Fields
     [not found]   ` <20120112162141.GC6563-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2012-01-12 21:32     ` Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).