#define PROC(name, xargt, xrest, argt, rest, respsize) \
  { .pc_func    = nlm4svc_proc_##name,  \
-   .pc_decode  = (kxdrproc_t) nlm4svc_decode_##xargt,  \
+   .pc_decode  = nlm4svc_decode_##xargt,       \
    .pc_encode  = (kxdrproc_t) nlm4svc_encode_##xrest,  \
    .pc_release = NULL,                                 \
    .pc_argsize = sizeof(struct nlm_##argt),            \
 
 
 #define PROC(name, xargt, xrest, argt, rest, respsize) \
  { .pc_func    = nlmsvc_proc_##name,                   \
-   .pc_decode  = (kxdrproc_t) nlmsvc_decode_##xargt,   \
+   .pc_decode  = nlmsvc_decode_##xargt,                \
    .pc_encode  = (kxdrproc_t) nlmsvc_encode_##xrest,   \
    .pc_release = NULL,                                 \
    .pc_argsize = sizeof(struct nlm_##argt),            \
 
  * First, the server side XDR functions
  */
 int
-nlmsvc_decode_testargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlmsvc_decode_testargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlmsvc_decode_lockargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlmsvc_decode_lockargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlmsvc_decode_cancargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlmsvc_decode_cancargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlmsvc_decode_unlockargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlmsvc_decode_unlockargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        if (!(p = nlm_decode_cookie(p, &argp->cookie))
         || !(p = nlm_decode_lock(p, &argp->lock)))
                return 0;
 }
 
 int
-nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_lock *lock = &argp->lock;
 
        memset(lock, 0, sizeof(*lock));
 }
 
 int
-nlmsvc_decode_notify(struct svc_rqst *rqstp, __be32 *p, struct nlm_args *argp)
+nlmsvc_decode_notify(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_lock *lock = &argp->lock;
 
        if (!(p = xdr_decode_string_inplace(p, &lock->caller,
 }
 
 int
-nlmsvc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct nlm_reboot *argp)
+nlmsvc_decode_reboot(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_reboot *argp = rqstp->rq_argp;
+
        if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
                return 0;
        argp->state = ntohl(*p++);
 }
 
 int
-nlmsvc_decode_res(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp)
+nlmsvc_decode_res(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_res *resp = rqstp->rq_argp;
+
        if (!(p = nlm_decode_cookie(p, &resp->cookie)))
                return 0;
        resp->status = *p++;
 }
 
 int
-nlmsvc_decode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy)
+nlmsvc_decode_void(struct svc_rqst *rqstp, __be32 *p)
 {
        return xdr_argsize_check(rqstp, p);
 }
 
  * First, the server side XDR functions
  */
 int
-nlm4svc_decode_testargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlm4svc_decode_testargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm4_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlm4svc_decode_lockargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlm4svc_decode_lockargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm4_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlm4svc_decode_cancargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlm4svc_decode_cancargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        u32     exclusive;
 
        if (!(p = nlm4_decode_cookie(p, &argp->cookie)))
 }
 
 int
-nlm4svc_decode_unlockargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlm4svc_decode_unlockargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
+
        if (!(p = nlm4_decode_cookie(p, &argp->cookie))
         || !(p = nlm4_decode_lock(p, &argp->lock)))
                return 0;
 }
 
 int
-nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p, nlm_args *argp)
+nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_lock *lock = &argp->lock;
 
        memset(lock, 0, sizeof(*lock));
 }
 
 int
-nlm4svc_decode_notify(struct svc_rqst *rqstp, __be32 *p, struct nlm_args *argp)
+nlm4svc_decode_notify(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_args *argp = rqstp->rq_argp;
        struct nlm_lock *lock = &argp->lock;
 
        if (!(p = xdr_decode_string_inplace(p, &lock->caller,
 }
 
 int
-nlm4svc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct nlm_reboot *argp)
+nlm4svc_decode_reboot(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_reboot *argp = rqstp->rq_argp;
+
        if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len, SM_MAXSTRLEN)))
                return 0;
        argp->state = ntohl(*p++);
 }
 
 int
