* NULL: Test for presence of service
  */
 static __be32
-nlm4svc_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nlm4svc_proc_null(struct svc_rqst *rqstp)
 {
        dprintk("lockd: NULL          called\n");
        return rpc_success;
  * TEST: Check for conflicting lock
  */
 static __be32
-nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                        struct nlm_res  *resp)
+__nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        __be32 rc = rpc_success;
 }
 
 static __be32
-nlm4svc_proc_lock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                        struct nlm_res  *resp)
+nlm4svc_proc_test(struct svc_rqst *rqstp)
 {
+       return __nlm4svc_proc_test(rqstp, rqstp->rq_resp);
+}
+
+static __be32
+__nlm4svc_proc_lock(struct svc_rqst *rqstp, struct nlm_res *resp)
+{
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        __be32 rc = rpc_success;
 }
 
 static __be32
-nlm4svc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                          struct nlm_res  *resp)
+nlm4svc_proc_lock(struct svc_rqst *rqstp)
+{
+       return __nlm4svc_proc_lock(rqstp, rqstp->rq_resp);
+}
+
+static __be32
+__nlm4svc_proc_cancel(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
 
        return rpc_success;
 }
 
+static __be32
+nlm4svc_proc_cancel(struct svc_rqst *rqstp)
+{
+       return __nlm4svc_proc_cancel(rqstp, rqstp->rq_resp);
+}
+
 /*
  * UNLOCK: release a lock
  */
 static __be32
-nlm4svc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                          struct nlm_res  *resp)
+__nlm4svc_proc_unlock(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
 
        return rpc_success;
 }
 
+static __be32
+nlm4svc_proc_unlock(struct svc_rqst *rqstp)
+{
+       return __nlm4svc_proc_unlock(rqstp, rqstp->rq_resp);
+}
+
 /*
  * GRANTED: A server calls us to tell that a process' lock request
  * was granted
  */
 static __be32
-nlm4svc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+__nlm4svc_proc_granted(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        resp->cookie = argp->cookie;
 
        dprintk("lockd: GRANTED       called\n");
        return rpc_success;
 }
 
+static __be32
+nlm4svc_proc_granted(struct svc_rqst *rqstp)
+{
+       return __nlm4svc_proc_granted(rqstp, rqstp->rq_resp);
+}
+
 /*
  * This is the generic lockd callback for async RPC calls
  */
  * because we send the callback before the reply proper. I hope this
  * doesn't break any clients.
  */
-static __be32 nlm4svc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_args *argp,
-               __be32 (*func)(struct svc_rqst *, struct nlm_args *, struct nlm_res  *))
+static __be32 nlm4svc_callback(struct svc_rqst *rqstp, u32 proc,
+               __be32 (*func)(struct svc_rqst *,  struct nlm_res *))
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_rqst *call;
        __be32 stat;
        if (call == NULL)
                return rpc_system_err;
 
-       stat = func(rqstp, argp, &call->a_res);
+       stat = func(rqstp, &call->a_res);
        if (stat != 0) {
                nlmsvc_release_call(call);
                return stat;
        return rpc_success;
 }
 
-static __be32 nlm4svc_proc_test_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+static __be32 nlm4svc_proc_test_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: TEST_MSG      called\n");
-       return nlm4svc_callback(rqstp, NLMPROC_TEST_RES, argp, nlm4svc_proc_test);
+       return nlm4svc_callback(rqstp, NLMPROC_TEST_RES, __nlm4svc_proc_test);
 }
 
-static __be32 nlm4svc_proc_lock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+static __be32 nlm4svc_proc_lock_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: LOCK_MSG      called\n");
-       return nlm4svc_callback(rqstp, NLMPROC_LOCK_RES, argp, nlm4svc_proc_lock);
+       return nlm4svc_callback(rqstp, NLMPROC_LOCK_RES, __nlm4svc_proc_lock);
 }
 
-static __be32 nlm4svc_proc_cancel_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                              void            *resp)
+static __be32 nlm4svc_proc_cancel_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: CANCEL_MSG    called\n");
-       return nlm4svc_callback(rqstp, NLMPROC_CANCEL_RES, argp, nlm4svc_proc_cancel);
+       return nlm4svc_callback(rqstp, NLMPROC_CANCEL_RES, __nlm4svc_proc_cancel);
 }
 
-static __be32 nlm4svc_proc_unlock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                               void            *resp)
+static __be32 nlm4svc_proc_unlock_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: UNLOCK_MSG    called\n");
-       return nlm4svc_callback(rqstp, NLMPROC_UNLOCK_RES, argp, nlm4svc_proc_unlock);
+       return nlm4svc_callback(rqstp, NLMPROC_UNLOCK_RES, __nlm4svc_proc_unlock);
 }
 
-static __be32 nlm4svc_proc_granted_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                                void            *resp)
+static __be32 nlm4svc_proc_granted_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: GRANTED_MSG   called\n");
-       return nlm4svc_callback(rqstp, NLMPROC_GRANTED_RES, argp, nlm4svc_proc_granted);
+       return nlm4svc_callback(rqstp, NLMPROC_GRANTED_RES, __nlm4svc_proc_granted);
 }
 
 /*
  * SHARE: create a DOS share or alter existing share.
  */
 static __be32
