]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/nfs/nfs4xdr.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / fs / nfs / nfs4xdr.c
index 9f1826b012e63bb2bf11486e1a2a8ba0dd58ff9b..94d50e86a12408faecd30033ea8a035d7659d37e 100644 (file)
@@ -71,8 +71,8 @@ static int nfs4_stat_to_errno(int);
 /* lock,open owner id:
  * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT  >> 2)
  */
-#define open_owner_id_maxsz    (1 + 4)
-#define lock_owner_id_maxsz    (1 + 4)
+#define open_owner_id_maxsz    (1 + 1 + 4)
+#define lock_owner_id_maxsz    (1 + 1 + 4)
 #define decode_lockowner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ))
 #define compound_encode_hdr_maxsz      (3 + (NFS4_MAXTAGLEN >> 2))
 #define compound_decode_hdr_maxsz      (3 + (NFS4_MAXTAGLEN >> 2))
@@ -1088,10 +1088,11 @@ static void encode_lockowner(struct xdr_stream *xdr, const struct nfs_lowner *lo
 {
        __be32 *p;
 
-       p = reserve_space(xdr, 28);
+       p = reserve_space(xdr, 32);
        p = xdr_encode_hyper(p, lowner->clientid);
-       *p++ = cpu_to_be32(16);
+       *p++ = cpu_to_be32(20);
        p = xdr_encode_opaque_fixed(p, "lock id:", 8);
+       *p++ = cpu_to_be32(lowner->s_dev);
        xdr_encode_hyper(p, lowner->id);
 }
 
@@ -1210,10 +1211,11 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena
        *p++ = cpu_to_be32(OP_OPEN);
        *p = cpu_to_be32(arg->seqid->sequence->counter);
        encode_share_access(xdr, arg->fmode);
-       p = reserve_space(xdr, 28);
+       p = reserve_space(xdr, 32);
        p = xdr_encode_hyper(p, arg->clientid);
-       *p++ = cpu_to_be32(16);
+       *p++ = cpu_to_be32(20);
        p = xdr_encode_opaque_fixed(p, "open id:", 8);
+       *p++ = cpu_to_be32(arg->server->s_dev);
        xdr_encode_hyper(p, arg->id);
 }
 
@@ -1510,7 +1512,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr)
        hdr->replen += decode_restorefh_maxsz;
 }
 
-static int
+static void
 encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compound_hdr *hdr)
 {
        __be32 *p;
@@ -1521,14 +1523,12 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun
        p = reserve_space(xdr, 2*4);
        *p++ = cpu_to_be32(1);
        *p = cpu_to_be32(FATTR4_WORD0_ACL);
-       if (arg->acl_len % 4)
-               return -EINVAL;
+       BUG_ON(arg->acl_len % 4);
        p = reserve_space(xdr, 4);
        *p = cpu_to_be32(arg->acl_len);
        xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len);
        hdr->nops++;
        hdr->replen += decode_setacl_maxsz;
-       return 0;
 }
 
 static void