-nlm4svc_decode_res(struct svc_rqst *rqstp, __be32 *p, struct nlm_res *resp)
+nlm4svc_decode_res(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nlm_res *resp = rqstp->rq_argp;
+
        if (!(p = nlm4_decode_cookie(p, &resp->cookie)))
                return 0;
        resp->status = *p++;
 }
 
 int
-nlm4svc_decode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy)
+nlm4svc_decode_void(struct svc_rqst *rqstp, __be32 *p)
 {
        return xdr_argsize_check(rqstp, p);
 }
 
        return htonl(NFS4_OK);
 }
 
-static int nfs4_decode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy)
+static int nfs4_decode_void(struct svc_rqst *rqstp, __be32 *p)
 {
        return xdr_argsize_check(rqstp, p);
 }
 static struct svc_procedure nfs4_callback_procedures1[] = {
        [CB_NULL] = {
                .pc_func = nfs4_callback_null,
-               .pc_decode = (kxdrproc_t)nfs4_decode_void,
+               .pc_decode = nfs4_decode_void,
                .pc_encode = (kxdrproc_t)nfs4_encode_void,
                .pc_xdrressize = 1,
        },
 
 /*
  * XDR decode functions
  */
-static int nfsaclsvc_decode_getaclargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd3_getaclargs *argp)
+static int nfsaclsvc_decode_getaclargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_getaclargs *argp = rqstp->rq_argp;
+
        p = nfs2svc_decode_fh(p, &argp->fh);
        if (!p)
                return 0;
 }
 
 
-static int nfsaclsvc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd3_setaclargs *argp)
+static int nfsaclsvc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_setaclargs *argp = rqstp->rq_argp;
        struct kvec *head = rqstp->rq_arg.head;
        unsigned int base;
        int n;
        return (n > 0);
 }
 
-static int nfsaclsvc_decode_fhandleargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd_fhandle *argp)
+static int nfsaclsvc_decode_fhandleargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_fhandle *argp = rqstp->rq_argp;
+
        p = nfs2svc_decode_fh(p, &argp->fh);
        if (!p)
                return 0;
        return xdr_argsize_check(rqstp, p);
 }
 
