aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4xdr.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2007-06-05 14:49:03 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2007-07-10 23:40:25 -0400
commitaa53ed541a1fec78a78d02afc8b042d040cc080d (patch)
tree04d4c66b643e4ec9ec1277f3ad642b18f3f94990 /fs/nfs/nfs4xdr.c
parentfc6ae3cf482c385a6fe87ba119d399bb85aa670b (diff)
NFS4: on a O_EXCL OPEN make sure SETATTR sets the fields holding the verifier
The Linux NFS4 client simply skips over the bitmask in an O_EXCL open call and so it doesn't bother to reset any fields that may be holding the verifier. This patch has us save the first two words of the bitmask (which is all the current client has #defines for). The client then later checks this bitmask and turns on the appropriate flags in the sattr->ia_verify field for the following SETATTR call. This patch only currently checks to see if the server used the atime and mtime slots for the verifier (which is what the Linux server uses for this). I'm not sure of what other fields the server could reasonably use, but adding checks for others should be trivial. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r--fs/nfs/nfs4xdr.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 8003c91ccb9a..1fcca516e6ee 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -3269,7 +3269,7 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)
3269static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) 3269static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
3270{ 3270{
3271 __be32 *p; 3271 __be32 *p;
3272 uint32_t bmlen; 3272 uint32_t savewords, bmlen, i;
3273 int status; 3273 int status;
3274 3274
3275 status = decode_op_hdr(xdr, OP_OPEN); 3275 status = decode_op_hdr(xdr, OP_OPEN);
@@ -3287,7 +3287,12 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
3287 goto xdr_error; 3287 goto xdr_error;
3288 3288
3289 READ_BUF(bmlen << 2); 3289 READ_BUF(bmlen << 2);
3290 p += bmlen; 3290 savewords = min_t(uint32_t, bmlen, NFS4_BITMAP_SIZE);
3291 for (i = 0; i < savewords; ++i)
3292 READ32(res->attrset[i]);
3293 for (; i < NFS4_BITMAP_SIZE; i++)
3294 res->attrset[i] = 0;
3295
3291 return decode_delegation(xdr, res); 3296 return decode_delegation(xdr, res);
3292xdr_error: 3297xdr_error:
3293 dprintk("%s: Bitmap too large! Length = %u\n", __FUNCTION__, bmlen); 3298 dprintk("%s: Bitmap too large! Length = %u\n", __FUNCTION__, bmlen);