* (necessary in the NFSv4.0 compound case)
         */
        rqstp->rq_cachetype = proc->pc_cachetype;
+
+       svcxdr_init_decode(rqstp);
        if (!proc->pc_decode(rqstp, argv->iov_base))
                goto out_decode_err;
 
 
 
        size_t                  rq_xprt_hlen;   /* xprt header len */
        struct xdr_buf          rq_arg;
+       struct xdr_stream       rq_arg_stream;
+       struct page             *rq_scratch_page;
        struct xdr_buf          rq_res;
        struct page             *rq_pages[RPCSVC_MAXPAGES + 1];
        struct page *           *rq_respages;   /* points into rq_pages */
        svc_reserve(rqstp, space + rqstp->rq_auth_slack);
 }
 
+/**
+ * svcxdr_init_decode - Prepare an xdr_stream for svc Call decoding
+ * @rqstp: controlling server RPC transaction context
+ *
+ */
+static inline void svcxdr_init_decode(struct svc_rqst *rqstp)
+{
+       struct xdr_stream *xdr = &rqstp->rq_arg_stream;
+       struct kvec *argv = rqstp->rq_arg.head;
+
+       xdr_init_decode(xdr, &rqstp->rq_arg, argv->iov_base, NULL);
+       xdr_set_scratch_page(xdr, rqstp->rq_scratch_page);
+}
+
 #endif /* SUNRPC_SVC_H */
 
        rqstp->rq_server = serv;
        rqstp->rq_pool = pool;
 
+       rqstp->rq_scratch_page = alloc_pages_node(node, GFP_KERNEL, 0);
+       if (!rqstp->rq_scratch_page)
+               goto out_enomem;
+
        rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
        if (!rqstp->rq_argp)
                goto out_enomem;
 svc_rqst_free(struct svc_rqst *rqstp)
 {
        svc_release_buffer(rqstp);
+       put_page(rqstp->rq_scratch_page);
        kfree(rqstp->rq_resp);
        kfree(rqstp->rq_argp);
        kfree(rqstp->rq_auth_data);