-static int nfsaclsvc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd3_accessargs *argp)
+static int nfsaclsvc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_accessargs *argp = rqstp->rq_argp;
+
        p = nfs2svc_decode_fh(p, &argp->fh);
        if (!p)
                return 0;
 #define PROC(name, argt, rest, relt, cache, respsize)                  \
 {                                                                      \
        .pc_func        = nfsacld_proc_##name,                          \
-       .pc_decode      = (kxdrproc_t) nfsaclsvc_decode_##argt##args,   \
+       .pc_decode      = nfsaclsvc_decode_##argt##args,                \
        .pc_encode      = (kxdrproc_t) nfsaclsvc_encode_##rest##res,    \
        .pc_release     = nfsaclsvc_release_##relt,     \
        .pc_argsize     = sizeof(struct nfsd3_##argt##args),            \
 
 /*
  * XDR decode functions
  */
-static int nfs3svc_decode_getaclargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd3_getaclargs *args)
+static int nfs3svc_decode_getaclargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_getaclargs *args = rqstp->rq_argp;
+
        p = nfs3svc_decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 
-static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p,
-               struct nfsd3_setaclargs *args)
+static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_setaclargs *args = rqstp->rq_argp;
        struct kvec *head = rqstp->rq_arg.head;
        unsigned int base;
        int n;
 #define PROC(name, argt, rest, relt, cache, respsize)                  \
 {                                                                      \
        .pc_func        = nfsd3_proc_##name,                            \
-       .pc_decode      = (kxdrproc_t) nfs3svc_decode_##argt##args,     \
+       .pc_decode      = nfs3svc_decode_##argt##args,                  \
        .pc_encode      = (kxdrproc_t) nfs3svc_encode_##rest##res,      \
        .pc_release     = nfs3svc_release_##relt,                       \
        .pc_argsize     = sizeof(struct nfsd3_##argt##args),            \
 
        },
        [NFS3PROC_GETATTR] = {
                .pc_func = nfsd3_proc_getattr,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
+               .pc_decode = nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_attrstatres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
        },
        [NFS3PROC_SETATTR] = {
                .pc_func = nfsd3_proc_setattr,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_sattrargs,
+               .pc_decode = nfs3svc_decode_sattrargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_sattrargs),
        },
        [NFS3PROC_LOOKUP] = {
                .pc_func = nfsd3_proc_lookup,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
+               .pc_decode = nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_diropres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_diropargs),
        },
        [NFS3PROC_ACCESS] = {
                .pc_func = nfsd3_proc_access,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_accessargs,
+               .pc_decode = nfs3svc_decode_accessargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_accessres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_accessargs),
        },
        [NFS3PROC_READLINK] = {
                .pc_func = nfsd3_proc_readlink,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_readlinkargs,
+               .pc_decode = nfs3svc_decode_readlinkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readlinkres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_readlinkargs),
        },
        [NFS3PROC_READ] = {
                .pc_func = nfsd3_proc_read,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_readargs,
+               .pc_decode = nfs3svc_decode_readargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_readargs),
        },
        [NFS3PROC_WRITE] = {
                .pc_func = nfsd3_proc_write,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_writeargs,
+               .pc_decode = nfs3svc_decode_writeargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_writeres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_writeargs),
        },
        [NFS3PROC_CREATE] = {
                .pc_func = nfsd3_proc_create,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_createargs,
+               .pc_decode = nfs3svc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_createargs),
        },
        [NFS3PROC_MKDIR] = {
                .pc_func = nfsd3_proc_mkdir,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_mkdirargs,
+               .pc_decode = nfs3svc_decode_mkdirargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_mkdirargs),
        },
        [NFS3PROC_SYMLINK] = {
                .pc_func = nfsd3_proc_symlink,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_symlinkargs,
+               .pc_decode = nfs3svc_decode_symlinkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_symlinkargs),
        },
        [NFS3PROC_MKNOD] = {
                .pc_func = nfsd3_proc_mknod,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_mknodargs,
+               .pc_decode = nfs3svc_decode_mknodargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_createres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_mknodargs),
        },
        [NFS3PROC_REMOVE] = {
                .pc_func = nfsd3_proc_remove,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
+               .pc_decode = nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_diropargs),
        },
        [NFS3PROC_RMDIR] = {
                .pc_func = nfsd3_proc_rmdir,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_diropargs,
+               .pc_decode = nfs3svc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_wccstatres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_diropargs),
        },
        [NFS3PROC_RENAME] = {
                .pc_func = nfsd3_proc_rename,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_renameargs,
+               .pc_decode = nfs3svc_decode_renameargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_renameres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_renameargs),
        },
        [NFS3PROC_LINK] = {
                .pc_func = nfsd3_proc_link,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_linkargs,
+               .pc_decode = nfs3svc_decode_linkargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_linkres,
                .pc_release = nfs3svc_release_fhandle2,
                .pc_argsize = sizeof(struct nfsd3_linkargs),
        },
        [NFS3PROC_READDIR] = {
                .pc_func = nfsd3_proc_readdir,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_readdirargs,
+               .pc_decode = nfs3svc_decode_readdirargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_readdirargs),
        },
        [NFS3PROC_READDIRPLUS] = {
                .pc_func = nfsd3_proc_readdirplus,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_readdirplusargs,
+               .pc_decode = nfs3svc_decode_readdirplusargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_readdirres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_readdirplusargs),
        },
        [NFS3PROC_FSSTAT] = {
                .pc_func = nfsd3_proc_fsstat,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
+               .pc_decode = nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_fsstatres,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_ressize = sizeof(struct nfsd3_fsstatres),
        },
        [NFS3PROC_FSINFO] = {
                .pc_func = nfsd3_proc_fsinfo,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
+               .pc_decode = nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_fsinfores,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_ressize = sizeof(struct nfsd3_fsinfores),
        },
        [NFS3PROC_PATHCONF] = {
                .pc_func = nfsd3_proc_pathconf,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_fhandleargs,
+               .pc_decode = nfs3svc_decode_fhandleargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_pathconfres,
                .pc_argsize = sizeof(struct nfsd3_fhandleargs),
                .pc_ressize = sizeof(struct nfsd3_pathconfres),
        },
        [NFS3PROC_COMMIT] = {
                .pc_func = nfsd3_proc_commit,
-               .pc_decode = (kxdrproc_t) nfs3svc_decode_commitargs,
+               .pc_decode = nfs3svc_decode_commitargs,
                .pc_encode = (kxdrproc_t) nfs3svc_encode_commitres,
                .pc_release = nfs3svc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd3_commitargs),
 
  * XDR decode functions
  */
 int
