NFSD: Report zero space limit for write delegations
authorChuck Lever <chuck.lever@oracle.com>
Wed, 19 Jul 2023 15:33:09 +0000 (11:33 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Tue, 29 Aug 2023 21:45:22 +0000 (17:45 -0400)
Replace the -1 (no limit) with a zero (no reserved space).

This prevents certain non-determinant client behavior, such as
silly-renaming a file when the only open reference is a write
delegation. Such a rename can leave unexpected .nfs files in a
directory that is otherwise supposed to be empty.

Note that other server implementations that support write delegation
also set this field to zero.

Suggested-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index 95aafe52fa0c65b25b354148471020ade9f456a6..d4de39404cde8a8791b8133df5625f1ff9c8c9a2 100644 (file)
@@ -3978,17 +3978,20 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr,
                nfserr = nfsd4_encode_stateid(xdr, &open->op_delegate_stateid);
                if (nfserr)
                        return nfserr;
-               p = xdr_reserve_space(xdr, 32);
+
+               p = xdr_reserve_space(xdr, XDR_UNIT * 8);
                if (!p)
                        return nfserr_resource;
                *p++ = cpu_to_be32(open->op_recall);
 
                /*
+                * Always flush on close
+                *
                 * TODO: space_limit's in delegations
                 */
                *p++ = cpu_to_be32(NFS4_LIMIT_SIZE);
-               *p++ = cpu_to_be32(~(u32)0);
-               *p++ = cpu_to_be32(~(u32)0);
+               *p++ = xdr_zero;
+               *p++ = xdr_zero;
 
                /*
                 * TODO: ACE's in delegations