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
>
>
>
>
next prev parent 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).