-nfs3svc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p, struct nfsd_fhandle *args)
+nfs3svc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_fhandle *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_sattrargs *args)
+nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_sattrargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfs3svc_decode_diropargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_diropargs *args)
+nfs3svc_decode_diropargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_diropargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->fh))
         || !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 }
 
 int
-nfs3svc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_accessargs *args)
+nfs3svc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_accessargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_readargs *args)
+nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_readargs *args = rqstp->rq_argp;
        unsigned int len;
        int v;
        u32 max_blocksize = svc_max_payload(rqstp);
 }
 
 int
-nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_writeargs *args)
+nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_writeargs *args = rqstp->rq_argp;
        unsigned int len, v, hdr, dlen;
        u32 max_blocksize = svc_max_payload(rqstp);
        struct kvec *head = rqstp->rq_arg.head;
 }
 
 int
-nfs3svc_decode_createargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_createargs *args)
+nfs3svc_decode_createargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_createargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->fh))
         || !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 
        return xdr_argsize_check(rqstp, p);
 }
+
 int
-nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_createargs *args)
+nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_createargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->fh)) ||
            !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 }
 
 int
-nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_symlinkargs *args)
+nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_symlinkargs *args = rqstp->rq_argp;
        unsigned int len, avail;
        char *old, *new;
        struct kvec *vec;
 }
 
 int
-nfs3svc_decode_mknodargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_mknodargs *args)
+nfs3svc_decode_mknodargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_mknodargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->fh))
         || !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 }
 
 int
-nfs3svc_decode_renameargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_renameargs *args)
+nfs3svc_decode_renameargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_renameargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->ffh))
         || !(p = decode_filename(p, &args->fname, &args->flen))
         || !(p = decode_fh(p, &args->tfh))
 }
 
 int
-nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_readlinkargs *args)
+nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_readlinkargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfs3svc_decode_linkargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_linkargs *args)
+nfs3svc_decode_linkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_linkargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->ffh))
         || !(p = decode_fh(p, &args->tfh))
         || !(p = decode_filename(p, &args->tname, &args->tlen)))
 }
 
 int
-nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_readdirargs *args)
+nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_readdirargs *args = rqstp->rq_argp;
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_readdirargs *args)
+nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_readdirargs *args = rqstp->rq_argp;
        int len;
        u32 max_blocksize = svc_max_payload(rqstp);
 
 }
 
 int