@@ -1660,7 +1660,7 @@ static void encode_create_session(struct xdr_stream *xdr,
 
        p = reserve_space(xdr, 20 + 2*28 + 20 + len + 12);
        *p++ = cpu_to_be32(OP_CREATE_SESSION);
-       p = xdr_encode_hyper(p, clp->cl_ex_clid);
+       p = xdr_encode_hyper(p, clp->cl_clientid);
        *p++ = cpu_to_be32(clp->cl_seqid);                      /*Sequence id */
        *p++ = cpu_to_be32(args->flags);                        /*flags */
 
@@ -1789,7 +1789,6 @@ encode_layoutget(struct xdr_stream *xdr,
                      const struct nfs4_layoutget_args *args,
                      struct compound_hdr *hdr)
 {
-       nfs4_stateid stateid;
        __be32 *p;
 
        p = reserve_space(xdr, 44 + NFS4_STATEID_SIZE);
@@ -1800,9 +1799,7 @@ encode_layoutget(struct xdr_stream *xdr,
        p = xdr_encode_hyper(p, args->range.offset);
        p = xdr_encode_hyper(p, args->range.length);
        p = xdr_encode_hyper(p, args->minlength);
-       pnfs_get_layout_stateid(&stateid, NFS_I(args->inode)->layout,
-                               args->ctx->state);
-       p = xdr_encode_opaque_fixed(p, &stateid.data, NFS4_STATEID_SIZE);
+       p = xdr_encode_opaque_fixed(p, &args->stateid.data, NFS4_STATEID_SIZE);
        *p = cpu_to_be32(args->maxcount);
 
        dprintk("%s: 1st type:0x%x iomode:%d off:%lu len:%lu mc:%d\n",
@@ -1833,393 +1830,362 @@ static u32 nfs4_xdr_minorversion(const struct nfs4_sequence_args *args)
 /*
  * Encode an ACCESS request
  */
-static int nfs4_xdr_enc_access(struct rpc_rqst *req, __be32 *p, const struct nfs4_accessargs *args)
+static void nfs4_xdr_enc_access(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs4_accessargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_access(&xdr, args->access, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_access(xdr, args->access, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode LOOKUP request
  */
-static int nfs4_xdr_enc_lookup(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_arg *args)
+static void nfs4_xdr_enc_lookup(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs4_lookup_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->dir_fh, &hdr);
-       encode_lookup(&xdr, args->name, &hdr);
-       encode_getfh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->dir_fh, &hdr);
+       encode_lookup(xdr, args->name, &hdr);
+       encode_getfh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode LOOKUP_ROOT request
  */
-static int nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_root_arg *args)
+static void nfs4_xdr_enc_lookup_root(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    const struct nfs4_lookup_root_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putrootfh(&xdr, &hdr);
-       encode_getfh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putrootfh(xdr, &hdr);
+       encode_getfh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode REMOVE request
  */
-static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs *args)
+static void nfs4_xdr_enc_remove(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs_removeargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_remove(&xdr, &args->name, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_remove(xdr, &args->name, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode RENAME request
  */
-static int nfs4_xdr_enc_rename(struct rpc_rqst *req, __be32 *p, const struct nfs_renameargs *args)
+static void nfs4_xdr_enc_rename(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs_renameargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->old_dir, &hdr);
-       encode_savefh(&xdr, &hdr);
-       encode_putfh(&xdr, args->new_dir, &hdr);
-       encode_rename(&xdr, args->old_name, args->new_name, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
-       encode_restorefh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->old_dir, &hdr);
+       encode_savefh(xdr, &hdr);
+       encode_putfh(xdr, args->new_dir, &hdr);
+       encode_rename(xdr, args->old_name, args->new_name, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
+       encode_restorefh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode LINK request
  */
-static int nfs4_xdr_enc_link(struct rpc_rqst *req, __be32 *p, const struct nfs4_link_arg *args)
+static void nfs4_xdr_enc_link(struct rpc_rqst *req, struct xdr_stream *xdr,
+                            const struct nfs4_link_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_savefh(&xdr, &hdr);
-       encode_putfh(&xdr, args->dir_fh, &hdr);
-       encode_link(&xdr, args->name, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
-       encode_restorefh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_savefh(xdr, &hdr);
+       encode_putfh(xdr, args->dir_fh, &hdr);
+       encode_link(xdr, args->name, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
+       encode_restorefh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode CREATE request
  */
-static int nfs4_xdr_enc_create(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args)
+static void nfs4_xdr_enc_create(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs4_create_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->dir_fh, &hdr);
-       encode_savefh(&xdr, &hdr);
-       encode_create(&xdr, args, &hdr);
-       encode_getfh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
-       encode_restorefh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->dir_fh, &hdr);
+       encode_savefh(xdr, &hdr);
+       encode_create(xdr, args, &hdr);
+       encode_getfh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
+       encode_restorefh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode SYMLINK request
  */
-static int nfs4_xdr_enc_symlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args)
+static void nfs4_xdr_enc_symlink(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                const struct nfs4_create_arg *args)
 {
-       return nfs4_xdr_enc_create(req, p, args);
+       nfs4_xdr_enc_create(req, xdr, args);
 }
 
 /*
  * Encode GETATTR request
  */
-static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, __be32 *p, const struct nfs4_getattr_arg *args)
+static void nfs4_xdr_enc_getattr(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                const struct nfs4_getattr_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a CLOSE request
  */
-static int nfs4_xdr_enc_close(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args)
+static void nfs4_xdr_enc_close(struct rpc_rqst *req, struct xdr_stream *xdr,
+                              struct nfs_closeargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_close(&xdr, args, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_close(xdr, args, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode an OPEN request
  */
-static int nfs4_xdr_enc_open(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args)
+static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr,
+                             struct nfs_openargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_savefh(&xdr, &hdr);
-       encode_open(&xdr, args, &hdr);
-       encode_getfh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
-       encode_restorefh(&xdr, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_savefh(xdr, &hdr);
+       encode_open(xdr, args, &hdr);
+       encode_getfh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
+       encode_restorefh(xdr, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode an OPEN_CONFIRM request
  */
-static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_open_confirmargs *args)
+static void nfs4_xdr_enc_open_confirm(struct rpc_rqst *req,
+                                     struct xdr_stream *xdr,
+                                     struct nfs_open_confirmargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .nops   = 0,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_open_confirm(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_open_confirm(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode an OPEN request with no attributes.
  */
-static int nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args)
+static void nfs4_xdr_enc_open_noattr(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    struct nfs_openargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_open(&xdr, args, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_open(xdr, args, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode an OPEN_DOWNGRADE request
  */
-static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args)
+static void nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req,
+                                       struct xdr_stream *xdr,
+                                       struct nfs_closeargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_open_downgrade(&xdr, args, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_open_downgrade(xdr, args, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a LOCK request
  */
-static int nfs4_xdr_enc_lock(struct rpc_rqst *req, __be32 *p, struct nfs_lock_args *args)
+static void nfs4_xdr_enc_lock(struct rpc_rqst *req, struct xdr_stream *xdr,
+                             struct nfs_lock_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_lock(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_lock(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a LOCKT request
  */
-static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, __be32 *p, struct nfs_lockt_args *args)
+static void nfs4_xdr_enc_lockt(struct rpc_rqst *req, struct xdr_stream *xdr,
+                              struct nfs_lockt_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_lockt(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_lockt(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a LOCKU request
  */
-static int nfs4_xdr_enc_locku(struct rpc_rqst *req, __be32 *p, struct nfs_locku_args *args)
+static void nfs4_xdr_enc_locku(struct rpc_rqst *req, struct xdr_stream *xdr,
+                              struct nfs_locku_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_locku(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_locku(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
-static int nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req, __be32 *p, struct nfs_release_lockowner_args *args)
+static void nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req,
+                                          struct xdr_stream *xdr,
+                                       struct nfs_release_lockowner_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = 0,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_release_lockowner(&xdr, &args->lock_owner, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_release_lockowner(xdr, &args->lock_owner, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a READLINK request
  */
-static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_readlink *args)
+static void nfs4_xdr_enc_readlink(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                 const struct nfs4_readlink *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_readlink(&xdr, args, req, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_readlink(xdr, args, req, &hdr);
 
        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages,
                        args->pgbase, args->pglen);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a READDIR request
  */
-static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nfs4_readdir_arg *args)
+static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                const struct nfs4_readdir_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_readdir(&xdr, args, req, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_readdir(xdr, args, req, &hdr);
 
        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages,
                         args->pgbase, args->count);
@@ -2227,428 +2193,387 @@ static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nf
                        __func__, hdr.replen << 2, args->pages,
                        args->pgbase, args->count);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a READ request
  */
-static int nfs4_xdr_enc_read(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args)
+static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr,
+                             struct nfs_readargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_read(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_read(xdr, args, &hdr);
 
        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2,
                         args->pages, args->pgbase, args->count);
        req->rq_rcv_buf.flags |= XDRBUF_READ;
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode an SETATTR request
  */
-static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, __be32 *p, struct nfs_setattrargs *args)
+static void nfs4_xdr_enc_setattr(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                struct nfs_setattrargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_setattr(&xdr, args, args->server, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_setattr(xdr, args, args->server, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a GETACL request
  */
-static int
-nfs4_xdr_enc_getacl(struct rpc_rqst *req, __be32 *p,
-               struct nfs_getaclargs *args)
+static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               struct nfs_getaclargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
        uint32_t replen;
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
        replen = hdr.replen + op_decode_hdr_maxsz + nfs4_fattr_bitmap_maxsz + 1;
-       encode_getattr_two(&xdr, FATTR4_WORD0_ACL, 0, &hdr);
+       encode_getattr_two(xdr, FATTR4_WORD0_ACL, 0, &hdr);
 
        xdr_inline_pages(&req->rq_rcv_buf, replen << 2,
                args->acl_pages, args->acl_pgbase, args->acl_len);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode a WRITE request
  */
-static int nfs4_xdr_enc_write(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args)
+static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr,
+                              struct nfs_writeargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_write(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_write(xdr, args, &hdr);
        req->rq_snd_buf.flags |= XDRBUF_WRITE;
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  *  a COMMIT request
  */
-static int nfs4_xdr_enc_commit(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args)
+static void nfs4_xdr_enc_commit(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               struct nfs_writeargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_commit(&xdr, args, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_commit(xdr, args, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * FSINFO request
  */
-static int nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, __be32 *p, struct nfs4_fsinfo_arg *args)
+static void nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               struct nfs4_fsinfo_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_fsinfo(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_fsinfo(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a PATHCONF request
  */
-static int nfs4_xdr_enc_pathconf(struct rpc_rqst *req, __be32 *p, const struct nfs4_pathconf_arg *args)
+static void nfs4_xdr_enc_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                 const struct nfs4_pathconf_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_getattr_one(&xdr, args->bitmask[0] & nfs4_pathconf_bitmap[0],
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_getattr_one(xdr, args->bitmask[0] & nfs4_pathconf_bitmap[0],
                           &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a STATFS request
  */
-static int nfs4_xdr_enc_statfs(struct rpc_rqst *req, __be32 *p, const struct nfs4_statfs_arg *args)
+static void nfs4_xdr_enc_statfs(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               const struct nfs4_statfs_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       encode_getattr_two(&xdr, args->bitmask[0] & nfs4_statfs_bitmap[0],
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_getattr_two(xdr, args->bitmask[0] & nfs4_statfs_bitmap[0],
                           args->bitmask[1] & nfs4_statfs_bitmap[1], &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * GETATTR_BITMAP request
  */
-static int nfs4_xdr_enc_server_caps(struct rpc_rqst *req, __be32 *p,
-                                   struct nfs4_server_caps_arg *args)
+static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    struct nfs4_server_caps_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fhandle, &hdr);
-       encode_getattr_one(&xdr, FATTR4_WORD0_SUPPORTED_ATTRS|
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fhandle, &hdr);
+       encode_getattr_one(xdr, FATTR4_WORD0_SUPPORTED_ATTRS|
                           FATTR4_WORD0_LINK_SUPPORT|
                           FATTR4_WORD0_SYMLINK_SUPPORT|
                           FATTR4_WORD0_ACLSUPPORT, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a RENEW request
  */
-static int nfs4_xdr_enc_renew(struct rpc_rqst *req, __be32 *p, struct nfs_client *clp)
+static void nfs4_xdr_enc_renew(struct rpc_rqst *req, struct xdr_stream *xdr,
+                              struct nfs_client *clp)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .nops   = 0,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_renew(&xdr, clp, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_renew(xdr, clp, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a SETCLIENTID request
  */
-static int nfs4_xdr_enc_setclientid(struct rpc_rqst *req, __be32 *p, struct nfs4_setclientid *sc)
+static void nfs4_xdr_enc_setclientid(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    struct nfs4_setclientid *sc)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .nops   = 0,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_setclientid(&xdr, sc, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_setclientid(xdr, sc, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a SETCLIENTID_CONFIRM request
  */
-static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs4_setclientid_res *arg)
+static void nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req,
+                                            struct xdr_stream *xdr,
+                                            struct nfs4_setclientid_res *arg)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .nops   = 0,
        };
        const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_setclientid_confirm(&xdr, arg, &hdr);
-       encode_putrootfh(&xdr, &hdr);
-       encode_fsinfo(&xdr, lease_bitmap, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_setclientid_confirm(xdr, arg, &hdr);
+       encode_putrootfh(xdr, &hdr);
+       encode_fsinfo(xdr, lease_bitmap, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * DELEGRETURN request
  */
-static int nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, __be32 *p, const struct nfs4_delegreturnargs *args)
+static void nfs4_xdr_enc_delegreturn(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    const struct nfs4_delegreturnargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fhandle, &hdr);
-       encode_delegreturn(&xdr, args->stateid, &hdr);
-       encode_getfattr(&xdr, args->bitmask, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fhandle, &hdr);
+       encode_delegreturn(xdr, args->stateid, &hdr);
+       encode_getfattr(xdr, args->bitmask, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode FS_LOCATIONS request
  */
-static int nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, __be32 *p, struct nfs4_fs_locations_arg *args)
+static void nfs4_xdr_enc_fs_locations(struct rpc_rqst *req,
+                                     struct xdr_stream *xdr,
+                                     struct nfs4_fs_locations_arg *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
        uint32_t replen;
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->dir_fh, &hdr);
-       encode_lookup(&xdr, args->name, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->dir_fh, &hdr);
+       encode_lookup(xdr, args->name, &hdr);
        replen = hdr.replen;    /* get the attribute into args->page */
-       encode_fs_locations(&xdr, args->bitmask, &hdr);
+       encode_fs_locations(xdr, args->bitmask, &hdr);
 
        xdr_inline_pages(&req->rq_rcv_buf, replen << 2, &args->page,
                        0, PAGE_SIZE);
        encode_nops(&hdr);
-       return 0;
 }
 
 #if defined(CONFIG_NFS_V4_1)
 /*
  * EXCHANGE_ID request
  */
-static int nfs4_xdr_enc_exchange_id(struct rpc_rqst *req, uint32_t *p,
-                                   struct nfs41_exchange_id_args *args)
+static void nfs4_xdr_enc_exchange_id(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
+                                    struct nfs41_exchange_id_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = args->client->cl_mvops->minor_version,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_exchange_id(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_exchange_id(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a CREATE_SESSION request
  */
-static int nfs4_xdr_enc_create_session(struct rpc_rqst *req, uint32_t *p,
-                                      struct nfs41_create_session_args *args)
+static void nfs4_xdr_enc_create_session(struct rpc_rqst *req,
+                                       struct xdr_stream *xdr,
+                                       struct nfs41_create_session_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = args->client->cl_mvops->minor_version,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_create_session(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_create_session(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a DESTROY_SESSION request
  */
-static int nfs4_xdr_enc_destroy_session(struct rpc_rqst *req, uint32_t *p,
-                                       struct nfs4_session *session)
+static void nfs4_xdr_enc_destroy_session(struct rpc_rqst *req,
+                                        struct xdr_stream *xdr,
+                                        struct nfs4_session *session)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = session->clp->cl_mvops->minor_version,
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_destroy_session(&xdr, session, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_destroy_session(xdr, session, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a SEQUENCE request
  */
-static int nfs4_xdr_enc_sequence(struct rpc_rqst *req, uint32_t *p,
-                                struct nfs4_sequence_args *args)
+static void nfs4_xdr_enc_sequence(struct rpc_rqst *req, struct xdr_stream *xdr,
+                                 struct nfs4_sequence_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a GET_LEASE_TIME request
  */
-static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,
-                                      struct nfs4_get_lease_time_args *args)
+static void nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req,
+                                       struct xdr_stream *xdr,
+                                       struct nfs4_get_lease_time_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->la_seq_args),
        };
        const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->la_seq_args, &hdr);
-       encode_putrootfh(&xdr, &hdr);
-       encode_fsinfo(&xdr, lease_bitmap, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->la_seq_args, &hdr);
+       encode_putrootfh(xdr, &hdr);
+       encode_fsinfo(xdr, lease_bitmap, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * a RECLAIM_COMPLETE request
  */
-static int nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req, uint32_t *p,
-                                    struct nfs41_reclaim_complete_args *args)
+static void nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req,
+                                         struct xdr_stream *xdr,
+                               struct nfs41_reclaim_complete_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args)
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_reclaim_complete(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_reclaim_complete(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  * Encode GETDEVICEINFO request
  */
-static int nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, uint32_t *p,
-                                     struct nfs4_getdeviceinfo_args *args)
+static void nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req,
+                                      struct xdr_stream *xdr,
+                                      struct nfs4_getdeviceinfo_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_getdeviceinfo(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_getdeviceinfo(xdr, args, &hdr);
 
        /* set up reply kvec. Subtract notification bitmap max size (2)
         * so that notification bitmap is put in xdr_buf tail */
@@ -2657,27 +2582,24 @@ static int nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req, uint32_t *p,
                         args->pdev->pglen);
 
        encode_nops(&hdr);
-       return 0;
 }
 
 /*
  *  Encode LAYOUTGET request
  */
-static int nfs4_xdr_enc_layoutget(struct rpc_rqst *req, uint32_t *p,
-                                 struct nfs4_layoutget_args *args)
+static void nfs4_xdr_enc_layoutget(struct rpc_rqst *req,
+                                  struct xdr_stream *xdr,
+                                  struct nfs4_layoutget_args *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, NFS_FH(args->inode), &hdr);
-       encode_layoutget(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, NFS_FH(args->inode), &hdr);
+       encode_layoutget(xdr, args, &hdr);
        encode_nops(&hdr);
-       return 0;
 }
 #endif /* CONFIG_NFS_V4_1 */
 
@@ -4475,7 +4397,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_
                goto out_overflow;
        eof = be32_to_cpup(p++);
        count = be32_to_cpup(p);
-       hdrlen = (u8 *) p - (u8 *) iov->iov_base;
+       hdrlen = (u8 *) xdr->p - (u8 *) iov->iov_base;
        recvd = req->rq_rcv_buf.len - hdrlen;
        if (count > recvd) {
                dprintk("NFS: server cheating in read reply: "
@@ -4772,7 +4694,7 @@ static int decode_exchange_id(struct xdr_stream *xdr,
        p = xdr_inline_decode(xdr, 8);
        if (unlikely(!p))
                goto out_overflow;
-       xdr_decode_hyper(p, &clp->cl_ex_clid);
+       xdr_decode_hyper(p, &clp->cl_clientid);
        p = xdr_inline_decode(xdr, 12);
        if (unlikely(!p))
                goto out_overflow;
@@ -5000,7 +4922,7 @@ static int decode_getdeviceinfo(struct xdr_stream *xdr,
                goto out_overflow;
        len = be32_to_cpup(p);
        if (len) {
-               int i;
+               uint32_t i;
 
                p = xdr_inline_decode(xdr, 4 * len);
                if (unlikely(!p))
@@ -5090,26 +5012,26 @@ out_overflow:
 /*
  * Decode OPEN_DOWNGRADE response
  */
-static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res)
+static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp,
+                                      struct xdr_stream *xdr,
+                                      struct nfs_closeres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_open_downgrade(&xdr, res);
+       status = decode_open_downgrade(xdr, res);
        if (status != 0)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5118,26 +5040,25 @@ out:
 /*
  * Decode ACCESS response
  */
-static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_accessres *res)
+static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs4_accessres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status != 0)
                goto out;
-       status = decode_access(&xdr, res);
+       status = decode_access(xdr, res);
        if (status != 0)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5146,26 +5067,28 @@ out:
 /*
  * Decode LOOKUP response
  */
-static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res)
+static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs4_lookup_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_lookup(&xdr)) != 0)
+       status = decode_lookup(xdr);
+       if (status)
                goto out;
-       if ((status = decode_getfh(&xdr, res->fh)) != 0)
+       status = decode_getfh(xdr, res->fh);
+       if (status)
                goto out;
-       status = decode_getfattr(&xdr, res->fattr, res->server
+       status = decode_getfattr(xdr, res->fattr, res->server
                        ,!RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5174,23 +5097,25 @@ out:
 /*
  * Decode LOOKUP_ROOT response
  */
-static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res)
+static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp,
+                                   struct xdr_stream *xdr,
+                                   struct nfs4_lookup_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putrootfh(&xdr)) != 0)
+       status = decode_putrootfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_getfh(&xdr, res->fh)) == 0)
-               status = decode_getfattr(&xdr, res->fattr, res->server,
+       status = decode_getfh(xdr, res->fh);
+       if (status == 0)
+               status = decode_getfattr(xdr, res->fattr, res->server,
                                !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5199,24 +5124,25 @@ out:
 /*
  * Decode REMOVE response
  */
-static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs_removeres *res)
+static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs_removeres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_remove(&xdr, &res->cinfo)) != 0)
+       status = decode_remove(xdr, &res->cinfo);
+       if (status)
                goto out;
-       decode_getfattr(&xdr, res->dir_attr, res->server,
+       decode_getfattr(xdr, res->dir_attr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5225,34 +5151,38 @@ out:
 /*
  * Decode RENAME response
  */
-static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, __be32 *p, struct nfs_renameres *res)
+static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs_renameres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_savefh(&xdr)) != 0)
+       status = decode_savefh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_rename(&xdr, &res->old_cinfo, &res->new_cinfo)) != 0)
+       status = decode_rename(xdr, &res->old_cinfo, &res->new_cinfo);
+       if (status)
                goto out;
        /* Current FH is target directory */
-       if (decode_getfattr(&xdr, res->new_fattr, res->server,
+       if (decode_getfattr(xdr, res->new_fattr, res->server,
                                !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
                goto out;
-       if ((status = decode_restorefh(&xdr)) != 0)
+       status = decode_restorefh(xdr);
+       if (status)
                goto out;
-       decode_getfattr(&xdr, res->old_fattr, res->server,
+       decode_getfattr(xdr, res->old_fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5261,37 +5191,41 @@ out:
 /*
  * Decode LINK response
  */
-static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_link_res *res)
+static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                            struct nfs4_link_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_savefh(&xdr)) != 0)
+       status = decode_savefh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_link(&xdr, &res->cinfo)) != 0)
+       status = decode_link(xdr, &res->cinfo);
+       if (status)
                goto out;
        /*
         * Note order: OP_LINK leaves the directory as the current
         *             filehandle.
         */
-       if (decode_getfattr(&xdr, res->dir_attr, res->server,
+       if (decode_getfattr(xdr, res->dir_attr, res->server,
                                !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
                goto out;
-       if ((status = decode_restorefh(&xdr)) != 0)
+       status = decode_restorefh(xdr);
+       if (status)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5300,33 +5234,37 @@ out:
 /*
  * Decode CREATE response
  */
-static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res)
+static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs4_create_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_savefh(&xdr)) != 0)
+       status = decode_savefh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_create(&xdr,&res->dir_cinfo)) != 0)
+       status = decode_create(xdr, &res->dir_cinfo);
+       if (status)
                goto out;
-       if ((status = decode_getfh(&xdr, res->fh)) != 0)
+       status = decode_getfh(xdr, res->fh);
+       if (status)
                goto out;
-       if (decode_getfattr(&xdr, res->fattr, res->server,
+       if (decode_getfattr(xdr, res->fattr, res->server,
                                !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
                goto out;
-       if ((status = decode_restorefh(&xdr)) != 0)
+       status = decode_restorefh(xdr);
+       if (status)
                goto out;
-       decode_getfattr(&xdr, res->dir_fattr, res->server,
+       decode_getfattr(xdr, res->dir_fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5335,31 +5273,31 @@ out:
 /*
  * Decode SYMLINK response
  */
-static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res)
+static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                               struct nfs4_create_res *res)
 {
-       return nfs4_xdr_dec_create(rqstp, p, res);
+       return nfs4_xdr_dec_create(rqstp, xdr, res);
 }
 
 /*
  * Decode GETATTR response
  */
-static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_getattr_res *res)
+static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                               struct nfs4_getattr_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_getfattr(&xdr, res->fattr, res->server,
+       status = decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5368,46 +5306,40 @@ out:
 /*
  * Encode an SETACL request
  */
-static int
-nfs4_xdr_enc_setacl(struct rpc_rqst *req, __be32 *p, struct nfs_setaclargs *args)
+static void nfs4_xdr_enc_setacl(struct rpc_rqst *req, struct xdr_stream *xdr,
+                               struct nfs_setaclargs *args)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr = {
                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
-       int status;
 
-       xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-       encode_compound_hdr(&xdr, req, &hdr);
-       encode_sequence(&xdr, &args->seq_args, &hdr);
-       encode_putfh(&xdr, args->fh, &hdr);
-       status = encode_setacl(&xdr, args, &hdr);
+       encode_compound_hdr(xdr, req, &hdr);
+       encode_sequence(xdr, &args->seq_args, &hdr);
+       encode_putfh(xdr, args->fh, &hdr);
+       encode_setacl(xdr, args, &hdr);
        encode_nops(&hdr);
-       return status;
 }
 
 /*
  * Decode SETACL response
  */
 static int
-nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, __be32 *p,
+nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
                    struct nfs_setaclres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_setattr(&xdr);
+       status = decode_setattr(xdr);
 out:
        return status;
 }
@@ -5416,24 +5348,22 @@ out:
  * Decode GETACL response
  */
 static int
-nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p,
+nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
                    struct nfs_getaclres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_getacl(&xdr, rqstp, &res->acl_len);
+       status = decode_getacl(xdr, rqstp, &res->acl_len);
 
 out:
        return status;
@@ -5442,23 +5372,22 @@ out:
 /*
  * Decode CLOSE response
  */
-static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res)
+static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                             struct nfs_closeres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_close(&xdr, res);
+       status = decode_close(xdr, res);
        if (status != 0)
                goto out;
        /*
@@ -5467,7 +5396,7 @@ static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_clos
         *      an ESTALE error. Shouldn't be a problem,
         *      though, since fattr->valid will remain unset.
         */
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5476,36 +5405,35 @@ out:
 /*
  * Decode OPEN response
  */
-static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res)
+static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                            struct nfs_openres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_savefh(&xdr);
+       status = decode_savefh(xdr);
        if (status)
                goto out;
-       status = decode_open(&xdr, res);
+       status = decode_open(xdr, res);
        if (status)
                goto out;
-       if (decode_getfh(&xdr, &res->fh) != 0)
+       if (decode_getfh(xdr, &res->fh) != 0)
                goto out;
-       if (decode_getfattr(&xdr, res->f_attr, res->server,
+       if (decode_getfattr(xdr, res->f_attr, res->server,
                                !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
                goto out;
-       if (decode_restorefh(&xdr) != 0)
+       if (decode_restorefh(xdr) != 0)
                goto out;
-       decode_getfattr(&xdr, res->dir_attr, res->server,
+       decode_getfattr(xdr, res->dir_attr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5514,20 +5442,20 @@ out:
 /*
  * Decode OPEN_CONFIRM response
  */
-static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, __be32 *p, struct nfs_open_confirmres *res)
+static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp,
+                                    struct xdr_stream *xdr,
+                                    struct nfs_open_confirmres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_open_confirm(&xdr, res);
+       status = decode_open_confirm(xdr, res);
 out:
        return status;
 }
@@ -5535,26 +5463,26 @@ out:
 /*
  * Decode OPEN response
  */
-static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res)
+static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp,
+                                   struct xdr_stream *xdr,
+                                   struct nfs_openres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_open(&xdr, res);
+       status = decode_open(xdr, res);
        if (status)
                goto out;
-       decode_getfattr(&xdr, res->f_attr, res->server,
+       decode_getfattr(xdr, res->f_attr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5563,26 +5491,26 @@ out:
 /*
  * Decode SETATTR response
  */
-static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_setattrres *res)
+static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp,
+                               struct xdr_stream *xdr,
+                               struct nfs_setattrres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_setattr(&xdr);
+       status = decode_setattr(xdr);
        if (status)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5591,23 +5519,22 @@ out:
 /*
  * Decode LOCK response
  */
-static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lock_res *res)
+static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                            struct nfs_lock_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_lock(&xdr, res);
+       status = decode_lock(xdr, res);
 out:
        return status;
 }
@@ -5615,23 +5542,22 @@ out:
 /*
  * Decode LOCKT response
  */
-static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lockt_res *res)
+static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                             struct nfs_lockt_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_lockt(&xdr, res);
+       status = decode_lockt(xdr, res);
 out:
        return status;
 }
@@ -5639,61 +5565,58 @@ out:
 /*
  * Decode LOCKU response
  */
-static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, __be32 *p, struct nfs_locku_res *res)
+static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                             struct nfs_locku_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_locku(&xdr, res);
+       status = decode_locku(xdr, res);
 out:
        return status;
 }
 
-static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp, __be32 *p, void *dummy)
+static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp,
+                                         struct xdr_stream *xdr, void *dummy)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_release_lockowner(&xdr);
+               status = decode_release_lockowner(xdr);
        return status;
 }
 
 /*
  * Decode READLINK response
  */
-static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp, __be32 *p,
+static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp,
+                                struct xdr_stream *xdr,
                                 struct nfs4_readlink_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_readlink(&xdr, rqstp);
+       status = decode_readlink(xdr, rqstp);
 out:
        return status;
 }
@@ -5701,23 +5624,22 @@ out:
 /*
  * Decode READDIR response
  */
-static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_readdir_res *res)
+static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                               struct nfs4_readdir_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_readdir(&xdr, rqstp, res);
+       status = decode_readdir(xdr, rqstp, res);
 out:
        return status;
 }
@@ -5725,23 +5647,22 @@ out:
 /*
  * Decode Read response
  */
-static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, __be32 *p, struct nfs_readres *res)
+static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                            struct nfs_readres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_read(&xdr, rqstp, res);
+       status = decode_read(xdr, rqstp, res);
        if (!status)
                status = res->count;
 out:
@@ -5751,26 +5672,25 @@ out:
 /*
  * Decode WRITE response
  */
-static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res)
+static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                             struct nfs_writeres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_write(&xdr, res);
+       status = decode_write(xdr, res);
        if (status)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
        if (!status)
                status = res->count;
@@ -5781,26 +5701,25 @@ out:
 /*
  * Decode COMMIT response
  */
-static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res)
+static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                              struct nfs_writeres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_commit(&xdr, res);
+       status = decode_commit(xdr, res);
        if (status)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5809,85 +5728,80 @@ out:
 /*
  * Decode FSINFO response
  */
-static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p,
+static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr,
                               struct nfs4_fsinfo_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, &res->seq_res, req);
+               status = decode_sequence(xdr, &res->seq_res, req);
        if (!status)
-               status = decode_putfh(&xdr);
+               status = decode_putfh(xdr);
        if (!status)
-               status = decode_fsinfo(&xdr, res->fsinfo);
+               status = decode_fsinfo(xdr, res->fsinfo);
        return status;
 }
 
 /*
  * Decode PATHCONF response
  */
-static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p,
+static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr,
                                 struct nfs4_pathconf_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, &res->seq_res, req);
+               status = decode_sequence(xdr, &res->seq_res, req);
        if (!status)
-               status = decode_putfh(&xdr);
+               status = decode_putfh(xdr);
        if (!status)
-               status = decode_pathconf(&xdr, res->pathconf);
+               status = decode_pathconf(xdr, res->pathconf);
        return status;
 }
 
 /*
  * Decode STATFS response
  */
-static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p,
+static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, struct xdr_stream *xdr,
                               struct nfs4_statfs_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, &res->seq_res, req);
+               status = decode_sequence(xdr, &res->seq_res, req);
        if (!status)
-               status = decode_putfh(&xdr);
+               status = decode_putfh(xdr);
        if (!status)
-               status = decode_statfs(&xdr, res->fsstat);
+               status = decode_statfs(xdr, res->fsstat);
        return status;
 }
 
 /*
  * Decode GETATTR_BITMAP response
  */
-static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, __be32 *p, struct nfs4_server_caps_res *res)
+static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req,
+                                   struct xdr_stream *xdr,
+                                   struct nfs4_server_caps_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, req);
+       status = decode_sequence(xdr, &res->seq_res, req);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       status = decode_server_caps(&xdr, res);
+       status = decode_server_caps(xdr, res);
 out:
        return status;
 }
@@ -5895,79 +5809,77 @@ out:
 /*
  * Decode RENEW response
  */
-static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, __be32 *p, void *dummy)
+static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
+                             void *__unused)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_renew(&xdr);
+               status = decode_renew(xdr);
        return status;
 }
 
 /*
  * Decode SETCLIENTID response
  */
-static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p,
-               struct nfs4_setclientid_res *res)
+static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req,
+                                   struct xdr_stream *xdr,
+                                   struct nfs4_setclientid_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_setclientid(&xdr, res);
+               status = decode_setclientid(xdr, res);
        return status;
 }
 
 /*
  * Decode SETCLIENTID_CONFIRM response
  */
-static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo)
+static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req,
+                                           struct xdr_stream *xdr,
+                                           struct nfs_fsinfo *fsinfo)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_setclientid_confirm(&xdr);
+               status = decode_setclientid_confirm(xdr);
        if (!status)
-               status = decode_putrootfh(&xdr);
+               status = decode_putrootfh(xdr);
        if (!status)
-               status = decode_fsinfo(&xdr, fsinfo);
+               status = decode_fsinfo(xdr, fsinfo);
        return status;
 }
 
 /*
  * Decode DELEGRETURN response
  */
-static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_delegreturnres *res)
+static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp,
+                                   struct xdr_stream *xdr,
+                                   struct nfs4_delegreturnres *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status != 0)
                goto out;
-       status = decode_delegreturn(&xdr);
+       status = decode_delegreturn(xdr);
        if (status != 0)
                goto out;
-       decode_getfattr(&xdr, res->fattr, res->server,
+       decode_getfattr(xdr, res->fattr, res->server,
                        !RPC_IS_ASYNC(rqstp->rq_task));
 out:
        return status;
@@ -5976,26 +5888,27 @@ out:
 /*
  * Decode FS_LOCATIONS response
  */
-static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, __be32 *p,
+static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
+                                    struct xdr_stream *xdr,
                                     struct nfs4_fs_locations_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, req);
+       status = decode_sequence(xdr, &res->seq_res, req);
        if (status)
                goto out;
-       if ((status = decode_putfh(&xdr)) != 0)
+       status = decode_putfh(xdr);
+       if (status)
                goto out;
-       if ((status = decode_lookup(&xdr)) != 0)
+       status = decode_lookup(xdr);
+       if (status)
                goto out;
-       xdr_enter_page(&xdr, PAGE_SIZE);
-       status = decode_getfattr(&xdr, &res->fs_locations->fattr,
+       xdr_enter_page(xdr, PAGE_SIZE);
+       status = decode_getfattr(xdr, &res->fs_locations->fattr,
                                 res->fs_locations->server,
                                 !RPC_IS_ASYNC(req->rq_task));
 out:
@@ -6006,129 +5919,122 @@ out:
 /*
  * Decode EXCHANGE_ID response
  */
-static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp,
+                                   struct xdr_stream *xdr,
                                    void *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_exchange_id(&xdr, res);
+               status = decode_exchange_id(xdr, res);
        return status;
 }
 
 /*
  * Decode CREATE_SESSION response
  */
-static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp,
+                                      struct xdr_stream *xdr,
                                       struct nfs41_create_session_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_create_session(&xdr, res);
+               status = decode_create_session(xdr, res);
        return status;
 }
 
 /*
  * Decode DESTROY_SESSION response
  */
-static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, uint32_t *p,
-                                       void *dummy)
+static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp,
+                                       struct xdr_stream *xdr,
+                                       void *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_destroy_session(&xdr, dummy);
+               status = decode_destroy_session(xdr, res);
        return status;
 }
 
 /*
  * Decode SEQUENCE response
  */
-static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp,
+                                struct xdr_stream *xdr,
                                 struct nfs4_sequence_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, res, rqstp);
+               status = decode_sequence(xdr, res, rqstp);
        return status;
 }
 
 /*
  * Decode GET_LEASE_TIME response
  */
-static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp,
+                                      struct xdr_stream *xdr,
                                       struct nfs4_get_lease_time_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, &res->lr_seq_res, rqstp);