-nlm4svc_proc_share(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                         struct nlm_res  *resp)
+nlm4svc_proc_share(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+       struct nlm_res *resp = rqstp->rq_resp;
        struct nlm_host *host;
        struct nlm_file *file;
 
  * UNSHARE: Release a DOS share.
  */
 static __be32
-nlm4svc_proc_unshare(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+nlm4svc_proc_unshare(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+       struct nlm_res *resp = rqstp->rq_resp;
        struct nlm_host *host;
        struct nlm_file *file;
 
  * NM_LOCK: Create an unmonitored lock
  */
 static __be32
-nlm4svc_proc_nm_lock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+nlm4svc_proc_nm_lock(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        dprintk("lockd: NM_LOCK       called\n");
 
        argp->monitor = 0;              /* just clean the monitor flag */
-       return nlm4svc_proc_lock(rqstp, argp, resp);
+       return nlm4svc_proc_lock(rqstp);
 }
 
 /*
  * FREE_ALL: Release all locks and shares held by client
  */
 static __be32
-nlm4svc_proc_free_all(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+nlm4svc_proc_free_all(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
 
        /* Obtain client */
  * SM_NOTIFY: private callback from statd (not part of official NLM proto)
  */
 static __be32
-nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
-                                             void              *resp)
+nlm4svc_proc_sm_notify(struct svc_rqst *rqstp)
 {
+       struct nlm_reboot *argp = rqstp->rq_argp;
+
        dprintk("lockd: SM_NOTIFY     called\n");
 
        if (!nlm_privileged_requester(rqstp)) {
  * client sent a GRANTED_RES, let's remove the associated block
  */
 static __be32
-nlm4svc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res  *argp,
-                                                void            *resp)
+nlm4svc_proc_granted_res(struct svc_rqst *rqstp)
 {
+       struct nlm_res *argp = rqstp->rq_argp;
+
         if (!nlmsvc_ops)
                 return rpc_success;
 
 struct nlm_void                        { int dummy; };
 
 #define PROC(name, xargt, xrest, argt, rest, respsize) \
- { .pc_func    = (svc_procfunc) nlm4svc_proc_##name,   \
+ { .pc_func    = nlm4svc_proc_##name,  \
    .pc_decode  = (kxdrproc_t) nlm4svc_decode_##xargt,  \
    .pc_encode  = (kxdrproc_t) nlm4svc_encode_##xrest,  \
    .pc_release = NULL,                                 \
 
  * NULL: Test for presence of service
  */
 static __be32
-nlmsvc_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nlmsvc_proc_null(struct svc_rqst *rqstp)
 {
        dprintk("lockd: NULL          called\n");
        return rpc_success;
  * TEST: Check for conflicting lock
  */
 static __be32
-nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                        struct nlm_res  *resp)
+__nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        __be32 rc = rpc_success;
 }
 
 static __be32
-nlmsvc_proc_lock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                        struct nlm_res  *resp)
+nlmsvc_proc_test(struct svc_rqst *rqstp)
 {
+       return __nlmsvc_proc_test(rqstp, rqstp->rq_resp);
+}
+
+static __be32
+__nlmsvc_proc_lock(struct svc_rqst *rqstp, struct nlm_res *resp)
+{
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        __be32 rc = rpc_success;
 }
 
 static __be32
-nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                          struct nlm_res  *resp)
+nlmsvc_proc_lock(struct svc_rqst *rqstp)
+{
+       return __nlmsvc_proc_lock(rqstp, rqstp->rq_resp);
+}
+
+static __be32
+__nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        struct net *net = SVC_NET(rqstp);
        return rpc_success;
 }
 
+static __be32
+nlmsvc_proc_cancel(struct svc_rqst *rqstp)
+{
+       return __nlmsvc_proc_cancel(rqstp, rqstp->rq_resp);
+}
+
 /*
  * UNLOCK: release a lock
  */
 static __be32
-nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                          struct nlm_res  *resp)
+__nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_file *file;
        struct net *net = SVC_NET(rqstp);
        return rpc_success;
 }
 
+static __be32
+nlmsvc_proc_unlock(struct svc_rqst *rqstp)
+{
+       return __nlmsvc_proc_unlock(rqstp, rqstp->rq_resp);
+}
+
 /*
  * GRANTED: A server calls us to tell that a process' lock request
  * was granted
  */
 static __be32
-nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+__nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_res *resp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        resp->cookie = argp->cookie;
 
        dprintk("lockd: GRANTED       called\n");
        return rpc_success;
 }
 
+static __be32
+nlmsvc_proc_granted(struct svc_rqst *rqstp)
+{
+       return __nlmsvc_proc_granted(rqstp, rqstp->rq_resp);
+}
+
 /*
  * This is the generic lockd callback for async RPC calls
  */
  * because we send the callback before the reply proper. I hope this
  * doesn't break any clients.
  */
-static __be32 nlmsvc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_args *argp,
-               __be32 (*func)(struct svc_rqst *, struct nlm_args *, struct nlm_res  *))
+static __be32 nlmsvc_callback(struct svc_rqst *rqstp, u32 proc,
+               __be32 (*func)(struct svc_rqst *, struct nlm_res *))
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
        struct nlm_rqst *call;
        __be32 stat;
        if (call == NULL)
                return rpc_system_err;
 
-       stat = func(rqstp, argp, &call->a_res);
+       stat = func(rqstp, &call->a_res);
        if (stat != 0) {
                nlmsvc_release_call(call);
                return stat;
        return rpc_success;
 }
 
-static __be32 nlmsvc_proc_test_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+static __be32 nlmsvc_proc_test_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: TEST_MSG      called\n");
-       return nlmsvc_callback(rqstp, NLMPROC_TEST_RES, argp, nlmsvc_proc_test);
+       return nlmsvc_callback(rqstp, NLMPROC_TEST_RES, __nlmsvc_proc_test);
 }
 
-static __be32 nlmsvc_proc_lock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+static __be32 nlmsvc_proc_lock_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: LOCK_MSG      called\n");
-       return nlmsvc_callback(rqstp, NLMPROC_LOCK_RES, argp, nlmsvc_proc_lock);
+       return nlmsvc_callback(rqstp, NLMPROC_LOCK_RES, __nlmsvc_proc_lock);
 }
 
-static __be32 nlmsvc_proc_cancel_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                              void            *resp)
+static __be32 nlmsvc_proc_cancel_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: CANCEL_MSG    called\n");
-       return nlmsvc_callback(rqstp, NLMPROC_CANCEL_RES, argp, nlmsvc_proc_cancel);
+       return nlmsvc_callback(rqstp, NLMPROC_CANCEL_RES, __nlmsvc_proc_cancel);
 }
 
 static __be32