-nfs3svc_decode_commitargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd3_commitargs *args)
+nfs3svc_decode_commitargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd3_commitargs *args = rqstp->rq_argp;
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 
        },
        [NFSPROC4_COMPOUND] = {
                .pc_func = nfsd4_proc_compound,
-               .pc_decode = (kxdrproc_t) nfs4svc_decode_compoundargs,
+               .pc_decode = nfs4svc_decode_compoundargs,
                .pc_encode = (kxdrproc_t) nfs4svc_encode_compoundres,
                .pc_argsize = sizeof(struct nfsd4_compoundargs),
                .pc_ressize = sizeof(struct nfsd4_compoundres),
 
 }
 
 int
-nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compoundargs *args)
+nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd4_compoundargs *args = rqstp->rq_argp;
+
        if (rqstp->rq_arg.head[0].iov_len % 4) {
                /* client is nuts */
                dprintk("%s: compound not properly padded! (peeraddr=%pISc xid=0x%x)",
 
 static struct svc_procedure            nfsd_procedures2[18] = {
        [NFSPROC_NULL] = {
                .pc_func = nfsd_proc_null,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_void,
+               .pc_decode = nfssvc_decode_void,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_void),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_GETATTR] = {
                .pc_func = nfsd_proc_getattr,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_fhandle,
+               .pc_decode = nfssvc_decode_fhandle,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_fhandle),
        },
        [NFSPROC_SETATTR] = {
                .pc_func = nfsd_proc_setattr,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_sattrargs,
+               .pc_decode = nfssvc_decode_sattrargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_sattrargs),
                .pc_xdrressize = ST+AT,
        },
        [NFSPROC_ROOT] = {
-               .pc_decode = (kxdrproc_t) nfssvc_decode_void,
+               .pc_decode = nfssvc_decode_void,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_void),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_LOOKUP] = {
                .pc_func = nfsd_proc_lookup,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
+               .pc_decode = nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_diropargs),
        },
        [NFSPROC_READLINK] = {
                .pc_func = nfsd_proc_readlink,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_readlinkargs,
+               .pc_decode = nfssvc_decode_readlinkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readlinkres,
                .pc_argsize = sizeof(struct nfsd_readlinkargs),
                .pc_ressize = sizeof(struct nfsd_readlinkres),
        },
        [NFSPROC_READ] = {
                .pc_func = nfsd_proc_read,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_readargs,
+               .pc_decode = nfssvc_decode_readargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readres,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_readargs),
                .pc_xdrressize = ST+AT+1+NFSSVC_MAXBLKSIZE_V2/4,
        },
        [NFSPROC_WRITECACHE] = {
-               .pc_decode = (kxdrproc_t) nfssvc_decode_void,
+               .pc_decode = nfssvc_decode_void,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_void),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_WRITE] = {
                .pc_func = nfsd_proc_write,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_writeargs,
+               .pc_decode = nfssvc_decode_writeargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_attrstat,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_writeargs),
        },
        [NFSPROC_CREATE] = {
                .pc_func = nfsd_proc_create,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_createargs,
+               .pc_decode = nfssvc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_createargs),
        },
        [NFSPROC_REMOVE] = {
                .pc_func = nfsd_proc_remove,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
+               .pc_decode = nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_diropargs),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_RENAME] = {
                .pc_func = nfsd_proc_rename,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_renameargs,
+               .pc_decode = nfssvc_decode_renameargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_renameargs),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_LINK] = {
                .pc_func = nfsd_proc_link,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_linkargs,
+               .pc_decode = nfssvc_decode_linkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_linkargs),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_SYMLINK] = {
                .pc_func = nfsd_proc_symlink,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_symlinkargs,
+               .pc_decode = nfssvc_decode_symlinkargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_symlinkargs),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_MKDIR] = {
                .pc_func = nfsd_proc_mkdir,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_createargs,
+               .pc_decode = nfssvc_decode_createargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_diropres,
                .pc_release = nfssvc_release_fhandle,
                .pc_argsize = sizeof(struct nfsd_createargs),
        },
        [NFSPROC_RMDIR] = {
                .pc_func = nfsd_proc_rmdir,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_diropargs,
+               .pc_decode = nfssvc_decode_diropargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_void,
                .pc_argsize = sizeof(struct nfsd_diropargs),
                .pc_ressize = sizeof(struct nfsd_void),
        },
        [NFSPROC_READDIR] = {
                .pc_func = nfsd_proc_readdir,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_readdirargs,
+               .pc_decode = nfssvc_decode_readdirargs,
                .pc_encode = (kxdrproc_t) nfssvc_encode_readdirres,
                .pc_argsize = sizeof(struct nfsd_readdirargs),
                .pc_ressize = sizeof(struct nfsd_readdirres),
        },
        [NFSPROC_STATFS] = {
                .pc_func = nfsd_proc_statfs,
-               .pc_decode = (kxdrproc_t) nfssvc_decode_fhandle,
+               .pc_decode = nfssvc_decode_fhandle,
                .pc_encode = (kxdrproc_t) nfssvc_encode_statfsres,
                .pc_argsize = sizeof(struct nfsd_fhandle),
                .pc_ressize = sizeof(struct nfsd_statfsres),
 
         */
        rqstp->rq_cachetype = proc->pc_cachetype;
        /* Decode arguments */
-       xdr = proc->pc_decode;
-       if (xdr && !xdr(rqstp, (__be32*)rqstp->rq_arg.head[0].iov_base,
-                       rqstp->rq_argp)) {
+       if (proc->pc_decode &&
+           !proc->pc_decode(rqstp, (__be32*)rqstp->rq_arg.head[0].iov_base)) {
                dprintk("nfsd: failed to decode arguments!\n");
                *statp = rpc_garbage_args;
                return 1;
 
  * XDR decode functions
  */
 int
-nfssvc_decode_void(struct svc_rqst *rqstp, __be32 *p, void *dummy)
+nfssvc_decode_void(struct svc_rqst *rqstp, __be32 *p)
 {
        return xdr_argsize_check(rqstp, p);
 }
 
 int
-nfssvc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p, struct nfsd_fhandle *args)
+nfssvc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_fhandle *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfssvc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_sattrargs *args)
+nfssvc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_sattrargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfssvc_decode_diropargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_diropargs *args)
+nfssvc_decode_diropargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_diropargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->fh))
         || !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 }
 
 int
-nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_readargs *args)
+nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_readargs *args = rqstp->rq_argp;
        unsigned int len;
        int v;
        p = decode_fh(p, &args->fh);
 }
 
 int
-nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_writeargs *args)
+nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_writeargs *args = rqstp->rq_argp;
        unsigned int len, hdr, dlen;
        struct kvec *head = rqstp->rq_arg.head;
        int v;
 }
 
 int
-nfssvc_decode_createargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_createargs *args)
+nfssvc_decode_createargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_createargs *args = rqstp->rq_argp;
+
        if (   !(p = decode_fh(p, &args->fh))
            || !(p = decode_filename(p, &args->name, &args->len)))
                return 0;
 }
 
 int
-nfssvc_decode_renameargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_renameargs *args)
+nfssvc_decode_renameargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_renameargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->ffh))
         || !(p = decode_filename(p, &args->fname, &args->flen))
         || !(p = decode_fh(p, &args->tfh))
 }
 
 int
-nfssvc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd_readlinkargs *args)
+nfssvc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_readlinkargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 }
 
 int
-nfssvc_decode_linkargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_linkargs *args)
+nfssvc_decode_linkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_linkargs *args = rqstp->rq_argp;
+
        if (!(p = decode_fh(p, &args->ffh))
         || !(p = decode_fh(p, &args->tfh))
         || !(p = decode_filename(p, &args->tname, &args->tlen)))
 }
 
 int
-nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_symlinkargs *args)
+nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_symlinkargs *args = rqstp->rq_argp;
+
        if (   !(p = decode_fh(p, &args->ffh))
            || !(p = decode_filename(p, &args->fname, &args->flen))
            || !(p = decode_pathname(p, &args->tname, &args->tlen)))
 }
 
 int
-nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
-                                       struct nfsd_readdirargs *args)
+nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct nfsd_readdirargs *args = rqstp->rq_argp;
+
        p = decode_fh(p, &args->fh);
        if (!p)
                return 0;
 
 #define NFS2_SVC_XDRSIZE       sizeof(union nfsd_xdrstore)
 
 
-int nfssvc_decode_void(struct svc_rqst *, __be32 *, void *);
-int nfssvc_decode_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);
-int nfssvc_decode_sattrargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_sattrargs *);
-int nfssvc_decode_diropargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_diropargs *);
-int nfssvc_decode_readargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_readargs *);
-int nfssvc_decode_writeargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_writeargs *);
-int nfssvc_decode_createargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_createargs *);
-int nfssvc_decode_renameargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_renameargs *);
-int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_readlinkargs *);
-int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_linkargs *);
-int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_symlinkargs *);
-int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *,
-                               struct nfsd_readdirargs *);
+int nfssvc_decode_void(struct svc_rqst *, __be32 *);
+int nfssvc_decode_fhandle(struct svc_rqst *, __be32 *);
+int nfssvc_decode_sattrargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_diropargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_readargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_writeargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_createargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_renameargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *);
+int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *);
 int nfssvc_encode_void(struct svc_rqst *, __be32 *, void *);
 int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *, struct nfsd_attrstat *);
 int nfssvc_encode_diropres(struct svc_rqst *, __be32 *, struct nfsd_diropres *);
 
 
 #define NFS3_SVC_XDRSIZE               sizeof(union nfsd3_xdrstore)
 
-int nfs3svc_decode_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);
-int nfs3svc_decode_sattrargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_sattrargs *);
-int nfs3svc_decode_diropargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_diropargs *);
-int nfs3svc_decode_accessargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_accessargs *);
-int nfs3svc_decode_readargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_readargs *);
-int nfs3svc_decode_writeargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_writeargs *);
-int nfs3svc_decode_createargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_createargs *);
-int nfs3svc_decode_mkdirargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_createargs *);
-int nfs3svc_decode_mknodargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_mknodargs *);
-int nfs3svc_decode_renameargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_renameargs *);
-int nfs3svc_decode_readlinkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_readlinkargs *);
-int nfs3svc_decode_linkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_linkargs *);
-int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_symlinkargs *);
-int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_readdirargs *);
-int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_readdirargs *);
-int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *,
-                               struct nfsd3_commitargs *);
+int nfs3svc_decode_fhandle(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_sattrargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_diropargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_accessargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_readargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_writeargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_createargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_mkdirargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_mknodargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_renameargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_readlinkargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_linkargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *);
+int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *);
 int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *, void *);
 int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *,
                                struct nfsd3_attrstat *);
 
 
 bool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp);
 int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *, void *);
-int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *,
-               struct nfsd4_compoundargs *);
+int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *);
 int nfs4svc_encode_compoundres(struct svc_rqst *, __be32 *,
                struct nfsd4_compoundres *);
 __be32 nfsd4_check_resp_size(struct nfsd4_compoundres *, u32);
 
  */
 #define NLMSVC_XDRSIZE         sizeof(struct nlm_args)
 
