Index: lib/libc/posix1e/acl_support_nfs4.c =================================================================== --- lib/libc/posix1e/acl_support_nfs4.c +++ lib/libc/posix1e/acl_support_nfs4.c @@ -48,6 +48,7 @@ { ACL_ENTRY_NO_PROPAGATE_INHERIT, "no_propagate", 'n'}, { ACL_ENTRY_SUCCESSFUL_ACCESS, "successfull_access", 'S'}, { ACL_ENTRY_FAILED_ACCESS, "failed_access", 'F'}, + { ACL_ENTRY_INHERITED, "inherited", 'I' }, /* * There is no ACE_IDENTIFIER_GROUP here - SunOS does not show it * in the "flags" field. There is no ACE_OWNER, ACE_GROUP or Index: sys/cddl/compat/opensolaris/kern/opensolaris_acl.c =================================================================== --- sys/cddl/compat/opensolaris/kern/opensolaris_acl.c +++ sys/cddl/compat/opensolaris/kern/opensolaris_acl.c @@ -64,6 +64,8 @@ ACL_ENTRY_NO_PROPAGATE_INHERIT}, {ACE_INHERIT_ONLY_ACE, ACL_ENTRY_INHERIT_ONLY}, + {ACE_INHERITED_ACE, + ACL_ENTRY_INHERITED}, {ACE_SUCCESSFUL_ACCESS_ACE_FLAG, ACL_ENTRY_SUCCESSFUL_ACCESS}, {ACE_FAILED_ACCESS_ACE_FLAG, Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c @@ -1561,12 +1561,13 @@ } aclnode = zfs_acl_node_alloc(ace_size); - list_insert_tail(&aclp->z_acl, aclnode); - acep = aclnode->z_acldata; - - zfs_set_ace(aclp, acep, access_mask, type, - who, iflags|ACE_INHERITED_ACE); - + list_insert_tail(&aclp->z_acl, aclnode); + acep = aclnode->z_acldata; + + printf("%s(%d): here we are\n", __FUNCTION__, __LINE__); + zfs_set_ace(aclp, acep, access_mask, type, + who, iflags|ACE_INHERITED_ACE); + /* * Copy special opaque data if any */ @@ -1583,12 +1584,14 @@ if (vdir) aclp->z_hints |= ZFS_INHERIT_ACE; - - if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) { - newflags &= ~ALL_INHERIT; - aclp->z_ops.ace_flags_set(acep, - newflags|ACE_INHERITED_ACE); - zfs_restricted_update(zfsvfs, aclp, acep); + + if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) { + newflags &= ~ALL_INHERIT; + printf("%s(%d): here we are\n", __FUNCTION__, __LINE__); + + aclp->z_ops.ace_flags_set(acep, + newflags|ACE_INHERITED_ACE); + zfs_restricted_update(zfsvfs, aclp, acep); continue; } @@ -1598,16 +1601,18 @@ * If only FILE_INHERIT is set then turn on * inherit_only */ - if ((iflags & (ACE_FILE_INHERIT_ACE | - ACE_DIRECTORY_INHERIT_ACE)) == ACE_FILE_INHERIT_ACE) { - newflags |= ACE_INHERIT_ONLY_ACE; - aclp->z_ops.ace_flags_set(acep, - newflags|ACE_INHERITED_ACE); - } else { - newflags &= ~ACE_INHERIT_ONLY_ACE; - aclp->z_ops.ace_flags_set(acep, - newflags|ACE_INHERITED_ACE); - } + if ((iflags & (ACE_FILE_INHERIT_ACE | + ACE_DIRECTORY_INHERIT_ACE)) == ACE_FILE_INHERIT_ACE) { + newflags |= ACE_INHERIT_ONLY_ACE; + printf("%s(%d): here we are\n", __FUNCTION__, __LINE__); + aclp->z_ops.ace_flags_set(acep, + newflags|ACE_INHERITED_ACE); + } else { + newflags &= ~ACE_INHERIT_ONLY_ACE; + printf("%s(%d): here we are\n", __FUNCTION__, __LINE__); + aclp->z_ops.ace_flags_set(acep, + newflags|ACE_INHERITED_ACE); + } } return (aclp); } Index: sys/cddl/contrib/opensolaris/uts/common/sys/acl.h =================================================================== --- sys/cddl/contrib/opensolaris/uts/common/sys/acl.h +++ sys/cddl/contrib/opensolaris/uts/common/sys/acl.h @@ -189,11 +189,12 @@ ACE_DIRECTORY_INHERIT_ACE | \ ACE_NO_PROPAGATE_INHERIT_ACE | \ ACE_INHERIT_ONLY_ACE | \ + ACE_INHERITED_ACE | \ ACE_IDENTIFIER_GROUP) #define ACE_TYPE_FLAGS (ACE_OWNER|ACE_GROUP|ACE_EVERYONE| \ ACE_IDENTIFIER_GROUP) -#define ACE_INHERIT_FLAGS (ACE_FILE_INHERIT_ACE| \ +#define ACE_INHERIT_FLAGS (ACE_FILE_INHERIT_ACE| ACL_INHERITED_ACE| \ ACE_DIRECTORY_INHERIT_ACE|ACE_NO_PROPAGATE_INHERIT_ACE|ACE_INHERIT_ONLY_ACE) /* cmd args to acl(2) for aclent_t */ Index: sys/kern/subr_acl_nfs4.c =================================================================== --- sys/kern/subr_acl_nfs4.c +++ sys/kern/subr_acl_nfs4.c @@ -1068,7 +1068,9 @@ child_aclp->acl_cnt++; entry->ae_flags &= ~ACL_ENTRY_INHERIT_ONLY; - + + entry->ae_flags |= ACL_ENTRY_INHERITED; + /* * If the type of the ACE is neither ALLOW nor DENY, * then leave it as it is and proceed to the next one. Index: sys/sys/acl.h =================================================================== --- sys/sys/acl.h +++ sys/sys/acl.h @@ -246,17 +246,18 @@ #define ACL_ENTRY_FILE_INHERIT 0x0001 #define ACL_ENTRY_DIRECTORY_INHERIT 0x0002 #define ACL_ENTRY_NO_PROPAGATE_INHERIT 0x0004 -#define ACL_ENTRY_INHERIT_ONLY 0x0008 -#define ACL_ENTRY_SUCCESSFUL_ACCESS 0x0010 -#define ACL_ENTRY_FAILED_ACCESS 0x0020 - -#define ACL_FLAGS_BITS (ACL_ENTRY_FILE_INHERIT | \ - ACL_ENTRY_DIRECTORY_INHERIT | ACL_ENTRY_NO_PROPAGATE_INHERIT | \ - ACL_ENTRY_INHERIT_ONLY | ACL_ENTRY_SUCCESSFUL_ACCESS | \ - ACL_ENTRY_FAILED_ACCESS) - -/* - * Undefined value in ae_id field. ae_id should be set to this value +#define ACL_ENTRY_INHERIT_ONLY 0x0008 +#define ACL_ENTRY_SUCCESSFUL_ACCESS 0x0010 +#define ACL_ENTRY_FAILED_ACCESS 0x0020 +#define ACL_ENTRY_INHERITED 0x0080 + +#define ACL_FLAGS_BITS (ACL_ENTRY_FILE_INHERIT | \ + ACL_ENTRY_DIRECTORY_INHERIT | ACL_ENTRY_NO_PROPAGATE_INHERIT | \ + ACL_ENTRY_INHERIT_ONLY | ACL_ENTRY_SUCCESSFUL_ACCESS | \ + ACL_ENTRY_FAILED_ACCESS | ACL_ENTRY_INHERITED) + +/* + * Undefined value in ae_id field. ae_id should be set to this value * iff ae_tag is ACL_USER_OBJ, ACL_GROUP_OBJ, ACL_OTHER or ACL_EVERYONE. */ #define ACL_UNDEFINED_ID ((uid_t)-1)