From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@poochiereds.net>
Cc: Chuck Lever <chuck.lever@oracle.com>,
Chuck Lever <chucklever@gmail.com>,
linux-nfs@vger.kernel.org
Subject: Re: [PATCH] svcrdma: set XPT_CONG_CTRL flag for bc xprt
Date: Tue, 28 Mar 2017 21:16:38 -0400 [thread overview]
Message-ID: <20170329011638.GA20963@fieldses.org> (raw)
In-Reply-To: <1490618353.6879.3.camel@poochiereds.net>
On Mon, Mar 27, 2017 at 08:39:13AM -0400, Jeff Layton wrote:
> Something like this patch maybe? Builds but is otherwise untested. It
> might not DTRT though in the (nonsensical) case where you have a server
> that is listening on UDP but doesn't support v2 or v3. Not sure I
> really care about that too much.
I don't think this is worth the trouble.
A client that attempts to mount NFSv4 over UDP is operating out of spec,
and we don't owe them much.
I'm not even convinced that transport-specific high/low version returns
are correct. A client could in theory be configured to prefer UDP and
NFSv3, but to fall back to NFSv4 and TCP if NFSv3 was unavailable, and
this would break that. That would be legal but admittedly odd client
behavior.
If somebody actually hits a case where this patch would help, then let's
reconsider.
--b.
>
> [PATCH] sunrpc: dynamically set versions in PROG_MISMATCH error reply
>
> Signed-off-by: Jeff Layton <jlayton@redhat.com>
> ---
> include/linux/sunrpc/svc.h | 2 --
> net/sunrpc/svc.c | 47 ++++++++++++++++++++++++++++++++++------------
> 2 files changed, 35 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
> index e770abeed32d..f19321cfcf21 100644
> --- a/include/linux/sunrpc/svc.h
> +++ b/include/linux/sunrpc/svc.h
> @@ -381,8 +381,6 @@ struct svc_deferred_req {
> struct svc_program {
> struct svc_program * pg_next; /* other programs (same xprt) */
> u32 pg_prog; /* program number */
> - unsigned int pg_lovers; /* lowest version */
> - unsigned int pg_hivers; /* highest version */
> unsigned int pg_nvers; /* number of versions */
> struct svc_version ** pg_vers; /* version array */
> char * pg_name; /* service name */
> diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
> index a08aeb56b8e4..c81f68064313 100644
> --- a/net/sunrpc/svc.c
> +++ b/net/sunrpc/svc.c
> @@ -441,18 +441,13 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
> serv->sv_ops = ops;
> xdrsize = 0;
> while (prog) {
> - prog->pg_lovers = prog->pg_nvers-1;
> for (vers=0; vers<prog->pg_nvers ; vers++)
> - if (prog->pg_vers[vers]) {
> - prog->pg_hivers = vers;
> - if (prog->pg_lovers > vers)
> - prog->pg_lovers = vers;
> - if (prog->pg_vers[vers]->vs_xdrsize > xdrsize)
> - xdrsize = prog->pg_vers[vers]->vs_xdrsize;
> - }
> + if (prog->pg_vers[vers] &&
> + prog->pg_vers[vers]->vs_xdrsize > xdrsize)
> + xdrsize = prog->pg_vers[vers]->vs_xdrsize;
> prog = prog->pg_next;
> }
> - serv->sv_xdrsize = xdrsize;
> + serv->sv_xdrsize = xdrsize;
> INIT_LIST_HEAD(&serv->sv_tempsocks);
> INIT_LIST_HEAD(&serv->sv_permsocks);
> init_timer(&serv->sv_temptimer);
> @@ -1086,6 +1081,36 @@ void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
> static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) {}
> #endif
>
> +static void
> +svc_set_prog_mismatch(struct svc_rqst *rqstp, struct svc_program *prog,
> + struct kvec *resv)
> +{
> + unsigned int vers, hi = 0, lo = prog->pg_nvers - 1;
> + struct svc_version *versp;
> +
> + for (vers = 0; vers < prog->pg_nvers ; vers++) {
> + versp = prog->pg_vers[vers];
> + if (!versp)
> + continue;
> +
> + /*
> + * Don't report this version if it needs congestion control
> + * and the xprt doesn't provide it.
> + */
> + if (versp->vs_need_cong_ctrl &&
> + !test_bit(XPT_CONG_CTRL, &rqstp->rq_xprt->xpt_flags))
> + continue;
> +
> + hi = vers;
> + if (lo > vers)
> + lo = vers;
> + }
> +
> + svc_putnl(resv, RPC_PROG_MISMATCH);
> + svc_putnl(resv, lo);
> + svc_putnl(resv, hi);
> +}
> +
> /*
> * Common routine for processing the RPC request.
> */
> @@ -1315,9 +1340,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
> vers, prog, progp->pg_name);
>
> serv->sv_stats->rpcbadfmt++;
> - svc_putnl(resv, RPC_PROG_MISMATCH);
> - svc_putnl(resv, progp->pg_lovers);
> - svc_putnl(resv, progp->pg_hivers);
> + svc_set_prog_mismatch(rqstp, progp, resv);
> goto sendit;
>
> err_bad_proc:
> --
> 2.9.3
next prev parent reply other threads:[~2017-03-29 1:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-26 23:27 [PATCH] svcrdma: set XPT_CONG_CTRL flag for bc xprt Chuck Lever
2017-03-27 1:21 ` Jeff Layton
2017-03-27 2:38 ` Chuck Lever
2017-03-27 2:41 ` Chuck Lever
2017-03-27 11:07 ` Jeff Layton
2017-03-27 12:39 ` Jeff Layton
2017-03-29 1:16 ` J. Bruce Fields [this message]
2017-03-29 11:01 ` Jeff Layton
2017-03-29 1:22 ` J. Bruce Fields
2017-03-29 11:02 ` Jeff Layton
2017-03-29 1:27 ` J. Bruce Fields
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=20170329011638.GA20963@fieldses.org \
--to=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=chucklever@gmail.com \
--cc=jlayton@poochiereds.net \
--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).