}
 
 /**
- * svcxdr_init_decode - Prepare an xdr_stream for svc Call decoding
+ * svcxdr_init_decode - Prepare an xdr_stream for Call decoding
  * @rqstp: controlling server RPC transaction context
  *
+ * This function currently assumes the RPC header in rq_arg has
+ * already been decoded. Upon return, xdr->p points to the
+ * location of the upper layer header.
  */
 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;
+       struct xdr_buf *buf = &rqstp->rq_arg;
+       struct kvec *argv = buf->head;
 
-       xdr_init_decode(xdr, &rqstp->rq_arg, argv->iov_base, NULL);
+       /*
+        * svc_getnl() and friends do not keep the xdr_buf's ::len
+        * field up to date. Refresh that field before initializing
+        * the argument decoding stream.
+        */
+       buf->len = buf->head->iov_len + buf->page_len + buf->tail->iov_len;
+
+       xdr_init_decode(xdr, buf, argv->iov_base, NULL);
        xdr_set_scratch_page(xdr, rqstp->rq_scratch_page);
 }