-int    nlmsvc_decode_testargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlmsvc_decode_testargs(struct svc_rqst *, __be32 *);
 int    nlmsvc_encode_testres(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlmsvc_decode_lockargs(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlmsvc_decode_cancargs(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlmsvc_decode_unlockargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlmsvc_decode_lockargs(struct svc_rqst *, __be32 *);
+int    nlmsvc_decode_cancargs(struct svc_rqst *, __be32 *);
+int    nlmsvc_decode_unlockargs(struct svc_rqst *, __be32 *);
 int    nlmsvc_encode_res(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlmsvc_decode_res(struct svc_rqst *, __be32 *, struct nlm_res *);
+int    nlmsvc_decode_res(struct svc_rqst *, __be32 *);
 int    nlmsvc_encode_void(struct svc_rqst *, __be32 *, void *);
-int    nlmsvc_decode_void(struct svc_rqst *, __be32 *, void *);
-int    nlmsvc_decode_shareargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlmsvc_decode_void(struct svc_rqst *, __be32 *);
+int    nlmsvc_decode_shareargs(struct svc_rqst *, __be32 *);
 int    nlmsvc_encode_shareres(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlmsvc_decode_notify(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlmsvc_decode_reboot(struct svc_rqst *, __be32 *, struct nlm_reboot *);
+int    nlmsvc_decode_notify(struct svc_rqst *, __be32 *);
+int    nlmsvc_decode_reboot(struct svc_rqst *, __be32 *);
 /*
 int    nlmclt_encode_testargs(struct rpc_rqst *, u32 *, struct nlm_args *);
 int    nlmclt_encode_lockargs(struct rpc_rqst *, u32 *, struct nlm_args *);
 
 
 
 
-int    nlm4svc_decode_testargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlm4svc_decode_testargs(struct svc_rqst *, __be32 *);
 int    nlm4svc_encode_testres(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlm4svc_decode_lockargs(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlm4svc_decode_cancargs(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlm4svc_decode_unlockargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlm4svc_decode_lockargs(struct svc_rqst *, __be32 *);
+int    nlm4svc_decode_cancargs(struct svc_rqst *, __be32 *);
+int    nlm4svc_decode_unlockargs(struct svc_rqst *, __be32 *);
 int    nlm4svc_encode_res(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlm4svc_decode_res(struct svc_rqst *, __be32 *, struct nlm_res *);
+int    nlm4svc_decode_res(struct svc_rqst *, __be32 *);
 int    nlm4svc_encode_void(struct svc_rqst *, __be32 *, void *);
-int    nlm4svc_decode_void(struct svc_rqst *, __be32 *, void *);
-int    nlm4svc_decode_shareargs(struct svc_rqst *, __be32 *, struct nlm_args *);
+int    nlm4svc_decode_void(struct svc_rqst *, __be32 *);
+int    nlm4svc_decode_shareargs(struct svc_rqst *, __be32 *);
 int    nlm4svc_encode_shareres(struct svc_rqst *, __be32 *, struct nlm_res *);
-int    nlm4svc_decode_notify(struct svc_rqst *, __be32 *, struct nlm_args *);
-int    nlm4svc_decode_reboot(struct svc_rqst *, __be32 *, struct nlm_reboot *);
+int    nlm4svc_decode_notify(struct svc_rqst *, __be32 *);
+int    nlm4svc_decode_reboot(struct svc_rqst *, __be32 *);
 /*
 int    nlmclt_encode_testargs(struct rpc_rqst *, u32 *, struct nlm_args *);
 int    nlmclt_encode_lockargs(struct rpc_rqst *, u32 *, struct nlm_args *);
 
 struct svc_procedure {
        /* process the request: */
        __be32                  (*pc_func)(struct svc_rqst *);
-       kxdrproc_t              pc_decode;      /* XDR decode args */
+       /* XDR decode args: */
+       int                     (*pc_decode)(struct svc_rqst *, __be32 *data);
        kxdrproc_t              pc_encode;      /* XDR encode result */
        /* XDR free result: */
        void                    (*pc_release)(struct svc_rqst *);
 
 
        /* Call the function that processes the request. */
        if (!versp->vs_dispatch) {
-               /* Decode arguments */
-               xdr = procp->pc_decode;
-               if (xdr && !xdr(rqstp, argv->iov_base, rqstp->rq_argp))
+               /*
+                * Decode arguments
+                * XXX: why do we ignore the return value?
+                */
+               if (procp->pc_decode &&
+                   !procp->pc_decode(rqstp, argv->iov_base))
                        goto err_garbage;
 
                *statp = procp->pc_func(rqstp);