nfsd4: delay filling in write iovec array till after xdr decoding
authorJ. Bruce Fields <bfields@redhat.com>
Thu, 15 Nov 2012 19:52:19 +0000 (14:52 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 26 Nov 2012 14:08:15 +0000 (09:08 -0500)
commitffe1137ba743cdf1c2414d5a89690aec1daa6bba
treeb774cb101e03779db6dd569a28b3e5d7d4bf06b1
parent70cc7f75b1ee4161dfdea1012223db25712ab1a5
nfsd4: delay filling in write iovec array till after xdr decoding

Our server rejects compounds containing more than one write operation.
It's unclear whether this is really permitted by the spec; with 4.0,
it's possibly OK, with 4.1 (which has clearer limits on compound
parameters), it's probably not OK.  No client that we're aware of has
ever done this, but in theory it could be useful.

The source of the limitation: we need an array of iovecs to pass to the
write operation.  In the worst case that array of iovecs could have
hundreds of elements (the maximum rwsize divided by the page size), so
it's too big to put on the stack, or in each compound op.  So we instead
keep a single such array in the compound argument.

We fill in that array at the time we decode the xdr operation.

But we decode every op in the compound before executing any of them.  So
once we've used that array we can't decode another write.

If we instead delay filling in that array till the time we actually
perform the write, we can reuse it.

Another option might be to switch to decoding compound ops one at a
time.  I considered doing that, but it has a number of other side
effects, and I'd rather fix just this one problem for now.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Documentation/filesystems/nfs/nfs41-server.txt
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h