NFSD: Set the attributes used to store the verifier for EXCLUSIVE4_1
authorKinglong Mee <kinglongmee@gmail.com>
Thu, 30 Jul 2015 13:55:02 +0000 (21:55 +0800)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 31 Aug 2015 20:16:39 +0000 (16:16 -0400)
According to rfc5661 18.16.4,
"If EXCLUSIVE4_1 was used, the client determines the attributes
 used for the verifier by comparing attrset with cva_attrs.attrmask;"

So, EXCLUSIVE4_1 also needs those bitmask used to store the verifier.

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4proc.c
fs/nfsd/vfs.c
fs/nfsd/vfs.h

index b9681ee0ed19e5dec47681a65bf1d1a365f19af6..4ce6b97b31adec12b47deafecf28e2e672753b8f 100644 (file)
@@ -276,13 +276,13 @@ do_open_lookup(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, stru
                        nfsd4_security_inode_setsecctx(*resfh, &open->op_label, open->op_bmval);
 
                /*
-                * Following rfc 3530 14.2.16, use the returned bitmask
-                * to indicate which attributes we used to store the
-                * verifier:
+                * Following rfc 3530 14.2.16, and rfc 5661 18.16.4
+                * use the returned bitmask to indicate which attributes
+                * we used to store the verifier:
                 */
-               if (open->op_createmode == NFS4_CREATE_EXCLUSIVE && status == 0)
-                       open->op_bmval[1] = (FATTR4_WORD1_TIME_ACCESS |
-                                                       FATTR4_WORD1_TIME_MODIFY);
+               if (nfsd_create_is_exclusive(open->op_createmode) && status == 0)
+                       open->op_bmval[1] |= (FATTR4_WORD1_TIME_ACCESS |
+                                               FATTR4_WORD1_TIME_MODIFY);
        } else
                /*
                 * Note this may exit with the parent still locked.
index b5e077a6e7d4d33d3da25bde15842d68199f6ae8..45c04979e7b3c1fed3d14c387c50de9ce95a729a 100644 (file)
@@ -1249,12 +1249,6 @@ out_nfserr:
 
 #ifdef CONFIG_NFSD_V3
 
-static inline int nfsd_create_is_exclusive(int createmode)
-{
-       return createmode == NFS3_CREATE_EXCLUSIVE
-              || createmode == NFS4_CREATE_EXCLUSIVE4_1;
-}
-
 /*
  * NFSv3 and NFSv4 version of nfsd_create
  */
index 5be875e3e638c733d67bc3efff584e2022c4b18f..fee2451ae24824830481e1d4005922e63f39dabe 100644 (file)
@@ -131,4 +131,10 @@ static inline __be32 fh_getattr(struct svc_fh *fh, struct kstat *stat)
        return nfserrno(vfs_getattr(&p, stat));
 }
 
+static inline int nfsd_create_is_exclusive(int createmode)
+{
+       return createmode == NFS3_CREATE_EXCLUSIVE
+              || createmode == NFS4_CREATE_EXCLUSIVE4_1;
+}
+
 #endif /* LINUX_NFSD_VFS_H */