linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: Benny Halevy <bhalevy@panasas.com>,
	" J. Bruce Fields" <bfields@redhat.com>,
	linux-nfs@vger.kernel.org
Subject: Re: [PATCH 2/2] NFSD: do common error handling in decode_cb_op_status
Date: Tue, 18 Jan 2011 18:19:36 -0500	[thread overview]
Message-ID: <20110118231936.GH10903@fieldses.org> (raw)
In-Reply-To: <A454C748-0AA0-4380-961C-57ACD35F39BC@oracle.com>

On Tue, Jan 18, 2011 at 05:20:41PM -0500, Chuck Lever wrote:
> 
> On Jan 13, 2011, at 4:25 AM, Benny Halevy wrote:
> 
> > Rather than handling the cb operation status in each and every
> > decode_cb_op_status's caller, just put the common code there.
> > 
> > If need be, and some caller really needs to see the original status
> > this patch can be reverted but right now there's no real need for the
> > abstract functionality.
> 
> a) all the other new status decoders do it the generic way, so this would be a special case.  We already know it's not needed here at this point, but it is consistent with the other decoders.
> 
> b) we lose the distinction between a returned status code and a decoding error.  I recall finding a few bugs in the other decoders where the two are conflated.
> 
> I'd rather not apply this one.  I think it's premature and unneeded optimization.  I'm sure I'll be voted down, though.

I think what you mean to say is: "if you vote me down, I shall become
more powerful than you can possibly imagine."

Anyway, I suppose if we fix the callback error handling soon (as we
should) then we'd be reverting this soon anyway, so I'll drop this one
for now.

--b.

> 
> > 
> > Cc: Chuck Lever <chuck.lever@oracle.com>
> > Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> > ---
> > fs/nfsd/nfs4callback.c |   22 +++++++---------------
> > 1 files changed, 7 insertions(+), 15 deletions(-)
> > 
> > diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
> > index 5a6dcf8..6f69645 100644
> > --- a/fs/nfsd/nfs4callback.c
> > +++ b/fs/nfsd/nfs4callback.c
> > @@ -248,11 +248,11 @@ static int nfs_cb_stat_to_errno(int status)
> > 	return -status;
> > }
> > 
> > -static int decode_cb_op_status(struct xdr_stream *xdr, enum nfs_opnum4 expected,
> > -			       enum nfsstat4 *status)
> > +static int decode_cb_op_status(struct xdr_stream *xdr, enum nfs_opnum4 expected)
> > {
> > 	__be32 *p;
> > 	u32 op;
> > +	enum nfsstat4 status;
> > 
> > 	p = xdr_inline_decode(xdr, 4 + 4);
> > 	if (unlikely(p == NULL))
> > @@ -260,7 +260,9 @@ static int decode_cb_op_status(struct xdr_stream *xdr, enum nfs_opnum4 expected,
> > 	op = be32_to_cpup(p++);
> > 	if (unlikely(op != expected))
> > 		goto out_unexpected;
> > -	*status = be32_to_cpup(p);
> > +	status = be32_to_cpup(p);
> > +	if (unlikely(status != NFS4_OK))
> > +		return nfs_cb_stat_to_errno(status);
> > 	return 0;
> > out_overflow:
> > 	print_overflow_msg(__func__, xdr);
> > @@ -469,22 +471,17 @@ out_overflow:
> > static int decode_cb_sequence4res(struct xdr_stream *xdr,
> > 				  struct nfsd4_callback *cb)
> > {
> > -	enum nfsstat4 nfserr;
> > 	int status;
> > 
> > 	if (cb->cb_minorversion == 0)
> > 		return 0;
> > 
> > -	status = decode_cb_op_status(xdr, OP_CB_SEQUENCE, &nfserr);
> > +	status = decode_cb_op_status(xdr, OP_CB_SEQUENCE);
> > 	if (unlikely(status))
> > 		goto out;
> > -	if (unlikely(nfserr != NFS4_OK))
> > -		goto out_default;
> > 	status = decode_cb_sequence4resok(xdr, cb);
> > out:
> > 	return status;
> > -out_default:
> > -	return nfs_cb_stat_to_errno(nfserr);
> > }
> > 
> > /*
> > @@ -547,7 +544,6 @@ static int nfs4_xdr_dec_cb_recall(struct rpc_rqst *rqstp,
> > 				  struct nfsd4_callback *cb)
> > {
> > 	struct nfs4_cb_compound_hdr hdr;
> > -	enum nfsstat4 nfserr;
> > 	int status;
> > 
> > 	status = decode_cb_compound4res(xdr, &hdr);
> > @@ -560,11 +556,7 @@ static int nfs4_xdr_dec_cb_recall(struct rpc_rqst *rqstp,
> > 			goto out;
> > 	}
> > 
> > -	status = decode_cb_op_status(xdr, OP_CB_RECALL, &nfserr);
> > -	if (unlikely(status))
> > -		goto out;
> > -	if (unlikely(nfserr != NFS4_OK))
> > -		status = nfs_cb_stat_to_errno(nfserr);
> > +	status = decode_cb_op_status(xdr, OP_CB_RECALL);
> > out:
> > 	return status;
> > }
> > -- 
> > 1.7.3.4
> > 
> 
> -- 
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
> 
> 
> 
> 

  reply	other threads:[~2011-01-18 23:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-13  9:23 [PATCH 0/2] decode_cb_op_status fix Benny Halevy
2011-01-13  9:25 ` [PATCH 1/2] NFSD: use nfserr for status after decode_cb_op_status Benny Halevy
2011-01-18 22:13   ` Chuck Lever
2011-01-13  9:25 ` [PATCH 2/2] NFSD: do common error handling in decode_cb_op_status Benny Halevy
2011-01-18 22:20   ` Chuck Lever
2011-01-18 23:19     ` J. Bruce Fields [this message]
2011-01-18 21:57 ` [PATCH 0/2] decode_cb_op_status fix J. Bruce Fields
2011-01-18 21:59   ` Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110118231936.GH10903@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=bfields@redhat.com \
    --cc=bhalevy@panasas.com \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).