xdr->buf = buf;
        xdr->iov = head;
        xdr->p   = head->iov_base + head->iov_len;
-       xdr->end = head->iov_base + PAGE_SIZE - 2 * RPC_MAX_AUTH_SIZE;
+       xdr->end = head->iov_base + PAGE_SIZE - rqstp->rq_auth_slack;
        /* Tail and page_len should be zero at this point: */
        buf->len = buf->head[0].iov_len;
        xdr->scratch.iov_len = 0;
        xdr->page_ptr = buf->pages;
        buf->buflen = PAGE_SIZE * (1 + rqstp->rq_page_end - buf->pages)
-               - 2 * RPC_MAX_AUTH_SIZE;
+               - rqstp->rq_auth_slack;
 }
 
 /*
 
                        session->se_fchannel.maxresp_sz;
        status = (seq->cachethis) ? nfserr_rep_too_big_to_cache :
                                    nfserr_rep_too_big;
-       if (xdr_restrict_buflen(xdr, buflen - 2 * RPC_MAX_AUTH_SIZE))
+       if (xdr_restrict_buflen(xdr, buflen - rqstp->rq_auth_slack))
                goto out_put_session;
        svc_reserve(rqstp, buflen);
 
 
        DECODE_HEAD;
        struct nfsd4_op *op;
        bool cachethis = false;
-       int max_reply = 2 * RPC_MAX_AUTH_SIZE + 8; /* opcnt, status */
+       int auth_slack= argp->rqstp->rq_auth_slack;
+       int max_reply = auth_slack + 8; /* opcnt, status */
        int readcount = 0;
        int readbytes = 0;
        int i;
        svc_reserve(argp->rqstp, max_reply + readbytes);
        argp->rqstp->rq_cachetype = cachethis ? RC_REPLBUFF : RC_NOCACHE;
 
-       if (readcount > 1 || max_reply > PAGE_SIZE - 2*RPC_MAX_AUTH_SIZE)
+       if (readcount > 1 || max_reply > PAGE_SIZE - auth_slack)
                argp->rqstp->rq_splice_ok = false;
 
        DECODE_TAIL;
 
        void *                  rq_argp;        /* decoded arguments */
        void *                  rq_resp;        /* xdr'd results */
        void *                  rq_auth_data;   /* flavor-specific data */
-
+       int                     rq_auth_slack;  /* extra space xdr code
+                                                * should leave in head
+                                                * for krb5i, krb5p.
+                                                */
        int                     rq_reserved;    /* space on socket outq
                                                 * reserved for this request
                                                 */
  */
 static inline void svc_reserve_auth(struct svc_rqst *rqstp, int space)
 {
-       int added_space = 0;
-
-       if (rqstp->rq_authop->flavour)
-               added_space = RPC_MAX_AUTH_SIZE;
-       svc_reserve(rqstp, space + added_space);
+       svc_reserve(rqstp, space + rqstp->rq_auth_slack);
 }
 
 #endif /* SUNRPC_SVC_H */
 
                        if (unwrap_integ_data(rqstp, &rqstp->rq_arg,
                                        gc->gc_seq, rsci->mechctx))
                                goto garbage_args;
+                       rqstp->rq_auth_slack = RPC_MAX_AUTH_SIZE;
                        break;
                case RPC_GSS_SVC_PRIVACY:
                        /* placeholders for length and seq. number: */
                        if (unwrap_priv_data(rqstp, &rqstp->rq_arg,
                                        gc->gc_seq, rsci->mechctx))
                                goto garbage_args;
+                       rqstp->rq_auth_slack = RPC_MAX_AUTH_SIZE * 2;
                        break;
                default:
                        goto auth_err;
 
        }
        spin_unlock(&authtab_lock);
 
+       rqstp->rq_auth_slack = 0;
+
        rqstp->rq_authop = aops;
        return aops->accept(rqstp, authp);
 }