Author: rmacklem
Date: Tue Jun 21 19:58:29 2011
New Revision: 223373
URL: http://svn.freebsd.org/changeset/base/223373

Log:
  Fix the new NFSv4 server so that it checks for VREAD_ACL when
  a client does a Getattr for an ACL and not VREAD_ATTRIBUTES.
  This was found during the recent NFSv4 interoperability Bakeathon.
  
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfsserver/nfs_nfsdserv.c

Modified: head/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdserv.c        Tue Jun 21 19:34:57 2011        
(r223372)
+++ head/sys/fs/nfsserver/nfs_nfsdserv.c        Tue Jun 21 19:58:29 2011        
(r223373)
@@ -172,11 +172,12 @@ nfsrvd_getattr(struct nfsrv_descript *nd
        fhandle_t fh;
        int at_root = 0, error = 0, supports_nfsv4acls;
        struct nfsreferral *refp;
-       nfsattrbit_t attrbits;
+       nfsattrbit_t attrbits, tmpbits;
        struct mount *mp;
        struct vnode *tvp = NULL;
        struct vattr va;
        uint64_t mounted_on_fileno = 0;
+       accmode_t accmode;
 
        if (nd->nd_repstat)
                return (0);
@@ -197,11 +198,20 @@ nfsrvd_getattr(struct nfsrv_descript *nd
                        vput(vp);
                        return (0);
                }
-               if (!nd->nd_repstat)
-                       nd->nd_repstat = nfsvno_accchk(vp,
-                           VREAD_ATTRIBUTES,
-                           nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
-                           NFSACCCHK_VPISLOCKED, NULL);
+               if (nd->nd_repstat == 0) {
+                       accmode = 0;
+                       NFSSET_ATTRBIT(&tmpbits, &attrbits);
+                       if (NFSISSET_ATTRBIT(&tmpbits, NFSATTRBIT_ACL)) {
+                               NFSCLRBIT_ATTRBIT(&tmpbits, NFSATTRBIT_ACL);
+                               accmode |= VREAD_ACL;
+                       }
+                       if (NFSNONZERO_ATTRBIT(&tmpbits))
+                               accmode |= VREAD_ATTRIBUTES;
+                       if (accmode != 0)
+                               nd->nd_repstat = nfsvno_accchk(vp, accmode,
+                                   nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
+                                   NFSACCCHK_VPISLOCKED, NULL);
+               }
        }
        if (!nd->nd_repstat)
                nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to