+               status = decode_sequence(xdr, &res->lr_seq_res, rqstp);
        if (!status)
-               status = decode_putrootfh(&xdr);
+               status = decode_putrootfh(xdr);
        if (!status)
-               status = decode_fsinfo(&xdr, res->lr_fsinfo);
+               status = decode_fsinfo(xdr, res->lr_fsinfo);
        return status;
 }
 
 /*
  * Decode RECLAIM_COMPLETE response
  */
-static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp,
+                                        struct xdr_stream *xdr,
                                         struct nfs41_reclaim_complete_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (!status)
-               status = decode_sequence(&xdr, &res->seq_res, rqstp);
+               status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (!status)
-               status = decode_reclaim_complete(&xdr, (void *)NULL);
+               status = decode_reclaim_complete(xdr, (void *)NULL);
        return status;
 }
 
 /*
  * Decode GETDEVINFO response
  */
-static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp,
+                                     struct xdr_stream *xdr,
                                      struct nfs4_getdeviceinfo_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status != 0)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status != 0)
                goto out;
-       status = decode_getdeviceinfo(&xdr, res->pdev);
+       status = decode_getdeviceinfo(xdr, res->pdev);
 out:
        return status;
 }
@@ -6136,45 +6042,58 @@ out:
 /*
  * Decode LAYOUTGET response
  */
