diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2017-08-18 18:12:27 +0300 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2017-09-05 22:15:29 +0300 |
commit | eae03e2ac80a3476f0652cb0ee451d7b06d30564 (patch) | |
tree | a07c8ea087aec4334faf0c626f2ab5f396685622 /fs/nfsd/xdr4.h | |
parent | 0828170f3d6a9d86d2cf5bcd00f1b1ff99f0c15e (diff) | |
download | linux-eae03e2ac80a3476f0652cb0ee451d7b06d30564.tar.xz |
nfsd: Incoming xdr_bufs may have content in tail buffer
Since the beginning, svcsock has built a received RPC Call message
by populating the xdr_buf's head, then placing the remaining
message bytes in the xdr_buf's page list. The xdr_buf's tail is
never populated.
This means that an NFSv4 COMPOUND containing an NFS WRITE operation
plus trailing operations has a page list that contains the WRITE
data payload followed by the trailing operations. NFSv4 XDR decoders
will not look in the xdr_buf's tail, ever, because svcsock never put
anything there.
To support transports that can pass the write payload in the
xdr_buf's pagelist and trailing content in the xdr_buf's tail,
introduce logic in READ_BUF that switches to the xdr_buf's tail vec
when the decoder runs out of content in rq_arg.pages.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/xdr4.h')
-rw-r--r-- | fs/nfsd/xdr4.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h index f8a0b6549a88..1e4edbf70052 100644 --- a/fs/nfsd/xdr4.h +++ b/fs/nfsd/xdr4.h @@ -615,6 +615,7 @@ struct nfsd4_compoundargs { __be32 * end; struct page ** pagelist; int pagelen; + bool tail; __be32 tmp[8]; __be32 * tmpp; struct svcxdr_tmpbuf *to_free; |