-nlmsvc_proc_unlock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                               void            *resp)
+nlmsvc_proc_unlock_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: UNLOCK_MSG    called\n");
-       return nlmsvc_callback(rqstp, NLMPROC_UNLOCK_RES, argp, nlmsvc_proc_unlock);
+       return nlmsvc_callback(rqstp, NLMPROC_UNLOCK_RES, __nlmsvc_proc_unlock);
 }
 
 static __be32
-nlmsvc_proc_granted_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                                void            *resp)
+nlmsvc_proc_granted_msg(struct svc_rqst *rqstp)
 {
        dprintk("lockd: GRANTED_MSG   called\n");
-       return nlmsvc_callback(rqstp, NLMPROC_GRANTED_RES, argp, nlmsvc_proc_granted);
+       return nlmsvc_callback(rqstp, NLMPROC_GRANTED_RES, __nlmsvc_proc_granted);
 }
 
 /*
  * SHARE: create a DOS share or alter existing share.
  */
 static __be32
-nlmsvc_proc_share(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                         struct nlm_res  *resp)
+nlmsvc_proc_share(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+       struct nlm_res *resp = rqstp->rq_resp;
        struct nlm_host *host;
        struct nlm_file *file;
 
  * UNSHARE: Release a DOS share.
  */
 static __be32
-nlmsvc_proc_unshare(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+nlmsvc_proc_unshare(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+       struct nlm_res *resp = rqstp->rq_resp;
        struct nlm_host *host;
        struct nlm_file *file;
 
  * NM_LOCK: Create an unmonitored lock
  */
 static __be32
-nlmsvc_proc_nm_lock(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                           struct nlm_res  *resp)
+nlmsvc_proc_nm_lock(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        dprintk("lockd: NM_LOCK       called\n");
 
        argp->monitor = 0;              /* just clean the monitor flag */
-       return nlmsvc_proc_lock(rqstp, argp, resp);
+       return nlmsvc_proc_lock(rqstp);
 }
 
 /*
  * FREE_ALL: Release all locks and shares held by client
  */
 static __be32
-nlmsvc_proc_free_all(struct svc_rqst *rqstp, struct nlm_args *argp,
-                                            void            *resp)
+nlmsvc_proc_free_all(struct svc_rqst *rqstp)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_host *host;
 
        /* Obtain client */
  * SM_NOTIFY: private callback from statd (not part of official NLM proto)
  */
 static __be32
-nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
-                                             void              *resp)
+nlmsvc_proc_sm_notify(struct svc_rqst *rqstp)
 {
+       struct nlm_reboot *argp = rqstp->rq_argp;
+
        dprintk("lockd: SM_NOTIFY     called\n");
 
        if (!nlm_privileged_requester(rqstp)) {
  * client sent a GRANTED_RES, let's remove the associated block
  */
 static __be32
-nlmsvc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res  *argp,
-                                                void            *resp)
+nlmsvc_proc_granted_res(struct svc_rqst *rqstp)
 {
+       struct nlm_res *argp = rqstp->rq_argp;
+
        if (!nlmsvc_ops)
                return rpc_success;
 
 struct nlm_void                        { int dummy; };
 
 #define PROC(name, xargt, xrest, argt, rest, respsize) \
- { .pc_func    = (svc_procfunc) nlmsvc_proc_##name,    \
+ { .pc_func    = nlmsvc_proc_##name,                   \
    .pc_decode  = (kxdrproc_t) nlmsvc_decode_##xargt,   \
    .pc_encode  = (kxdrproc_t) nlmsvc_encode_##xrest,   \
    .pc_release = NULL,                                 \
 
 
 static struct callback_op callback_ops[];
 
-static __be32 nfs4_callback_null(struct svc_rqst *rqstp, void *argp, void *resp)
+static __be32 nfs4_callback_null(struct svc_rqst *rqstp)
 {
        return htonl(NFS4_OK);
 }
 /*
  * Decode, process and encode a COMPOUND
  */
-static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *resp)
+static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
 {
        struct cb_compound_hdr_arg hdr_arg = { 0 };
        struct cb_compound_hdr_res hdr_res = { NULL };
 
        while (status == 0 && nops != hdr_arg.nops) {
                status = process_op(nops, rqstp, &xdr_in,
-                                   argp, &xdr_out, resp, &cps);
+                                   rqstp->rq_argp, &xdr_out, rqstp->rq_resp,
+                                   &cps);
                nops++;
        }
 
 
  * NULL call.
  */
 static __be32
-nfsacld_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nfsacld_proc_null(struct svc_rqst *rqstp)
 {
        return nfs_ok;
 }
 /*
  * Get the Access and/or Default ACL of a file.
  */
-static __be32 nfsacld_proc_getacl(struct svc_rqst * rqstp,
-               struct nfsd3_getaclargs *argp, struct nfsd3_getaclres *resp)
+static __be32 nfsacld_proc_getacl(struct svc_rqst *rqstp)
 {
+       struct nfsd3_getaclargs *argp = rqstp->rq_argp;
+       struct nfsd3_getaclres *resp = rqstp->rq_resp;
        struct posix_acl *acl;
        struct inode *inode;
        svc_fh *fh;
 /*
  * Set the Access and/or Default ACL of a file.
  */
-static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,
-               struct nfsd3_setaclargs *argp,
-               struct nfsd_attrstat *resp)
+static __be32 nfsacld_proc_setacl(struct svc_rqst *rqstp)
 {
+       struct nfsd3_setaclargs *argp = rqstp->rq_argp;
+       struct nfsd_attrstat *resp = rqstp->rq_resp;
        struct inode *inode;
        svc_fh *fh;
        __be32 nfserr = 0;
 /*
  * Check file attributes
  */
-static __be32 nfsacld_proc_getattr(struct svc_rqst * rqstp,
-               struct nfsd_fhandle *argp, struct nfsd_attrstat *resp)
+static __be32 nfsacld_proc_getattr(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd_attrstat *resp = rqstp->rq_resp;
        __be32 nfserr;
        dprintk("nfsd: GETATTR  %s\n", SVCFH_fmt(&argp->fh));
 
 /*
  * Check file access
  */
-static __be32 nfsacld_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessargs *argp,
-               struct nfsd3_accessres *resp)
+static __be32 nfsacld_proc_access(struct svc_rqst *rqstp)
 {
+       struct nfsd3_accessargs *argp = rqstp->rq_argp;
+       struct nfsd3_accessres *resp = rqstp->rq_resp;
        __be32 nfserr;
 
        dprintk("nfsd: ACCESS(2acl)   %s 0x%x\n",
 
 #define PROC(name, argt, rest, relt, cache, respsize)                  \
 {                                                                      \
-       .pc_func        = (svc_procfunc) nfsacld_proc_##name,           \
+       .pc_func        = nfsacld_proc_##name,                          \
        .pc_decode      = (kxdrproc_t) nfsaclsvc_decode_##argt##args,   \
        .pc_encode      = (kxdrproc_t) nfsaclsvc_encode_##rest##res,    \
        .pc_release     = (kxdrproc_t) nfsaclsvc_release_##relt,        \
 
  * NULL call.
  */
 static __be32
-nfsd3_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nfsd3_proc_null(struct svc_rqst *rqstp)
 {
        return nfs_ok;
 }
 /*
  * Get the Access and/or Default ACL of a file.
  */
-static __be32 nfsd3_proc_getacl(struct svc_rqst * rqstp,
-               struct nfsd3_getaclargs *argp, struct nfsd3_getaclres *resp)
+static __be32 nfsd3_proc_getacl(struct svc_rqst *rqstp)
 {
+       struct nfsd3_getaclargs *argp = rqstp->rq_argp;
+       struct nfsd3_getaclres *resp = rqstp->rq_resp;
        struct posix_acl *acl;
        struct inode *inode;
        svc_fh *fh;
 /*
  * Set the Access and/or Default ACL of a file.
  */
-static __be32 nfsd3_proc_setacl(struct svc_rqst * rqstp,
-               struct nfsd3_setaclargs *argp,
-               struct nfsd3_attrstat *resp)
+static __be32 nfsd3_proc_setacl(struct svc_rqst *rqstp)
 {
+       struct nfsd3_setaclargs *argp = rqstp->rq_argp;
+       struct nfsd3_attrstat *resp = rqstp->rq_resp;
        struct inode *inode;
        svc_fh *fh;
        __be32 nfserr = 0;
 
 #define PROC(name, argt, rest, relt, cache, respsize)                  \
 {                                                                      \
-       .pc_func        = (svc_procfunc) nfsd3_proc_##name,             \
+       .pc_func        = nfsd3_proc_##name,                            \
        .pc_decode      = (kxdrproc_t) nfs3svc_decode_##argt##args,     \
        .pc_encode      = (kxdrproc_t) nfs3svc_encode_##rest##res,      \
        .pc_release     = (kxdrproc_t) nfs3svc_release_##relt,          \
 
  * NULL call.
  */
 static __be32
-nfsd3_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nfsd3_proc_null(struct svc_rqst *rqstp)
 {
        return nfs_ok;
 }
  * Get a file's attributes
  */
 static __be32
-nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,
-                                          struct nfsd3_attrstat *resp)
+nfsd3_proc_getattr(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd3_attrstat *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: GETATTR(3)  %s\n",
  * Set a file's attributes
  */
 static __be32
-nfsd3_proc_setattr(struct svc_rqst *rqstp, struct nfsd3_sattrargs *argp,
-                                          struct nfsd3_attrstat  *resp)
+nfsd3_proc_setattr(struct svc_rqst *rqstp)
 {
+       struct nfsd3_sattrargs *argp = rqstp->rq_argp;
+       struct nfsd3_attrstat *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: SETATTR(3)  %s\n",
  * Look up a path name component
  */
 static __be32
-nfsd3_proc_lookup(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
-                                         struct nfsd3_diropres  *resp)
+nfsd3_proc_lookup(struct svc_rqst *rqstp)
 {
+       struct nfsd3_diropargs *argp = rqstp->rq_argp;
+       struct nfsd3_diropres  *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: LOOKUP(3)   %s %.*s\n",
  * Check file access
  */
 static __be32
-nfsd3_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessargs *argp,
-                                         struct nfsd3_accessres *resp)
+nfsd3_proc_access(struct svc_rqst *rqstp)
 {
+       struct nfsd3_accessargs *argp = rqstp->rq_argp;
+       struct nfsd3_accessres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: ACCESS(3)   %s 0x%x\n",
  * Read a symlink.
  */
 static __be32
-nfsd3_proc_readlink(struct svc_rqst *rqstp, struct nfsd3_readlinkargs *argp,
-                                          struct nfsd3_readlinkres *resp)
+nfsd3_proc_readlink(struct svc_rqst *rqstp)
 {
+       struct nfsd3_readlinkargs *argp = rqstp->rq_argp;
+       struct nfsd3_readlinkres *resp = rqstp->rq_resp;
        __be32 nfserr;
 
        dprintk("nfsd: READLINK(3) %s\n", SVCFH_fmt(&argp->fh));
  * Read a portion of a file.
  */
 static __be32
-nfsd3_proc_read(struct svc_rqst *rqstp, struct nfsd3_readargs *argp,
-                                       struct nfsd3_readres  *resp)
+nfsd3_proc_read(struct svc_rqst *rqstp)
 {
+       struct nfsd3_readargs *argp = rqstp->rq_argp;
+       struct nfsd3_readres *resp = rqstp->rq_resp;
        __be32  nfserr;
        u32     max_blocksize = svc_max_payload(rqstp);
        unsigned long cnt = min(argp->count, max_blocksize);
  * Write data to a file
  */
 static __be32
-nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
-                                        struct nfsd3_writeres  *resp)
+nfsd3_proc_write(struct svc_rqst *rqstp)
 {
+       struct nfsd3_writeargs *argp = rqstp->rq_argp;
+       struct nfsd3_writeres *resp = rqstp->rq_resp;
        __be32  nfserr;
        unsigned long cnt = argp->len;
 
  * first reports about SunOS compatibility problems start to pour in...
  */
 static __be32
-nfsd3_proc_create(struct svc_rqst *rqstp, struct nfsd3_createargs *argp,
-                                         struct nfsd3_diropres   *resp)
+nfsd3_proc_create(struct svc_rqst *rqstp)
 {
+       struct nfsd3_createargs *argp = rqstp->rq_argp;
+       struct nfsd3_diropres *resp = rqstp->rq_resp;
        svc_fh          *dirfhp, *newfhp = NULL;
        struct iattr    *attr;
        __be32          nfserr;
  * Make directory. This operation is not idempotent.
  */
 static __be32
-nfsd3_proc_mkdir(struct svc_rqst *rqstp, struct nfsd3_createargs *argp,
-                                        struct nfsd3_diropres   *resp)
+nfsd3_proc_mkdir(struct svc_rqst *rqstp)
 {
+       struct nfsd3_createargs *argp = rqstp->rq_argp;
+       struct nfsd3_diropres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: MKDIR(3)    %s %.*s\n",
 }
 
 static __be32
-nfsd3_proc_symlink(struct svc_rqst *rqstp, struct nfsd3_symlinkargs *argp,
-                                          struct nfsd3_diropres    *resp)
+nfsd3_proc_symlink(struct svc_rqst *rqstp)
 {
+       struct nfsd3_symlinkargs *argp = rqstp->rq_argp;
+       struct nfsd3_diropres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: SYMLINK(3)  %s %.*s -> %.*s\n",
  * Make socket/fifo/device.
  */
 static __be32
-nfsd3_proc_mknod(struct svc_rqst *rqstp, struct nfsd3_mknodargs *argp,
-                                        struct nfsd3_diropres  *resp)
+nfsd3_proc_mknod(struct svc_rqst *rqstp)
 {
+       struct nfsd3_mknodargs *argp = rqstp->rq_argp;
+       struct nfsd3_diropres  *resp = rqstp->rq_resp;
        __be32  nfserr;
        int type;
        dev_t   rdev = 0;
  * Remove file/fifo/socket etc.
  */
 static __be32
-nfsd3_proc_remove(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
-                                         struct nfsd3_attrstat  *resp)
+nfsd3_proc_remove(struct svc_rqst *rqstp)
 {
+       struct nfsd3_diropargs *argp = rqstp->rq_argp;
+       struct nfsd3_attrstat *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: REMOVE(3)   %s %.*s\n",
  * Remove a directory
  */
 static __be32
-nfsd3_proc_rmdir(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
-                                        struct nfsd3_attrstat  *resp)
+nfsd3_proc_rmdir(struct svc_rqst *rqstp)
 {
+       struct nfsd3_diropargs *argp = rqstp->rq_argp;
+       struct nfsd3_attrstat *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: RMDIR(3)    %s %.*s\n",
 }
 
 static __be32
-nfsd3_proc_rename(struct svc_rqst *rqstp, struct nfsd3_renameargs *argp,
-                                         struct nfsd3_renameres  *resp)
+nfsd3_proc_rename(struct svc_rqst *rqstp)
 {
+       struct nfsd3_renameargs *argp = rqstp->rq_argp;
+       struct nfsd3_renameres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: RENAME(3)   %s %.*s ->\n",
 }
 
 static __be32
-nfsd3_proc_link(struct svc_rqst *rqstp, struct nfsd3_linkargs *argp,
-                                       struct nfsd3_linkres  *resp)
+nfsd3_proc_link(struct svc_rqst *rqstp)
 {
+       struct nfsd3_linkargs *argp = rqstp->rq_argp;
+       struct nfsd3_linkres  *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: LINK(3)     %s ->\n",
  * Read a portion of a directory.
  */
 static __be32
-nfsd3_proc_readdir(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,
-                                          struct nfsd3_readdirres  *resp)
+nfsd3_proc_readdir(struct svc_rqst *rqstp)
 {
+       struct nfsd3_readdirargs *argp = rqstp->rq_argp;
+       struct nfsd3_readdirres  *resp = rqstp->rq_resp;
        __be32          nfserr;
        int             count;
 
  * For now, we choose to ignore the dircount parameter.
  */
 static __be32
-nfsd3_proc_readdirplus(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,
-                                              struct nfsd3_readdirres  *resp)
+nfsd3_proc_readdirplus(struct svc_rqst *rqstp)
 {
+       struct nfsd3_readdirargs *argp = rqstp->rq_argp;
+       struct nfsd3_readdirres  *resp = rqstp->rq_resp;
        __be32  nfserr;
        int     count = 0;
        loff_t  offset;
  * Get file system stats
  */
 static __be32
-nfsd3_proc_fsstat(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,
-                                          struct nfsd3_fsstatres *resp)
+nfsd3_proc_fsstat(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd3_fsstatres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: FSSTAT(3)   %s\n",
  * Get file system info
  */
 static __be32
-nfsd3_proc_fsinfo(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,
-                                          struct nfsd3_fsinfores *resp)
+nfsd3_proc_fsinfo(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd3_fsinfores *resp = rqstp->rq_resp;
        __be32  nfserr;
        u32     max_blocksize = svc_max_payload(rqstp);
 
  * Get pathconf info for the specified file
  */
 static __be32
-nfsd3_proc_pathconf(struct svc_rqst * rqstp, struct nfsd_fhandle      *argp,
-                                            struct nfsd3_pathconfres *resp)
+nfsd3_proc_pathconf(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd3_pathconfres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: PATHCONF(3) %s\n",
  * Commit a file (range) to stable storage.
  */
 static __be32
-nfsd3_proc_commit(struct svc_rqst * rqstp, struct nfsd3_commitargs *argp,
-                                          struct nfsd3_commitres  *resp)
+nfsd3_proc_commit(struct svc_rqst *rqstp)
 {
+       struct nfsd3_commitargs *argp = rqstp->rq_argp;
+       struct nfsd3_commitres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: COMMIT(3)   %s %u@%Lu\n",
 
 static struct svc_procedure            nfsd_procedures3[22] = {
        [NFS3PROC_NULL] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_null,
+               .pc_func = nfsd3_proc_null,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_voidres,
                .pc_argsize = sizeof(struct nfsd3_voidargs),
                .pc_ressize = sizeof(struct nfsd3_voidres),
                .pc_xdrressize = ST,
        },
        [NFS3PROC_GETATTR] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_getattr,
+               .pc_func = nfsd3_proc_getattr,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_attrstatres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+AT,
        },
        [NFS3PROC_SETATTR] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_setattr,
+               .pc_func = nfsd3_proc_setattr,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_sattrargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+WC,
        },
        [NFS3PROC_LOOKUP] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_lookup,
+               .pc_func = nfsd3_proc_lookup,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_diropres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+FH+pAT+pAT,
        },
        [NFS3PROC_ACCESS] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_access,
+               .pc_func = nfsd3_proc_access,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_accessargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_accessres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+pAT+1,
        },
        [NFS3PROC_READLINK] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_readlink,
+               .pc_func = nfsd3_proc_readlink,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_readlinkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readlinkres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+pAT+1+NFS3_MAXPATHLEN/4,
        },
        [NFS3PROC_READ] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_read,
+               .pc_func = nfsd3_proc_read,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_readargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+pAT+4+NFSSVC_MAXBLKSIZE/4,
        },
        [NFS3PROC_WRITE] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_write,
+               .pc_func = nfsd3_proc_write,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_writeargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_writeres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+WC+4,
        },
        [NFS3PROC_CREATE] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_create,
+               .pc_func = nfsd3_proc_create,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+(1+FH+pAT)+WC,
        },
        [NFS3PROC_MKDIR] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_mkdir,
+               .pc_func = nfsd3_proc_mkdir,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_mkdirargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+(1+FH+pAT)+WC,
        },
        [NFS3PROC_SYMLINK] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_symlink,
+               .pc_func = nfsd3_proc_symlink,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_symlinkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+(1+FH+pAT)+WC,
        },
        [NFS3PROC_MKNOD] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_mknod,
+               .pc_func = nfsd3_proc_mknod,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_mknodargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+(1+FH+pAT)+WC,
        },
        [NFS3PROC_REMOVE] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_remove,
+               .pc_func = nfsd3_proc_remove,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+WC,
        },
        [NFS3PROC_RMDIR] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_rmdir,
+               .pc_func = nfsd3_proc_rmdir,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_xdrressize = ST+WC,
        },
        [NFS3PROC_RENAME] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_rename,
+               .pc_func = nfsd3_proc_rename,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_renameargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_renameres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+WC+WC,
        },
        [NFS3PROC_LINK] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_link,
+               .pc_func = nfsd3_proc_link,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_linkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_linkres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle2,
                .pc_xdrressize = ST+pAT+WC,
        },
        [NFS3PROC_READDIR] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_readdir,
+               .pc_func = nfsd3_proc_readdir,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_readdirargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_cachetype = RC_NOCACHE,
        },
        [NFS3PROC_READDIRPLUS] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_readdirplus,
+               .pc_func = nfsd3_proc_readdirplus,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_readdirplusargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
                .pc_cachetype = RC_NOCACHE,
        },
        [NFS3PROC_FSSTAT] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_fsstat,
+               .pc_func = nfsd3_proc_fsstat,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_fsstatres,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_xdrressize = ST+pAT+2*6+1,
        },
        [NFS3PROC_FSINFO] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_fsinfo,
+               .pc_func = nfsd3_proc_fsinfo,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_fsinfores,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_xdrressize = ST+pAT+12,
        },
        [NFS3PROC_PATHCONF] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_pathconf,
+               .pc_func = nfsd3_proc_pathconf,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_pathconfres,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_xdrressize = ST+pAT+6,
        },
        [NFS3PROC_COMMIT] = {
-               .pc_func = (svc_procfunc) nfsd3_proc_commit,
+               .pc_func = nfsd3_proc_commit,
                .pc_decode = (kxdrproc_t) nfs3svc_decode_commitargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_commitres,
                .pc_release = (kxdrproc_t) nfs3svc_release_fhandle,
 
  * NULL call.
  */
 static __be32
-nfsd4_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nfsd4_proc_null(struct svc_rqst *rqstp)
 {
        return nfs_ok;
 }
 typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *,
                              void *);
 typedef u32(*nfsd4op_rsize)(struct svc_rqst *, struct nfsd4_op *op);
+
 typedef void(*stateid_setter)(struct nfsd4_compound_state *, void *);
 typedef void(*stateid_getter)(struct nfsd4_compound_state *, void *);
 
  * COMPOUND call.
  */
 static __be32
-nfsd4_proc_compound(struct svc_rqst *rqstp, void *arg, void *res)
+nfsd4_proc_compound(struct svc_rqst *rqstp)
 {
-       struct nfsd4_compoundargs *args = arg;
-       struct nfsd4_compoundres *resp = res;
+       struct nfsd4_compoundargs *args = rqstp->rq_argp;
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
        struct nfsd4_op *op;
        struct nfsd4_operation *opdesc;
        struct nfsd4_compound_state *cstate = &resp->cstate;
 
 
 
 static __be32
-nfsd_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
+nfsd_proc_null(struct svc_rqst *rqstp)
 {
        return nfs_ok;
 }
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,
-                                         struct nfsd_attrstat *resp)
+nfsd_proc_getattr(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd_attrstat *resp = rqstp->rq_resp;
        __be32 nfserr;
        dprintk("nfsd: GETATTR  %s\n", SVCFH_fmt(&argp->fh));
 
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp,
-                                         struct nfsd_attrstat  *resp)
+nfsd_proc_setattr(struct svc_rqst *rqstp)
 {
+       struct nfsd_sattrargs *argp = rqstp->rq_argp;
+       struct nfsd_attrstat *resp = rqstp->rq_resp;
        struct iattr *iap = &argp->attrs;
        struct svc_fh *fhp;
        __be32 nfserr;
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_lookup(struct svc_rqst *rqstp, struct nfsd_diropargs *argp,
-                                        struct nfsd_diropres  *resp)
+nfsd_proc_lookup(struct svc_rqst *rqstp)
 {
+       struct nfsd_diropargs *argp = rqstp->rq_argp;
+       struct nfsd_diropres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: LOOKUP   %s %.*s\n",
  * Read a symlink.
  */
 static __be32
-nfsd_proc_readlink(struct svc_rqst *rqstp, struct nfsd_readlinkargs *argp,
-                                          struct nfsd_readlinkres *resp)
+nfsd_proc_readlink(struct svc_rqst *rqstp)
 {
+       struct nfsd_readlinkargs *argp = rqstp->rq_argp;
+       struct nfsd_readlinkres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: READLINK %s\n", SVCFH_fmt(&argp->fh));
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,
-                                      struct nfsd_readres  *resp)
+nfsd_proc_read(struct svc_rqst *rqstp)
 {
+       struct nfsd_readargs *argp = rqstp->rq_argp;
+       struct nfsd_readres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: READ    %s %d bytes at %d\n",
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
-                                       struct nfsd_attrstat  *resp)
+nfsd_proc_write(struct svc_rqst *rqstp)
 {
+       struct nfsd_writeargs *argp = rqstp->rq_argp;
+       struct nfsd_attrstat *resp = rqstp->rq_resp;
        __be32  nfserr;
        unsigned long cnt = argp->len;
 
  * N.B. After this call _both_ argp->fh and resp->fh need an fh_put
  */
 static __be32
-nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp,
-                                        struct nfsd_diropres   *resp)
+nfsd_proc_create(struct svc_rqst *rqstp)
 {
+       struct nfsd_createargs *argp = rqstp->rq_argp;
+       struct nfsd_diropres *resp = rqstp->rq_resp;
        svc_fh          *dirfhp = &argp->fh;
        svc_fh          *newfhp = &resp->fh;
        struct iattr    *attr = &argp->attrs;
 }
 
 static __be32
-nfsd_proc_remove(struct svc_rqst *rqstp, struct nfsd_diropargs *argp,
-                                        void                  *resp)
+nfsd_proc_remove(struct svc_rqst *rqstp)
 {
+       struct nfsd_diropargs *argp = rqstp->rq_argp;
        __be32  nfserr;
 
        dprintk("nfsd: REMOVE   %s %.*s\n", SVCFH_fmt(&argp->fh),
 }
 
 static __be32
-nfsd_proc_rename(struct svc_rqst *rqstp, struct nfsd_renameargs *argp,
-                                        void                   *resp)
+nfsd_proc_rename(struct svc_rqst *rqstp)
 {
+       struct nfsd_renameargs *argp = rqstp->rq_argp;
        __be32  nfserr;
 
        dprintk("nfsd: RENAME   %s %.*s -> \n",
 }
 
 static __be32
-nfsd_proc_link(struct svc_rqst *rqstp, struct nfsd_linkargs *argp,
-                               void                        *resp)
+nfsd_proc_link(struct svc_rqst *rqstp)
 {
+       struct nfsd_linkargs *argp = rqstp->rq_argp;
        __be32  nfserr;
 
        dprintk("nfsd: LINK     %s ->\n",
 }
 
 static __be32
-nfsd_proc_symlink(struct svc_rqst *rqstp, struct nfsd_symlinkargs *argp,
-                                         void                    *resp)
+nfsd_proc_symlink(struct svc_rqst *rqstp)
 {
+       struct nfsd_symlinkargs *argp = rqstp->rq_argp;
        struct svc_fh   newfh;
        __be32          nfserr;
 
  * N.B. After this call resp->fh needs an fh_put
  */
 static __be32
-nfsd_proc_mkdir(struct svc_rqst *rqstp, struct nfsd_createargs *argp,
-                                       struct nfsd_diropres   *resp)
+nfsd_proc_mkdir(struct svc_rqst *rqstp)
 {
+       struct nfsd_createargs *argp = rqstp->rq_argp;
+       struct nfsd_diropres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: MKDIR    %s %.*s\n", SVCFH_fmt(&argp->fh), argp->len, argp->name);
  * Remove a directory
  */
 static __be32
-nfsd_proc_rmdir(struct svc_rqst *rqstp, struct nfsd_diropargs *argp,
-                                       void                  *resp)
+nfsd_proc_rmdir(struct svc_rqst *rqstp)
 {
+       struct nfsd_diropargs *argp = rqstp->rq_argp;
        __be32  nfserr;
 
        dprintk("nfsd: RMDIR    %s %.*s\n", SVCFH_fmt(&argp->fh), argp->len, argp->name);
  * Read a portion of a directory.
  */
 static __be32
-nfsd_proc_readdir(struct svc_rqst *rqstp, struct nfsd_readdirargs *argp,
-                                         struct nfsd_readdirres  *resp)
+nfsd_proc_readdir(struct svc_rqst *rqstp)
 {
+       struct nfsd_readdirargs *argp = rqstp->rq_argp;
+       struct nfsd_readdirres *resp = rqstp->rq_resp;
        int             count;
        __be32          nfserr;
        loff_t          offset;
  * Get file system info
  */
 static __be32
-nfsd_proc_statfs(struct svc_rqst * rqstp, struct nfsd_fhandle   *argp,
-                                         struct nfsd_statfsres *resp)
+nfsd_proc_statfs(struct svc_rqst *rqstp)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+       struct nfsd_statfsres *resp = rqstp->rq_resp;
        __be32  nfserr;
 
        dprintk("nfsd: STATFS   %s\n", SVCFH_fmt(&argp->fh));
 
 static struct svc_procedure            nfsd_procedures2[18] = {
        [NFSPROC_NULL] = {
-               .pc_func = (svc_procfunc) nfsd_proc_null,
+               .pc_func = nfsd_proc_null,
                .pc_decode = (kxdrproc_t) nfssvc_decode_void,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_void),
                .pc_xdrressize = ST,
        },
        [NFSPROC_GETATTR] = {
-               .pc_func = (svc_procfunc) nfsd_proc_getattr,
+               .pc_func = nfsd_proc_getattr,
                .pc_decode = (kxdrproc_t) nfssvc_decode_fhandle,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST+AT,
        },
        [NFSPROC_SETATTR] = {
-               .pc_func = (svc_procfunc) nfsd_proc_setattr,
+               .pc_func = nfsd_proc_setattr,
                .pc_decode = (kxdrproc_t) nfssvc_decode_sattrargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST,
        },
        [NFSPROC_LOOKUP] = {
-               .pc_func = (svc_procfunc) nfsd_proc_lookup,
+               .pc_func = nfsd_proc_lookup,
                .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST+FH+AT,
        },
        [NFSPROC_READLINK] = {
-               .pc_func = (svc_procfunc) nfsd_proc_readlink,
+               .pc_func = nfsd_proc_readlink,
                .pc_decode = (kxdrproc_t) nfssvc_decode_readlinkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readlinkres,
                .pc_argsize = sizeof(struct nfsd_readlinkargs),
                .pc_xdrressize = ST+1+NFS_MAXPATHLEN/4,
        },
        [NFSPROC_READ] = {
-               .pc_func = (svc_procfunc) nfsd_proc_read,
+               .pc_func = nfsd_proc_read,
                .pc_decode = (kxdrproc_t) nfssvc_decode_readargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readres,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST,
        },
        [NFSPROC_WRITE] = {
-               .pc_func = (svc_procfunc) nfsd_proc_write,
+               .pc_func = nfsd_proc_write,
                .pc_decode = (kxdrproc_t) nfssvc_decode_writeargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST+AT,
        },
        [NFSPROC_CREATE] = {
-               .pc_func = (svc_procfunc) nfsd_proc_create,
+               .pc_func = nfsd_proc_create,
                .pc_decode = (kxdrproc_t) nfssvc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST+FH+AT,
        },
        [NFSPROC_REMOVE] = {
-               .pc_func = (svc_procfunc) nfsd_proc_remove,
+               .pc_func = nfsd_proc_remove,
                .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_diropargs),
                .pc_xdrressize = ST,
        },
        [NFSPROC_RENAME] = {
-               .pc_func = (svc_procfunc) nfsd_proc_rename,
+               .pc_func = nfsd_proc_rename,
                .pc_decode = (kxdrproc_t) nfssvc_decode_renameargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_renameargs),
                .pc_xdrressize = ST,
        },
        [NFSPROC_LINK] = {
-               .pc_func = (svc_procfunc) nfsd_proc_link,
+               .pc_func = nfsd_proc_link,
                .pc_decode = (kxdrproc_t) nfssvc_decode_linkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_linkargs),
                .pc_xdrressize = ST,
        },
        [NFSPROC_SYMLINK] = {
-               .pc_func = (svc_procfunc) nfsd_proc_symlink,
+               .pc_func = nfsd_proc_symlink,
                .pc_decode = (kxdrproc_t) nfssvc_decode_symlinkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_symlinkargs),
                .pc_xdrressize = ST,
        },
        [NFSPROC_MKDIR] = {
-               .pc_func = (svc_procfunc) nfsd_proc_mkdir,
+               .pc_func = nfsd_proc_mkdir,
                .pc_decode = (kxdrproc_t) nfssvc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = (kxdrproc_t) nfssvc_release_fhandle,
                .pc_xdrressize = ST+FH+AT,
        },
        [NFSPROC_RMDIR] = {
-               .pc_func = (svc_procfunc) nfsd_proc_rmdir,
+               .pc_func = nfsd_proc_rmdir,
                .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_diropargs),
                .pc_xdrressize = ST,
        },
        [NFSPROC_READDIR] = {
-               .pc_func = (svc_procfunc) nfsd_proc_readdir,
+               .pc_func = nfsd_proc_readdir,
                .pc_decode = (kxdrproc_t) nfssvc_decode_readdirargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readdirres,
                .pc_argsize = sizeof(struct nfsd_readdirargs),
                .pc_cachetype = RC_NOCACHE,
        },
        [NFSPROC_STATFS] = {
-               .pc_func = (svc_procfunc) nfsd_proc_statfs,
+               .pc_func = nfsd_proc_statfs,
                .pc_decode = (kxdrproc_t) nfssvc_decode_fhandle,
                .pc_encode = (kxdrproc_t) nfssvc_encode_statfsres,
                .pc_argsize = sizeof(struct nfsd_fhandle),
 
        rqstp->rq_res.head[0].iov_len += sizeof(__be32);
 
        /* Now call the procedure handler, and encode NFS status. */
-       nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
+       nfserr = proc->pc_func(rqstp);
        nfserr = map_new_errors(rqstp->rq_vers, nfserr);
        if (nfserr == nfserr_dropit || test_bit(RQ_DROPME, &rqstp->rq_flags)) {
                dprintk("nfsd: Dropping request; may be revisited later\n");
 
 /*
  * RPC procedure info
  */
-typedef __be32 (*svc_procfunc)(struct svc_rqst *, void *argp, void *resp);
 struct svc_procedure {
-       svc_procfunc            pc_func;        /* process the request */
+       /* process the request: */
+       __be32                  (*pc_func)(struct svc_rqst *);
        kxdrproc_t              pc_decode;      /* XDR decode args */
        kxdrproc_t              pc_encode;      /* XDR encode result */
        kxdrproc_t              pc_release;     /* XDR free result */
 
                if (xdr && !xdr(rqstp, argv->iov_base, rqstp->rq_argp))
                        goto err_garbage;
 
-               *statp = procp->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
+               *statp = procp->pc_func(rqstp);
 
                /* Encode reply */
                if (*statp == rpc_drop_reply ||