-static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp, uint32_t *p,
+static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp,
+                                 struct xdr_stream *xdr,
                                  struct nfs4_layoutget_res *res)
 {
-       struct xdr_stream xdr;
        struct compound_hdr hdr;
        int status;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-       status = decode_compound_hdr(&xdr, &hdr);
+       status = decode_compound_hdr(xdr, &hdr);
        if (status)
                goto out;
-       status = decode_sequence(&xdr, &res->seq_res, rqstp);
+       status = decode_sequence(xdr, &res->seq_res, rqstp);
        if (status)
                goto out;
-       status = decode_putfh(&xdr);
+       status = decode_putfh(xdr);
        if (status)
                goto out;
-       status = decode_layoutget(&xdr, rqstp, res);
+       status = decode_layoutget(xdr, rqstp, res);
 out:
        return status;
 }
 #endif /* CONFIG_NFS_V4_1 */
 
-__be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
-                          struct nfs_server *server, int plus)
+/**
+ * nfs4_decode_dirent - Decode a single NFSv4 directory entry stored in
+ *                      the local page cache.
+ * @xdr: XDR stream where entry resides
+ * @entry: buffer to fill in with entry data
+ * @plus: boolean indicating whether this should be a readdirplus entry
+ *
+ * Returns zero if successful, otherwise a negative errno value is
+ * returned.
+ *
+ * This function is not invoked during READDIR reply decoding, but
+ * rather whenever an application invokes the getdents(2) system call
+ * on a directory already in our cache.
+ */
+int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
+                      int plus)
 {
        uint32_t bitmap[2] = {0};
        uint32_t len;
        __be32 *p = xdr_inline_decode(xdr, 4);
        if (unlikely(!p))
                goto out_overflow;
-       if (!ntohl(*p++)) {
+       if (*p == xdr_zero) {
                p = xdr_inline_decode(xdr, 4);
                if (unlikely(!p))
                        goto out_overflow;
-               if (!ntohl(*p++))
-                       return ERR_PTR(-EAGAIN);
+               if (*p == xdr_zero)
+                       return -EAGAIN;
                entry->eof = 1;
-               return ERR_PTR(-EBADCOOKIE);
+               return -EBADCOOKIE;
        }
 
        p = xdr_inline_decode(xdr, 12);
@@ -6182,7 +6101,7 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
                goto out_overflow;
        entry->prev_cookie = entry->cookie;
        p = xdr_decode_hyper(p, &entry->cookie);
-       entry->len = ntohl(*p++);
+       entry->len = be32_to_cpup(p);
 
        p = xdr_inline_decode(xdr, entry->len);
        if (unlikely(!p))
@@ -6203,7 +6122,8 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        if (decode_attr_length(xdr, &len, &p) < 0)
                goto out_overflow;
 
-       if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, server, 1) < 0)
+       if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
+                                       entry->server, 1) < 0)
                goto out_overflow;
        if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
                entry->ino = entry->fattr->fileid;
