Strictly speaking, the client is probably not supposed to transmit more requests than are allowed for in the RPCSEC_GSS window. However since we do, try to ensure that we allow for some re-ordering by the server. Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> --- net/sunrpc/auth_gss/auth_gss.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index ba765473d1f0..dc7124d45c8a 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -2029,9 +2029,6 @@ gss_xmit_need_reencode(struct rpc_task *task) if (!ctx) return true; - if (gss_seq_is_newer(req->rq_seqno, READ_ONCE(ctx->gc_seq))) - goto out; - seq_xmit = READ_ONCE(ctx->gc_seq_xmit); while (gss_seq_is_newer(req->rq_seqno, seq_xmit)) { u32 tmp = seq_xmit; @@ -2043,7 +2040,12 @@ gss_xmit_need_reencode(struct rpc_task *task) } } - win = ctx->gc_win; + /* + * Ensure the request is within 3/4 of the RPCSEC_GSS sequence + * window so that we allow for some re-ordering of the requests + * by the server. + */ + win = 3 * ((ctx->gc_win + 3) >> 2); if (win > 0) ret = !gss_seq_is_newer(req->rq_seqno, seq_xmit - win); out: -- 2.20.1