/*
  * Verify the checksum on the header and return SVC_OK on success.
  * Otherwise, return SVC_DROP (in the case of a bad sequence number)
- * or return SVC_DENIED and indicate error in authp.
+ * or return SVC_DENIED and indicate error in rqstp->rq_auth_stat.
  */
 static int
 gss_verify_header(struct svc_rqst *rqstp, struct rsc *rsci,
-                 __be32 *rpcstart, struct rpc_gss_wire_cred *gc, __be32 *authp)
+                 __be32 *rpcstart, struct rpc_gss_wire_cred *gc)
 {
        struct gss_ctx          *ctx_id = rsci->mechctx;
        struct xdr_buf          rpchdr;
        iov.iov_len = (u8 *)argv->iov_base - (u8 *)rpcstart;
        xdr_buf_from_iov(&iov, &rpchdr);
 
-       *authp = rpc_autherr_badverf;
+       rqstp->rq_auth_stat = rpc_autherr_badverf;
        if (argv->iov_len < 4)
                return SVC_DENIED;
        flavor = svc_getnl(argv);
        if (rqstp->rq_deferred) /* skip verification of revisited request */
                return SVC_OK;
        if (gss_verify_mic(ctx_id, &rpchdr, &checksum) != GSS_S_COMPLETE) {
-               *authp = rpcsec_gsserr_credproblem;
+               rqstp->rq_auth_stat = rpcsec_gsserr_credproblem;
                return SVC_DENIED;
        }
 
        if (gc->gc_seq > MAXSEQ) {
                trace_rpcgss_svc_seqno_large(rqstp, gc->gc_seq);
-               *authp = rpcsec_gsserr_ctxproblem;
+               rqstp->rq_auth_stat = rpcsec_gsserr_ctxproblem;
                return SVC_DENIED;
        }
        if (!gss_check_seq_num(rqstp, rsci, gc->gc_seq))
 }
 
 static int gss_read_proxy_verf(struct svc_rqst *rqstp,
-                              struct rpc_gss_wire_cred *gc, __be32 *authp,
+                              struct rpc_gss_wire_cred *gc,
                               struct xdr_netobj *in_handle,
                               struct gssp_in_token *in_token)
 {
        int pages, i, res, pgto, pgfrom;
        size_t inlen, to_offs, from_offs;
 
-       res = gss_read_common_verf(gc, argv, authp, in_handle);
+       res = gss_read_common_verf(gc, argv, &rqstp->rq_auth_stat, in_handle);
        if (res)
                return res;
 
  * Otherwise, drop the request pending an answer to the upcall.
  */
 static int svcauth_gss_legacy_init(struct svc_rqst *rqstp,
-                       struct rpc_gss_wire_cred *gc, __be32 *authp)
+                                  struct rpc_gss_wire_cred *gc)
 {
        struct kvec *argv = &rqstp->rq_arg.head[0];
        struct kvec *resv = &rqstp->rq_res.head[0];
        struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id);
 
        memset(&rsikey, 0, sizeof(rsikey));
-       ret = gss_read_verf(gc, argv, authp,
+       ret = gss_read_verf(gc, argv, &rqstp->rq_auth_stat,
                            &rsikey.in_handle, &rsikey.in_token);
        if (ret)
                return ret;
 }
 
 static int svcauth_gss_proxy_init(struct svc_rqst *rqstp,
-                       struct rpc_gss_wire_cred *gc, __be32 *authp)
+                                 struct rpc_gss_wire_cred *gc)
 {
        struct kvec *resv = &rqstp->rq_res.head[0];
        struct xdr_netobj cli_handle;
        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
 
        memset(&ud, 0, sizeof(ud));
-       ret = gss_read_proxy_verf(rqstp, gc, authp,
-                                 &ud.in_handle, &ud.in_token);
+       ret = gss_read_proxy_verf(rqstp, gc, &ud.in_handle, &ud.in_token);
        if (ret)
                return ret;
 
  * response here and return SVC_COMPLETE.
  */
 static int
-svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)
+svcauth_gss_accept(struct svc_rqst *rqstp)
 {
        struct kvec     *argv = &rqstp->rq_arg.head[0];
        struct kvec     *resv = &rqstp->rq_res.head[0];
        int             ret;
        struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id);
 
-       *authp = rpc_autherr_badcred;
+       rqstp->rq_auth_stat = rpc_autherr_badcred;
        if (!svcdata)
                svcdata = kmalloc(sizeof(*svcdata), GFP_KERNEL);
        if (!svcdata)
        if ((gc->gc_proc != RPC_GSS_PROC_DATA) && (rqstp->rq_proc != 0))
                goto auth_err;
 
