Author: avg
Date: Wed Mar 21 15:07:26 2018
New Revision: 331302
URL: https://svnweb.freebsd.org/changeset/base/331302

Log:
  MFC r330592: MFV r330591: 8984 fix for 6764 breaks ACL inheritance
  
  PR:           216886

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c  Wed Mar 
21 15:05:45 2018        (r331301)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c  Wed Mar 
21 15:07:26 2018        (r331302)
@@ -1476,7 +1476,7 @@ zfs_ace_can_use(vtype_t vtype, uint16_t acep_flags)
  */
 static zfs_acl_t *
 zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_acl_t *paclp,
-    uint64_t mode)
+    uint64_t mode, boolean_t *need_chmod)
 {
        void            *pacep = NULL;
        void            *acep;
@@ -1490,7 +1490,10 @@ zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_a
        size_t          data1sz, data2sz;
        uint_t          aclinherit;
        boolean_t       isdir = (vtype == VDIR);
+       boolean_t       isreg = (vtype == VREG);
 
+       *need_chmod = B_TRUE;
+
        aclp = zfs_acl_alloc(paclp->z_version);
        aclinherit = zfsvfs->z_acl_inherit;
        if (aclinherit == ZFS_ACL_DISCARD || vtype == VLNK)
@@ -1513,6 +1516,17 @@ zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_a
                        continue;
 
                /*
+                * If owner@, group@, or everyone@ inheritable
+                * then zfs_acl_chmod() isn't needed.
+                */
+               if ((aclinherit == ZFS_ACL_PASSTHROUGH ||
+                   aclinherit == ZFS_ACL_PASSTHROUGH_X) &&
+                   ((iflags & (ACE_OWNER|ACE_EVERYONE)) ||
+                   ((iflags & OWNING_GROUP) == OWNING_GROUP)) &&
+                   (isreg || (isdir && (iflags & ACE_DIRECTORY_INHERIT_ACE))))
+                       *need_chmod = B_FALSE;
+
+               /*
                 * Strip inherited execute permission from file if
                 * not in mode
                 */
@@ -1599,6 +1613,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *va
        zfsvfs_t        *zfsvfs = dzp->z_zfsvfs;
        zfs_acl_t       *paclp;
        gid_t           gid;
+       boolean_t       need_chmod = B_TRUE;
        boolean_t       trim = B_FALSE;
        boolean_t       inherited = B_FALSE;
 
@@ -1694,7 +1709,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *va
                    !(dzp->z_pflags & ZFS_XATTR)) {
                        VERIFY(0 == zfs_acl_node_read(dzp, &paclp, B_FALSE));
                        acl_ids->z_aclp = zfs_acl_inherit(zfsvfs,
-                           vap->va_type, paclp, acl_ids->z_mode);
+                           vap->va_type, paclp, acl_ids->z_mode, &need_chmod);
                        inherited = B_TRUE;
                } else {
                        acl_ids->z_aclp =
@@ -1703,15 +1718,18 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *va
                }
                mutex_exit(&dzp->z_acl_lock);
 
-               if (vap->va_type == VDIR)
-                       acl_ids->z_aclp->z_hints |= ZFS_ACL_AUTO_INHERIT;
+               if (need_chmod) {
+                       if (vap->va_type == VDIR)
+                               acl_ids->z_aclp->z_hints |=
+                                   ZFS_ACL_AUTO_INHERIT;
 
-               if (zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK &&
-                   zfsvfs->z_acl_inherit != ZFS_ACL_PASSTHROUGH &&
-                   zfsvfs->z_acl_inherit != ZFS_ACL_PASSTHROUGH_X)
-                       trim = B_TRUE;
-               zfs_acl_chmod(vap->va_type, acl_ids->z_mode, B_FALSE, trim,
-                   acl_ids->z_aclp);
+                       if (zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK &&
+                           zfsvfs->z_acl_inherit != ZFS_ACL_PASSTHROUGH &&
+                           zfsvfs->z_acl_inherit != ZFS_ACL_PASSTHROUGH_X)
+                               trim = B_TRUE;
+                       zfs_acl_chmod(vap->va_type, acl_ids->z_mode, B_FALSE,
+                           trim, acl_ids->z_aclp);
+               }
        }
 
        if (inherited || vsecp) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to