@@ -6212,20 +6132,11 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE)
                entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
 
-       if (verify_attr_len(xdr, p, len) < 0)
-               goto out_overflow;
-
-       p = xdr_inline_peek(xdr, 8);
-       if (p != NULL)
-               entry->eof = !p[0] && p[1];
-       else
-               entry->eof = 0;
-
-       return p;
+       return 0;
 
 out_overflow:
        print_overflow_msg(__func__, xdr);
-       return ERR_PTR(-EAGAIN);
+       return -EAGAIN;
 }
 
 /*
@@ -6301,8 +6212,8 @@ nfs4_stat_to_errno(int stat)
 #define PROC(proc, argtype, restype)                           \
 [NFSPROC4_CLNT_##proc] = {                                     \
        .p_proc   = NFSPROC4_COMPOUND,                          \
-       .p_encode = (kxdrproc_t) nfs4_xdr_##argtype,            \
-       .p_decode = (kxdrproc_t) nfs4_xdr_##restype,            \
+       .p_encode = (kxdreproc_t)nfs4_xdr_##argtype,            \
+       .p_decode = (kxdrdproc_t)nfs4_xdr_##restype,            \
        .p_arglen = NFS4_##argtype##_sz,                        \
        .p_replen = NFS4_##restype##_sz,                        \
        .p_statidx = NFSPROC4_CLNT_##proc,                      \
@@ -6310,50 +6221,50 @@ nfs4_stat_to_errno(int stat)
 }
 
 struct rpc_procinfo    nfs4_procedures[] = {
-  PROC(READ,           enc_read,       dec_read),
-  PROC(WRITE,          enc_write,      dec_write),
-  PROC(COMMIT,         enc_commit,     dec_commit),
-  PROC(OPEN,           enc_open,       dec_open),
-  PROC(OPEN_CONFIRM,   enc_open_confirm,       dec_open_confirm),
-  PROC(OPEN_NOATTR,    enc_open_noattr,        dec_open_noattr),
-  PROC(OPEN_DOWNGRADE, enc_open_downgrade,     dec_open_downgrade),
-  PROC(CLOSE,          enc_close,      dec_close),
-  PROC(SETATTR,                enc_setattr,    dec_setattr),
-  PROC(FSINFO,         enc_fsinfo,     dec_fsinfo),
-  PROC(RENEW,          enc_renew,      dec_renew),
-  PROC(SETCLIENTID,    enc_setclientid,        dec_setclientid),
-  PROC(SETCLIENTID_CONFIRM,    enc_setclientid_confirm,        dec_setclientid_confirm),
-  PROC(LOCK,            enc_lock,       dec_lock),
-  PROC(LOCKT,           enc_lockt,      dec_lockt),
-  PROC(LOCKU,           enc_locku,      dec_locku),
-  PROC(ACCESS,         enc_access,     dec_access),
-  PROC(GETATTR,                enc_getattr,    dec_getattr),
-  PROC(LOOKUP,         enc_lookup,     dec_lookup),
-  PROC(LOOKUP_ROOT,    enc_lookup_root,        dec_lookup_root),
-  PROC(REMOVE,         enc_remove,     dec_remove),
-  PROC(RENAME,         enc_rename,     dec_rename),
-  PROC(LINK,           enc_link,       dec_link),
-  PROC(SYMLINK,                enc_symlink,    dec_symlink),
-  PROC(CREATE,         enc_create,     dec_create),
-  PROC(PATHCONF,       enc_pathconf,   dec_pathconf),
-  PROC(STATFS,         enc_statfs,     dec_statfs),
-  PROC(READLINK,       enc_readlink,   dec_readlink),
-  PROC(READDIR,                enc_readdir,    dec_readdir),
-  PROC(SERVER_CAPS,    enc_server_caps, dec_server_caps),
-  PROC(DELEGRETURN,    enc_delegreturn, dec_delegreturn),
-  PROC(GETACL,         enc_getacl,     dec_getacl),
-  PROC(SETACL,         enc_setacl,     dec_setacl),
-  PROC(FS_LOCATIONS,   enc_fs_locations, dec_fs_locations),
-  PROC(RELEASE_LOCKOWNER, enc_release_lockowner, dec_release_lockowner),
+       PROC(READ,              enc_read,               dec_read),
+       PROC(WRITE,             enc_write,              dec_write),
+       PROC(COMMIT,            enc_commit,             dec_commit),
+       PROC(OPEN,              enc_open,               dec_open),
+       PROC(OPEN_CONFIRM,      enc_open_confirm,       dec_open_confirm),
+       PROC(OPEN_NOATTR,       enc_open_noattr,        dec_open_noattr),
+       PROC(OPEN_DOWNGRADE,    enc_open_downgrade,     dec_open_downgrade),
+       PROC(CLOSE,             enc_close,              dec_close),
+       PROC(SETATTR,           enc_setattr,            dec_setattr),
+       PROC(FSINFO,            enc_fsinfo,             dec_fsinfo),
+       PROC(RENEW,             enc_renew,              dec_renew),
+       PROC(SETCLIENTID,       enc_setclientid,        dec_setclientid),
+       PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm),
+       PROC(LOCK,              enc_lock,               dec_lock),
+       PROC(LOCKT,             enc_lockt,              dec_lockt),
+       PROC(LOCKU,             enc_locku,              dec_locku),
+       PROC(ACCESS,            enc_access,             dec_access),
+       PROC(GETATTR,           enc_getattr,            dec_getattr),
+       PROC(LOOKUP,            enc_lookup,             dec_lookup),
+       PROC(LOOKUP_ROOT,       enc_lookup_root,        dec_lookup_root),
+       PROC(REMOVE,            enc_remove,             dec_remove),
+       PROC(RENAME,            enc_rename,             dec_rename),
+       PROC(LINK,              enc_link,               dec_link),
+       PROC(SYMLINK,           enc_symlink,            dec_symlink),
+       PROC(CREATE,            enc_create,             dec_create),
+       PROC(PATHCONF,          enc_pathconf,           dec_pathconf),
+       PROC(STATFS,            enc_statfs,             dec_statfs),
+       PROC(READLINK,          enc_readlink,           dec_readlink),
+       PROC(READDIR,           enc_readdir,            dec_readdir),
+       PROC(SERVER_CAPS,       enc_server_caps,        dec_server_caps),
+       PROC(DELEGRETURN,       enc_delegreturn,        dec_delegreturn),
+       PROC(GETACL,            enc_getacl,             dec_getacl),
+       PROC(SETACL,            enc_setacl,             dec_setacl),
+       PROC(FS_LOCATIONS,      enc_fs_locations,       dec_fs_locations),
+       PROC(RELEASE_LOCKOWNER, enc_release_lockowner,  dec_release_lockowner),
 #if defined(CONFIG_NFS_V4_1)
-  PROC(EXCHANGE_ID,    enc_exchange_id,        dec_exchange_id),
-  PROC(CREATE_SESSION, enc_create_session,     dec_create_session),
-  PROC(DESTROY_SESSION,        enc_destroy_session,    dec_destroy_session),
-  PROC(SEQUENCE,       enc_sequence,   dec_sequence),
-  PROC(GET_LEASE_TIME, enc_get_lease_time,     dec_get_lease_time),
-  PROC(RECLAIM_COMPLETE, enc_reclaim_complete,  dec_reclaim_complete),
-  PROC(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo),
-  PROC(LAYOUTGET,  enc_layoutget,     dec_layoutget),
+       PROC(EXCHANGE_ID,       enc_exchange_id,        dec_exchange_id),
+       PROC(CREATE_SESSION,    enc_create_session,     dec_create_session),
+       PROC(DESTROY_SESSION,   enc_destroy_session,    dec_destroy_session),
+       PROC(SEQUENCE,          enc_sequence,           dec_sequence),
+       PROC(GET_LEASE_TIME,    enc_get_lease_time,     dec_get_lease_time),
+       PROC(RECLAIM_COMPLETE,  enc_reclaim_complete,   dec_reclaim_complete),
+       PROC(GETDEVICEINFO,     enc_getdeviceinfo,      dec_getdeviceinfo),
+       PROC(LAYOUTGET,         enc_layoutget,          dec_layoutget),
 #endif /* CONFIG_NFS_V4_1 */
 };