-       *authp = rpc_autherr_badverf;
+       rqstp->rq_auth_stat = rpc_autherr_badverf;
        switch (gc->gc_proc) {
        case RPC_GSS_PROC_INIT:
        case RPC_GSS_PROC_CONTINUE_INIT:
                if (use_gss_proxy(SVC_NET(rqstp)))
-                       return svcauth_gss_proxy_init(rqstp, gc, authp);
+                       return svcauth_gss_proxy_init(rqstp, gc);
                else
-                       return svcauth_gss_legacy_init(rqstp, gc, authp);
+                       return svcauth_gss_legacy_init(rqstp, gc);
        case RPC_GSS_PROC_DATA:
        case RPC_GSS_PROC_DESTROY:
                /* Look up the context, and check the verifier: */
-               *authp = rpcsec_gsserr_credproblem;
+               rqstp->rq_auth_stat = rpcsec_gsserr_credproblem;
                rsci = gss_svc_searchbyctx(sn->rsc_cache, &gc->gc_ctx);
                if (!rsci)
                        goto auth_err;
-               switch (gss_verify_header(rqstp, rsci, rpcstart, gc, authp)) {
+               switch (gss_verify_header(rqstp, rsci, rpcstart, gc)) {
                case SVC_OK:
                        break;
                case SVC_DENIED:
                }
                break;
        default:
-               *authp = rpc_autherr_rejectedcred;
+               rqstp->rq_auth_stat = rpc_autherr_rejectedcred;
                goto auth_err;
        }
 
                svc_putnl(resv, RPC_SUCCESS);
                goto complete;
        case RPC_GSS_PROC_DATA:
-               *authp = rpcsec_gsserr_ctxproblem;
+               rqstp->rq_auth_stat = rpcsec_gsserr_ctxproblem;
                svcdata->verf_start = resv->iov_base + resv->iov_len;
                if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))
                        goto auth_err;
                rqstp->rq_cred = rsci->cred;
                get_group_info(rsci->cred.cr_group_info);
-               *authp = rpc_autherr_badcred;
+               rqstp->rq_auth_stat = rpc_autherr_badcred;
                switch (gc->gc_svc) {
                case RPC_GSS_SVC_NONE:
                        break;
 
        struct svc_process_info process;
        __be32                  *statp;
        u32                     prog, vers;
-       __be32                  auth_stat, rpc_stat;
+       __be32                  rpc_stat;
        int                     auth_res;
        __be32                  *reply_statp;
 
         * We do this before anything else in order to get a decent
         * auth verifier.
         */
-       auth_res = svc_authenticate(rqstp, &auth_stat);
+       auth_res = svc_authenticate(rqstp);
        /* Also give the program a chance to reject this call: */
        if (auth_res == SVC_OK && progp) {
-               auth_stat = rpc_autherr_badcred;
+               rqstp->rq_auth_stat = rpc_autherr_badcred;
                auth_res = progp->pg_authenticate(rqstp);
        }
        if (auth_res != SVC_OK)
-               trace_svc_authenticate(rqstp, auth_res, auth_stat);
+               trace_svc_authenticate(rqstp, auth_res);
        switch (auth_res) {
        case SVC_OK:
                break;
                        goto release_dropit;
                if (*statp == rpc_garbage_args)
                        goto err_garbage;
-               auth_stat = svc_get_autherr(rqstp, statp);
-               if (auth_stat != rpc_auth_ok)
+               rqstp->rq_auth_stat = svc_get_autherr(rqstp, statp);
+               if (rqstp->rq_auth_stat != rpc_auth_ok)
                        goto err_release_bad_auth;
        } else {
                dprintk("svc: calling dispatcher\n");
        if (procp->pc_release)
                procp->pc_release(rqstp);
 err_bad_auth:
-       dprintk("svc: authentication failed (%d)\n", ntohl(auth_stat));
+       dprintk("svc: authentication failed (%d)\n",
+               be32_to_cpu(rqstp->rq_auth_stat));
        serv->sv_stats->rpcbadauth++;
        /* Restore write pointer to location of accept status: */
        xdr_ressize_check(rqstp, reply_statp);
        svc_putnl(resv, 1);     /* REJECT */
        svc_putnl(resv, 1);     /* AUTH_ERROR */
-       svc_putnl(resv, ntohl(auth_stat));      /* status */
+       svc_putu32(resv, rqstp->rq_auth_stat);  /* status */
        goto sendit;
 
 err_bad_prog:
 
 EXPORT_SYMBOL_GPL(svcauth_unix_set_client);
 
 static int
-svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp)
+svcauth_null_accept(struct svc_rqst *rqstp)
 {
        struct kvec     *argv = &rqstp->rq_arg.head[0];
        struct kvec     *resv = &rqstp->rq_res.head[0];
 
        if (svc_getu32(argv) != 0) {
                dprintk("svc: bad null cred\n");
-               *authp = rpc_autherr_badcred;
+               rqstp->rq_auth_stat = rpc_autherr_badcred;
                return SVC_DENIED;
        }
        if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
                dprintk("svc: bad null verf\n");
-               *authp = rpc_autherr_badverf;
+               rqstp->rq_auth_stat = rpc_autherr_badverf;
                return SVC_DENIED;
        }
 
 
 
 static int
-svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
+svcauth_unix_accept(struct svc_rqst *rqstp)
 {
        struct kvec     *argv = &rqstp->rq_arg.head[0];
        struct kvec     *resv = &rqstp->rq_res.head[0];
        }
        groups_sort(cred->cr_group_info);
        if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
-               *authp = rpc_autherr_badverf;
+               rqstp->rq_auth_stat = rpc_autherr_badverf;
                return SVC_DENIED;
        }
 
        return SVC_OK;
 
 badcred:
-       *authp = rpc_autherr_badcred;
+       rqstp->rq_auth_stat = rpc_autherr_badcred;
        return SVC_DENIED;
 }