2009-06-03 23:30:50

by Labiaga, Ricardo

[permalink] [raw]
Subject: RE: [pnfs] [RFC 02/39] nfs41: Skip past the RPC call direction

> -----Original Message-----
> From: Myklebust, Trond
> Sent: Wednesday, June 03, 2009 2:30 PM
> To: Benny Halevy
> Cc: [email protected]; [email protected]
> Subject: Re: [pnfs] [RFC 02/39] nfs41: Skip past the RPC call
direction
>
> On Fri, 2009-05-01 at 02:19 +0300, Benny Halevy wrote:
> > From: Ricardo Labiaga <[email protected]>
> >
> > xs_tcp_read_calldir() is now responsible for reading the RPC call
> > direction and determining whether it is a reply or a callback
request.
> > The call to xdr_skb_read_bits() inside xs_tcp_read_calldir() moves
the
> > xdr_skb_reader offset past the RPC call direction (offset should be
> > equal to 8). Therefore xs_tcp_read_common() called from
> > xs_tcp_ready_reply() should be copying the TCP buffer starting past
the
> > RPC call direction. It is now necessary to read the RPC call
direction
> > earlier to determine whether to call the reply handler or the
callback
> > handler.
> >
> > call_verify() should therefore skip past the XID and call/reply
flag.
> >
> > Signed-off-by: Ricardo Labiaga <[email protected]>
> > Signed-off-by: Benny Halevy <[email protected]>
> > ---
> > net/sunrpc/clnt.c | 13 +++++++------
> > 1 files changed, 7 insertions(+), 6 deletions(-)
> >
> > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
> > index d00e813..76d7d46 100644
> > --- a/net/sunrpc/clnt.c
> > +++ b/net/sunrpc/clnt.c
> > @@ -1390,13 +1390,14 @@ rpc_verify_header(struct rpc_task *task)
> > }
> > if ((len -= 3) < 0)
> > goto out_overflow;
> > - p += 1; /* skip XID */
> >
> > - if ((n = ntohl(*p++)) != RPC_REPLY) {
> > - dprintk("RPC: %5u %s: not an RPC reply: %x\n",
> > - task->tk_pid, __func__, n);
> > - goto out_garbage;
> > - }
> > + /*
> > + * Skip the XID and call direction.
> > + * The underlying transport has read the XID and RPC call
direction
> > + * to determine this is an RPC reply.
> > + */
> > + p += 2;
> > +
> > if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) {
> > if (--len < 0)
> > goto out_overflow;
>
> Err... No... The above comment is true only for the case of TCP. Why
> don't you simply copy the RPC call direction into the buffer?

You're right. We'll follow your suggestion to copy it into the buffer
and leave the processing as it originally was in rpc_verify_header().

- ricardo


> --
> Trond Myklebust
> Linux NFS client maintainer
>
> NetApp
> [email protected]
> http://www.netapp.com
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"
in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html