4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2013 by Delphix. All rights reserved.
24 * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
27 #include <sys/types.h>
28 #include <sys/param.h>
30 #include <sys/systm.h>
31 #include <sys/sysmacros.h>
32 #include <sys/resource.h>
34 #include <sys/vnode.h>
39 #include <sys/cmn_err.h>
40 #include <sys/errno.h>
41 #include <sys/unistd.h>
43 #include <sys/fs/zfs.h>
45 #include <sys/policy.h>
46 #include <sys/zfs_znode.h>
47 #include <sys/zfs_fuid.h>
48 #include <sys/zfs_acl.h>
49 #include <sys/zfs_dir.h>
50 #include <sys/zfs_vfsops.h>
52 #include <sys/dnode.h>
55 #include "sys/fs_subr.h"
56 #include <acl/acl_common.h>
58 #define ALLOW ACE_ACCESS_ALLOWED_ACE_TYPE
59 #define DENY ACE_ACCESS_DENIED_ACE_TYPE
60 #define MAX_ACE_TYPE ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE
61 #define MIN_ACE_TYPE ALLOW
63 #define OWNING_GROUP (ACE_GROUP|ACE_IDENTIFIER_GROUP)
64 #define EVERYONE_ALLOW_MASK (ACE_READ_ACL|ACE_READ_ATTRIBUTES | \
65 ACE_READ_NAMED_ATTRS|ACE_SYNCHRONIZE)
66 #define EVERYONE_DENY_MASK (ACE_WRITE_ACL|ACE_WRITE_OWNER | \
67 ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
68 #define OWNER_ALLOW_MASK (ACE_WRITE_ACL | ACE_WRITE_OWNER | \
69 ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
71 #define ZFS_CHECKED_MASKS (ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_DATA| \
72 ACE_READ_NAMED_ATTRS|ACE_WRITE_DATA|ACE_WRITE_ATTRIBUTES| \
73 ACE_WRITE_NAMED_ATTRS|ACE_APPEND_DATA|ACE_EXECUTE|ACE_WRITE_OWNER| \
74 ACE_WRITE_ACL|ACE_DELETE|ACE_DELETE_CHILD|ACE_SYNCHRONIZE)
76 #define WRITE_MASK_DATA (ACE_WRITE_DATA|ACE_APPEND_DATA|ACE_WRITE_NAMED_ATTRS)
77 #define WRITE_MASK_ATTRS (ACE_WRITE_ACL|ACE_WRITE_OWNER|ACE_WRITE_ATTRIBUTES| \
78 ACE_DELETE|ACE_DELETE_CHILD)
79 #define WRITE_MASK (WRITE_MASK_DATA|WRITE_MASK_ATTRS)
81 #define OGE_CLEAR (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
82 ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
84 #define OKAY_MASK_BITS (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
85 ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
87 #define ALL_INHERIT (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE | \
88 ACE_NO_PROPAGATE_INHERIT_ACE|ACE_INHERIT_ONLY_ACE|ACE_INHERITED_ACE)
90 #define RESTRICTED_CLEAR (ACE_WRITE_ACL|ACE_WRITE_OWNER)
92 #define V4_ACL_WIDE_FLAGS (ZFS_ACL_AUTO_INHERIT|ZFS_ACL_DEFAULTED|\
95 #define ZFS_ACL_WIDE_FLAGS (V4_ACL_WIDE_FLAGS|ZFS_ACL_TRIVIAL|ZFS_INHERIT_ACE|\
98 #define ALL_MODE_EXECS (S_IXUSR | S_IXGRP | S_IXOTH)
101 zfs_ace_v0_get_type(void *acep
)
103 return (((zfs_oldace_t
*)acep
)->z_type
);
107 zfs_ace_v0_get_flags(void *acep
)
109 return (((zfs_oldace_t
*)acep
)->z_flags
);
113 zfs_ace_v0_get_mask(void *acep
)
115 return (((zfs_oldace_t
*)acep
)->z_access_mask
);
119 zfs_ace_v0_get_who(void *acep
)
121 return (((zfs_oldace_t
*)acep
)->z_fuid
);
125 zfs_ace_v0_set_type(void *acep
, uint16_t type
)
127 ((zfs_oldace_t
*)acep
)->z_type
= type
;
131 zfs_ace_v0_set_flags(void *acep
, uint16_t flags
)
133 ((zfs_oldace_t
*)acep
)->z_flags
= flags
;
137 zfs_ace_v0_set_mask(void *acep
, uint32_t mask
)
139 ((zfs_oldace_t
*)acep
)->z_access_mask
= mask
;
143 zfs_ace_v0_set_who(void *acep
, uint64_t who
)
145 ((zfs_oldace_t
*)acep
)->z_fuid
= who
;
150 zfs_ace_v0_size(void *acep
)
152 return (sizeof (zfs_oldace_t
));
156 zfs_ace_v0_abstract_size(void)
158 return (sizeof (zfs_oldace_t
));
162 zfs_ace_v0_mask_off(void)
164 return (offsetof(zfs_oldace_t
, z_access_mask
));
169 zfs_ace_v0_data(void *acep
, void **datap
)
175 static acl_ops_t zfs_acl_v0_ops
= {
178 zfs_ace_v0_get_flags
,
179 zfs_ace_v0_set_flags
,
185 zfs_ace_v0_abstract_size
,
191 zfs_ace_fuid_get_type(void *acep
)
193 return (((zfs_ace_hdr_t
*)acep
)->z_type
);
197 zfs_ace_fuid_get_flags(void *acep
)
199 return (((zfs_ace_hdr_t
*)acep
)->z_flags
);
203 zfs_ace_fuid_get_mask(void *acep
)
205 return (((zfs_ace_hdr_t
*)acep
)->z_access_mask
);
209 zfs_ace_fuid_get_who(void *args
)
212 zfs_ace_t
*acep
= args
;
214 entry_type
= acep
->z_hdr
.z_flags
& ACE_TYPE_FLAGS
;
216 if (entry_type
== ACE_OWNER
|| entry_type
== OWNING_GROUP
||
217 entry_type
== ACE_EVERYONE
)
219 return (((zfs_ace_t
*)acep
)->z_fuid
);
223 zfs_ace_fuid_set_type(void *acep
, uint16_t type
)
225 ((zfs_ace_hdr_t
*)acep
)->z_type
= type
;
229 zfs_ace_fuid_set_flags(void *acep
, uint16_t flags
)
231 ((zfs_ace_hdr_t
*)acep
)->z_flags
= flags
;
235 zfs_ace_fuid_set_mask(void *acep
, uint32_t mask
)
237 ((zfs_ace_hdr_t
*)acep
)->z_access_mask
= mask
;
241 zfs_ace_fuid_set_who(void *arg
, uint64_t who
)
243 zfs_ace_t
*acep
= arg
;
245 uint16_t entry_type
= acep
->z_hdr
.z_flags
& ACE_TYPE_FLAGS
;
247 if (entry_type
== ACE_OWNER
|| entry_type
== OWNING_GROUP
||
248 entry_type
== ACE_EVERYONE
)
254 zfs_ace_fuid_size(void *acep
)
256 zfs_ace_hdr_t
*zacep
= acep
;
259 switch (zacep
->z_type
) {
260 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
261 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
262 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
263 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
264 return (sizeof (zfs_object_ace_t
));
268 (((zfs_ace_hdr_t
*)acep
)->z_flags
& ACE_TYPE_FLAGS
);
269 if (entry_type
== ACE_OWNER
||
270 entry_type
== OWNING_GROUP
||
271 entry_type
== ACE_EVERYONE
)
272 return (sizeof (zfs_ace_hdr_t
));
275 return (sizeof (zfs_ace_t
));
280 zfs_ace_fuid_abstract_size(void)
282 return (sizeof (zfs_ace_hdr_t
));
286 zfs_ace_fuid_mask_off(void)
288 return (offsetof(zfs_ace_hdr_t
, z_access_mask
));
292 zfs_ace_fuid_data(void *acep
, void **datap
)
294 zfs_ace_t
*zacep
= acep
;
295 zfs_object_ace_t
*zobjp
;
297 switch (zacep
->z_hdr
.z_type
) {
298 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
299 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
300 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
301 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
303 *datap
= (caddr_t
)zobjp
+ sizeof (zfs_ace_t
);
304 return (sizeof (zfs_object_ace_t
) - sizeof (zfs_ace_t
));
311 static acl_ops_t zfs_acl_fuid_ops
= {
312 zfs_ace_fuid_get_mask
,
313 zfs_ace_fuid_set_mask
,
314 zfs_ace_fuid_get_flags
,
315 zfs_ace_fuid_set_flags
,
316 zfs_ace_fuid_get_type
,
317 zfs_ace_fuid_set_type
,
318 zfs_ace_fuid_get_who
,
319 zfs_ace_fuid_set_who
,
321 zfs_ace_fuid_abstract_size
,
322 zfs_ace_fuid_mask_off
,
327 * The following three functions are provided for compatibility with
328 * older ZPL version in order to determine if the file use to have
329 * an external ACL and what version of ACL previously existed on the
330 * file. Would really be nice to not need this, sigh.
333 zfs_external_acl(znode_t
*zp
)
335 zfs_acl_phys_t acl_phys
;
342 * Need to deal with a potential
343 * race where zfs_sa_upgrade could cause
344 * z_isa_sa to change.
346 * If the lookup fails then the state of z_is_sa should have
350 if ((error
= sa_lookup(zp
->z_sa_hdl
, SA_ZPL_ZNODE_ACL(zp
->z_zfsvfs
),
351 &acl_phys
, sizeof (acl_phys
))) == 0)
352 return (acl_phys
.z_acl_extern_obj
);
355 * after upgrade the SA_ZPL_ZNODE_ACL should have been
358 VERIFY(zp
->z_is_sa
&& error
== ENOENT
);
364 * Determine size of ACL in bytes
366 * This is more complicated than it should be since we have to deal
367 * with old external ACLs.
370 zfs_acl_znode_info(znode_t
*zp
, int *aclsize
, int *aclcount
,
371 zfs_acl_phys_t
*aclphys
)
373 zfsvfs_t
*zfsvfs
= zp
->z_zfsvfs
;
378 ASSERT(MUTEX_HELD(&zp
->z_acl_lock
));
380 if ((error
= sa_size(zp
->z_sa_hdl
, SA_ZPL_DACL_ACES(zfsvfs
),
384 if ((error
= sa_lookup(zp
->z_sa_hdl
, SA_ZPL_DACL_COUNT(zfsvfs
),
385 &acl_count
, sizeof (acl_count
))) != 0)
387 *aclcount
= acl_count
;
389 if ((error
= sa_lookup(zp
->z_sa_hdl
, SA_ZPL_ZNODE_ACL(zfsvfs
),
390 aclphys
, sizeof (*aclphys
))) != 0)
393 if (aclphys
->z_acl_version
== ZFS_ACL_VERSION_INITIAL
) {
394 *aclsize
= ZFS_ACL_SIZE(aclphys
->z_acl_size
);
395 *aclcount
= aclphys
->z_acl_size
;
397 *aclsize
= aclphys
->z_acl_size
;
398 *aclcount
= aclphys
->z_acl_count
;
405 zfs_znode_acl_version(znode_t
*zp
)
407 zfs_acl_phys_t acl_phys
;
410 return (ZFS_ACL_VERSION_FUID
);
415 * Need to deal with a potential
416 * race where zfs_sa_upgrade could cause
417 * z_isa_sa to change.
419 * If the lookup fails then the state of z_is_sa should have
422 if ((error
= sa_lookup(zp
->z_sa_hdl
,
423 SA_ZPL_ZNODE_ACL(zp
->z_zfsvfs
),
424 &acl_phys
, sizeof (acl_phys
))) == 0)
425 return (acl_phys
.z_acl_version
);
428 * After upgrade SA_ZPL_ZNODE_ACL should have
431 VERIFY(zp
->z_is_sa
&& error
== ENOENT
);
432 return (ZFS_ACL_VERSION_FUID
);
438 zfs_acl_version(int version
)
440 if (version
< ZPL_VERSION_FUID
)
441 return (ZFS_ACL_VERSION_INITIAL
);
443 return (ZFS_ACL_VERSION_FUID
);
447 zfs_acl_version_zp(znode_t
*zp
)
449 return (zfs_acl_version(zp
->z_zfsvfs
->z_version
));
453 zfs_acl_alloc(int vers
)
457 aclp
= kmem_zalloc(sizeof (zfs_acl_t
), KM_SLEEP
);
458 list_create(&aclp
->z_acl
, sizeof (zfs_acl_node_t
),
459 offsetof(zfs_acl_node_t
, z_next
));
460 aclp
->z_version
= vers
;
461 if (vers
== ZFS_ACL_VERSION_FUID
)
462 aclp
->z_ops
= zfs_acl_fuid_ops
;
464 aclp
->z_ops
= zfs_acl_v0_ops
;
469 zfs_acl_node_alloc(size_t bytes
)
471 zfs_acl_node_t
*aclnode
;
473 aclnode
= kmem_zalloc(sizeof (zfs_acl_node_t
), KM_SLEEP
);
475 aclnode
->z_acldata
= kmem_alloc(bytes
, KM_SLEEP
);
476 aclnode
->z_allocdata
= aclnode
->z_acldata
;
477 aclnode
->z_allocsize
= bytes
;
478 aclnode
->z_size
= bytes
;
485 zfs_acl_node_free(zfs_acl_node_t
*aclnode
)
487 if (aclnode
->z_allocsize
)
488 kmem_free(aclnode
->z_allocdata
, aclnode
->z_allocsize
);
489 kmem_free(aclnode
, sizeof (zfs_acl_node_t
));
493 zfs_acl_release_nodes(zfs_acl_t
*aclp
)
495 zfs_acl_node_t
*aclnode
;
497 while (aclnode
= list_head(&aclp
->z_acl
)) {
498 list_remove(&aclp
->z_acl
, aclnode
);
499 zfs_acl_node_free(aclnode
);
501 aclp
->z_acl_count
= 0;
502 aclp
->z_acl_bytes
= 0;
506 zfs_acl_free(zfs_acl_t
*aclp
)
508 zfs_acl_release_nodes(aclp
);
509 list_destroy(&aclp
->z_acl
);
510 kmem_free(aclp
, sizeof (zfs_acl_t
));
514 zfs_acl_valid_ace_type(uint_t type
, uint_t flags
)
521 case ACE_SYSTEM_AUDIT_ACE_TYPE
:
522 case ACE_SYSTEM_ALARM_ACE_TYPE
:
523 entry_type
= flags
& ACE_TYPE_FLAGS
;
524 return (entry_type
== ACE_OWNER
||
525 entry_type
== OWNING_GROUP
||
526 entry_type
== ACE_EVERYONE
|| entry_type
== 0 ||
527 entry_type
== ACE_IDENTIFIER_GROUP
);
529 if (type
>= MIN_ACE_TYPE
&& type
<= MAX_ACE_TYPE
)
536 zfs_ace_valid(vtype_t obj_type
, zfs_acl_t
*aclp
, uint16_t type
, uint16_t iflags
)
539 * first check type of entry
542 if (!zfs_acl_valid_ace_type(type
, iflags
))
546 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
547 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
548 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
549 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
550 if (aclp
->z_version
< ZFS_ACL_VERSION_FUID
)
552 aclp
->z_hints
|= ZFS_ACL_OBJ_ACE
;
556 * next check inheritance level flags
559 if (obj_type
== VDIR
&&
560 (iflags
& (ACE_FILE_INHERIT_ACE
|ACE_DIRECTORY_INHERIT_ACE
)))
561 aclp
->z_hints
|= ZFS_INHERIT_ACE
;
563 if (iflags
& (ACE_INHERIT_ONLY_ACE
|ACE_NO_PROPAGATE_INHERIT_ACE
)) {
564 if ((iflags
& (ACE_FILE_INHERIT_ACE
|
565 ACE_DIRECTORY_INHERIT_ACE
)) == 0) {
574 zfs_acl_next_ace(zfs_acl_t
*aclp
, void *start
, uint64_t *who
,
575 uint32_t *access_mask
, uint16_t *iflags
, uint16_t *type
)
577 zfs_acl_node_t
*aclnode
;
582 aclnode
= list_head(&aclp
->z_acl
);
586 aclp
->z_next_ace
= aclnode
->z_acldata
;
587 aclp
->z_curr_node
= aclnode
;
588 aclnode
->z_ace_idx
= 0;
591 aclnode
= aclp
->z_curr_node
;
596 if (aclnode
->z_ace_idx
>= aclnode
->z_ace_count
) {
597 aclnode
= list_next(&aclp
->z_acl
, aclnode
);
601 aclp
->z_curr_node
= aclnode
;
602 aclnode
->z_ace_idx
= 0;
603 aclp
->z_next_ace
= aclnode
->z_acldata
;
607 if (aclnode
->z_ace_idx
< aclnode
->z_ace_count
) {
608 void *acep
= aclp
->z_next_ace
;
612 * Make sure we don't overstep our bounds
614 ace_size
= aclp
->z_ops
.ace_size(acep
);
616 if (((caddr_t
)acep
+ ace_size
) >
617 ((caddr_t
)aclnode
->z_acldata
+ aclnode
->z_size
)) {
621 *iflags
= aclp
->z_ops
.ace_flags_get(acep
);
622 *type
= aclp
->z_ops
.ace_type_get(acep
);
623 *access_mask
= aclp
->z_ops
.ace_mask_get(acep
);
624 *who
= aclp
->z_ops
.ace_who_get(acep
);
625 aclp
->z_next_ace
= (caddr_t
)aclp
->z_next_ace
+ ace_size
;
626 aclnode
->z_ace_idx
++;
628 return ((void *)acep
);
635 zfs_ace_walk(void *datap
, uint64_t cookie
, int aclcnt
,
636 uint16_t *flags
, uint16_t *type
, uint32_t *mask
)
638 zfs_acl_t
*aclp
= datap
;
639 zfs_ace_hdr_t
*acep
= (zfs_ace_hdr_t
*)(uintptr_t)cookie
;
642 acep
= zfs_acl_next_ace(aclp
, acep
, &who
, mask
,
644 return ((uint64_t)(uintptr_t)acep
);
647 static zfs_acl_node_t
*
648 zfs_acl_curr_node(zfs_acl_t
*aclp
)
650 ASSERT(aclp
->z_curr_node
);
651 return (aclp
->z_curr_node
);
655 * Copy ACE to internal ZFS format.
656 * While processing the ACL each ACE will be validated for correctness.
657 * ACE FUIDs will be created later.
660 zfs_copy_ace_2_fuid(zfsvfs_t
*zfsvfs
, vtype_t obj_type
, zfs_acl_t
*aclp
,
661 void *datap
, zfs_ace_t
*z_acl
, uint64_t aclcnt
, size_t *size
,
662 zfs_fuid_info_t
**fuidp
, cred_t
*cr
)
666 zfs_ace_t
*aceptr
= z_acl
;
668 zfs_object_ace_t
*zobjacep
;
669 ace_object_t
*aceobjp
;
671 for (i
= 0; i
!= aclcnt
; i
++) {
672 aceptr
->z_hdr
.z_access_mask
= acep
->a_access_mask
;
673 aceptr
->z_hdr
.z_flags
= acep
->a_flags
;
674 aceptr
->z_hdr
.z_type
= acep
->a_type
;
675 entry_type
= aceptr
->z_hdr
.z_flags
& ACE_TYPE_FLAGS
;
676 if (entry_type
!= ACE_OWNER
&& entry_type
!= OWNING_GROUP
&&
677 entry_type
!= ACE_EVERYONE
) {
678 aceptr
->z_fuid
= zfs_fuid_create(zfsvfs
, acep
->a_who
,
679 cr
, (entry_type
== 0) ?
680 ZFS_ACE_USER
: ZFS_ACE_GROUP
, fuidp
);
684 * Make sure ACE is valid
686 if (zfs_ace_valid(obj_type
, aclp
, aceptr
->z_hdr
.z_type
,
687 aceptr
->z_hdr
.z_flags
) != B_TRUE
)
688 return (SET_ERROR(EINVAL
));
690 switch (acep
->a_type
) {
691 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
692 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
693 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
694 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
695 zobjacep
= (zfs_object_ace_t
*)aceptr
;
696 aceobjp
= (ace_object_t
*)acep
;
698 bcopy(aceobjp
->a_obj_type
, zobjacep
->z_object_type
,
699 sizeof (aceobjp
->a_obj_type
));
700 bcopy(aceobjp
->a_inherit_obj_type
,
701 zobjacep
->z_inherit_type
,
702 sizeof (aceobjp
->a_inherit_obj_type
));
703 acep
= (ace_t
*)((caddr_t
)acep
+ sizeof (ace_object_t
));
706 acep
= (ace_t
*)((caddr_t
)acep
+ sizeof (ace_t
));
709 aceptr
= (zfs_ace_t
*)((caddr_t
)aceptr
+
710 aclp
->z_ops
.ace_size(aceptr
));
713 *size
= (caddr_t
)aceptr
- (caddr_t
)z_acl
;
719 * Copy ZFS ACEs to fixed size ace_t layout
722 zfs_copy_fuid_2_ace(zfsvfs_t
*zfsvfs
, zfs_acl_t
*aclp
, cred_t
*cr
,
723 void *datap
, int filter
)
726 uint32_t access_mask
;
727 uint16_t iflags
, type
;
728 zfs_ace_hdr_t
*zacep
= NULL
;
730 ace_object_t
*objacep
;
731 zfs_object_ace_t
*zobjacep
;
735 while (zacep
= zfs_acl_next_ace(aclp
, zacep
,
736 &who
, &access_mask
, &iflags
, &type
)) {
739 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
740 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
741 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
742 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
746 zobjacep
= (zfs_object_ace_t
*)zacep
;
747 objacep
= (ace_object_t
*)acep
;
748 bcopy(zobjacep
->z_object_type
,
750 sizeof (zobjacep
->z_object_type
));
751 bcopy(zobjacep
->z_inherit_type
,
752 objacep
->a_inherit_obj_type
,
753 sizeof (zobjacep
->z_inherit_type
));
754 ace_size
= sizeof (ace_object_t
);
757 ace_size
= sizeof (ace_t
);
761 entry_type
= (iflags
& ACE_TYPE_FLAGS
);
762 if ((entry_type
!= ACE_OWNER
&&
763 entry_type
!= OWNING_GROUP
&&
764 entry_type
!= ACE_EVERYONE
)) {
765 acep
->a_who
= zfs_fuid_map_id(zfsvfs
, who
,
766 cr
, (entry_type
& ACE_IDENTIFIER_GROUP
) ?
767 ZFS_ACE_GROUP
: ZFS_ACE_USER
);
769 acep
->a_who
= (uid_t
)(int64_t)who
;
771 acep
->a_access_mask
= access_mask
;
772 acep
->a_flags
= iflags
;
774 acep
= (ace_t
*)((caddr_t
)acep
+ ace_size
);
779 zfs_copy_ace_2_oldace(vtype_t obj_type
, zfs_acl_t
*aclp
, ace_t
*acep
,
780 zfs_oldace_t
*z_acl
, int aclcnt
, size_t *size
)
783 zfs_oldace_t
*aceptr
= z_acl
;
785 for (i
= 0; i
!= aclcnt
; i
++, aceptr
++) {
786 aceptr
->z_access_mask
= acep
[i
].a_access_mask
;
787 aceptr
->z_type
= acep
[i
].a_type
;
788 aceptr
->z_flags
= acep
[i
].a_flags
;
789 aceptr
->z_fuid
= acep
[i
].a_who
;
791 * Make sure ACE is valid
793 if (zfs_ace_valid(obj_type
, aclp
, aceptr
->z_type
,
794 aceptr
->z_flags
) != B_TRUE
)
795 return (SET_ERROR(EINVAL
));
797 *size
= (caddr_t
)aceptr
- (caddr_t
)z_acl
;
802 * convert old ACL format to new
805 zfs_acl_xform(znode_t
*zp
, zfs_acl_t
*aclp
, cred_t
*cr
)
807 zfs_oldace_t
*oldaclp
;
809 uint16_t type
, iflags
;
810 uint32_t access_mask
;
813 zfs_acl_node_t
*newaclnode
;
815 ASSERT(aclp
->z_version
== ZFS_ACL_VERSION_INITIAL
);
817 * First create the ACE in a contiguous piece of memory
818 * for zfs_copy_ace_2_fuid().
820 * We only convert an ACL once, so this won't happen
823 oldaclp
= kmem_alloc(sizeof (zfs_oldace_t
) * aclp
->z_acl_count
,
826 while (cookie
= zfs_acl_next_ace(aclp
, cookie
, &who
,
827 &access_mask
, &iflags
, &type
)) {
828 oldaclp
[i
].z_flags
= iflags
;
829 oldaclp
[i
].z_type
= type
;
830 oldaclp
[i
].z_fuid
= who
;
831 oldaclp
[i
++].z_access_mask
= access_mask
;
834 newaclnode
= zfs_acl_node_alloc(aclp
->z_acl_count
*
835 sizeof (zfs_object_ace_t
));
836 aclp
->z_ops
= zfs_acl_fuid_ops
;
837 VERIFY(zfs_copy_ace_2_fuid(zp
->z_zfsvfs
, ZTOV(zp
)->v_type
, aclp
,
838 oldaclp
, newaclnode
->z_acldata
, aclp
->z_acl_count
,
839 &newaclnode
->z_size
, NULL
, cr
) == 0);
840 newaclnode
->z_ace_count
= aclp
->z_acl_count
;
841 aclp
->z_version
= ZFS_ACL_VERSION
;
842 kmem_free(oldaclp
, aclp
->z_acl_count
* sizeof (zfs_oldace_t
));
845 * Release all previous ACL nodes
848 zfs_acl_release_nodes(aclp
);
850 list_insert_head(&aclp
->z_acl
, newaclnode
);
852 aclp
->z_acl_bytes
= newaclnode
->z_size
;
853 aclp
->z_acl_count
= newaclnode
->z_ace_count
;
858 * Convert unix access mask to v4 access mask
861 zfs_unix_to_v4(uint32_t access_mask
)
863 uint32_t new_mask
= 0;
865 if (access_mask
& S_IXOTH
)
866 new_mask
|= ACE_EXECUTE
;
867 if (access_mask
& S_IWOTH
)
868 new_mask
|= ACE_WRITE_DATA
;
869 if (access_mask
& S_IROTH
)
870 new_mask
|= ACE_READ_DATA
;
875 zfs_set_ace(zfs_acl_t
*aclp
, void *acep
, uint32_t access_mask
,
876 uint16_t access_type
, uint64_t fuid
, uint16_t entry_type
)
878 uint16_t type
= entry_type
& ACE_TYPE_FLAGS
;
880 aclp
->z_ops
.ace_mask_set(acep
, access_mask
);
881 aclp
->z_ops
.ace_type_set(acep
, access_type
);
882 aclp
->z_ops
.ace_flags_set(acep
, entry_type
);
883 if ((type
!= ACE_OWNER
&& type
!= OWNING_GROUP
&&
884 type
!= ACE_EVERYONE
))
885 aclp
->z_ops
.ace_who_set(acep
, fuid
);
889 * Determine mode of file based on ACL.
892 zfs_mode_compute(uint64_t fmode
, zfs_acl_t
*aclp
,
893 uint64_t *pflags
, uint64_t fuid
, uint64_t fgid
)
898 zfs_ace_hdr_t
*acep
= NULL
;
900 uint16_t iflags
, type
;
901 uint32_t access_mask
;
902 boolean_t an_exec_denied
= B_FALSE
;
904 mode
= (fmode
& (S_IFMT
| S_ISUID
| S_ISGID
| S_ISVTX
));
906 while (acep
= zfs_acl_next_ace(aclp
, acep
, &who
,
907 &access_mask
, &iflags
, &type
)) {
909 if (!zfs_acl_valid_ace_type(type
, iflags
))
912 entry_type
= (iflags
& ACE_TYPE_FLAGS
);
915 * Skip over any inherit_only ACEs
917 if (iflags
& ACE_INHERIT_ONLY_ACE
)
920 if (entry_type
== ACE_OWNER
|| (entry_type
== 0 &&
922 if ((access_mask
& ACE_READ_DATA
) &&
923 (!(seen
& S_IRUSR
))) {
929 if ((access_mask
& ACE_WRITE_DATA
) &&
930 (!(seen
& S_IWUSR
))) {
936 if ((access_mask
& ACE_EXECUTE
) &&
937 (!(seen
& S_IXUSR
))) {
943 } else if (entry_type
== OWNING_GROUP
||
944 (entry_type
== ACE_IDENTIFIER_GROUP
&& who
== fgid
)) {
945 if ((access_mask
& ACE_READ_DATA
) &&
946 (!(seen
& S_IRGRP
))) {
952 if ((access_mask
& ACE_WRITE_DATA
) &&
953 (!(seen
& S_IWGRP
))) {
959 if ((access_mask
& ACE_EXECUTE
) &&
960 (!(seen
& S_IXGRP
))) {
966 } else if (entry_type
== ACE_EVERYONE
) {
967 if ((access_mask
& ACE_READ_DATA
)) {
968 if (!(seen
& S_IRUSR
)) {
974 if (!(seen
& S_IRGRP
)) {
980 if (!(seen
& S_IROTH
)) {
987 if ((access_mask
& ACE_WRITE_DATA
)) {
988 if (!(seen
& S_IWUSR
)) {
994 if (!(seen
& S_IWGRP
)) {
1000 if (!(seen
& S_IWOTH
)) {
1002 if (type
== ALLOW
) {
1007 if ((access_mask
& ACE_EXECUTE
)) {
1008 if (!(seen
& S_IXUSR
)) {
1010 if (type
== ALLOW
) {
1014 if (!(seen
& S_IXGRP
)) {
1016 if (type
== ALLOW
) {
1020 if (!(seen
& S_IXOTH
)) {
1022 if (type
== ALLOW
) {
1029 * Only care if this IDENTIFIER_GROUP or
1030 * USER ACE denies execute access to someone,
1031 * mode is not affected
1033 if ((access_mask
& ACE_EXECUTE
) && type
== DENY
)
1034 an_exec_denied
= B_TRUE
;
1039 * Failure to allow is effectively a deny, so execute permission
1040 * is denied if it was never mentioned or if we explicitly
1041 * weren't allowed it.
1043 if (!an_exec_denied
&&
1044 ((seen
& ALL_MODE_EXECS
) != ALL_MODE_EXECS
||
1045 (mode
& ALL_MODE_EXECS
) != ALL_MODE_EXECS
))
1046 an_exec_denied
= B_TRUE
;
1049 *pflags
&= ~ZFS_NO_EXECS_DENIED
;
1051 *pflags
|= ZFS_NO_EXECS_DENIED
;
1057 * Read an external acl object. If the intent is to modify, always
1058 * create a new acl and leave any cached acl in place.
1061 zfs_acl_node_read(znode_t
*zp
, boolean_t have_lock
, zfs_acl_t
**aclpp
,
1062 boolean_t will_modify
)
1067 zfs_acl_node_t
*aclnode
;
1068 zfs_acl_phys_t znode_acl
;
1071 boolean_t drop_lock
= B_FALSE
;
1073 ASSERT(MUTEX_HELD(&zp
->z_acl_lock
));
1075 if (zp
->z_acl_cached
&& !will_modify
) {
1076 *aclpp
= zp
->z_acl_cached
;
1081 * close race where znode could be upgrade while trying to
1082 * read the znode attributes.
1084 * But this could only happen if the file isn't already an SA
1087 if (!zp
->z_is_sa
&& !have_lock
) {
1088 mutex_enter(&zp
->z_lock
);
1091 version
= zfs_znode_acl_version(zp
);
1093 if ((error
= zfs_acl_znode_info(zp
, &aclsize
,
1094 &acl_count
, &znode_acl
)) != 0) {
1098 aclp
= zfs_acl_alloc(version
);
1100 aclp
->z_acl_count
= acl_count
;
1101 aclp
->z_acl_bytes
= aclsize
;
1103 aclnode
= zfs_acl_node_alloc(aclsize
);
1104 aclnode
->z_ace_count
= aclp
->z_acl_count
;
1105 aclnode
->z_size
= aclsize
;
1108 if (znode_acl
.z_acl_extern_obj
) {
1109 error
= dmu_read(zp
->z_zfsvfs
->z_os
,
1110 znode_acl
.z_acl_extern_obj
, 0, aclnode
->z_size
,
1111 aclnode
->z_acldata
, DMU_READ_PREFETCH
);
1113 bcopy(znode_acl
.z_ace_data
, aclnode
->z_acldata
,
1117 error
= sa_lookup(zp
->z_sa_hdl
, SA_ZPL_DACL_ACES(zp
->z_zfsvfs
),
1118 aclnode
->z_acldata
, aclnode
->z_size
);
1123 zfs_acl_node_free(aclnode
);
1124 /* convert checksum errors into IO errors */
1125 if (error
== ECKSUM
)
1126 error
= SET_ERROR(EIO
);
1130 list_insert_head(&aclp
->z_acl
, aclnode
);
1134 zp
->z_acl_cached
= aclp
;
1137 mutex_exit(&zp
->z_lock
);
1143 zfs_acl_data_locator(void **dataptr
, uint32_t *length
, uint32_t buflen
,
1144 boolean_t start
, void *userdata
)
1146 zfs_acl_locator_cb_t
*cb
= (zfs_acl_locator_cb_t
*)userdata
;
1149 cb
->cb_acl_node
= list_head(&cb
->cb_aclp
->z_acl
);
1151 cb
->cb_acl_node
= list_next(&cb
->cb_aclp
->z_acl
,
1154 *dataptr
= cb
->cb_acl_node
->z_acldata
;
1155 *length
= cb
->cb_acl_node
->z_size
;
1159 zfs_acl_chown_setattr(znode_t
*zp
)
1164 ASSERT(MUTEX_HELD(&zp
->z_lock
));
1165 ASSERT(MUTEX_HELD(&zp
->z_acl_lock
));
1167 if ((error
= zfs_acl_node_read(zp
, B_TRUE
, &aclp
, B_FALSE
)) == 0)
1168 zp
->z_mode
= zfs_mode_compute(zp
->z_mode
, aclp
,
1169 &zp
->z_pflags
, zp
->z_uid
, zp
->z_gid
);
1174 * common code for setting ACLs.
1176 * This function is called from zfs_mode_update, zfs_perm_init, and zfs_setacl.
1177 * zfs_setacl passes a non-NULL inherit pointer (ihp) to indicate that it's
1178 * already checked the acl and knows whether to inherit.
1181 zfs_aclset_common(znode_t
*zp
, zfs_acl_t
*aclp
, cred_t
*cr
, dmu_tx_t
*tx
)
1184 zfsvfs_t
*zfsvfs
= zp
->z_zfsvfs
;
1185 dmu_object_type_t otype
;
1186 zfs_acl_locator_cb_t locate
= { 0 };
1188 sa_bulk_attr_t bulk
[5];
1194 mode
= zfs_mode_compute(mode
, aclp
, &zp
->z_pflags
,
1195 zp
->z_uid
, zp
->z_gid
);
1198 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_MODE(zfsvfs
), NULL
,
1199 &mode
, sizeof (mode
));
1200 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_FLAGS(zfsvfs
), NULL
,
1201 &zp
->z_pflags
, sizeof (zp
->z_pflags
));
1202 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_CTIME(zfsvfs
), NULL
,
1203 &ctime
, sizeof (ctime
));
1205 if (zp
->z_acl_cached
) {
1206 zfs_acl_free(zp
->z_acl_cached
);
1207 zp
->z_acl_cached
= NULL
;
1213 if (!zfsvfs
->z_use_fuids
) {
1214 otype
= DMU_OT_OLDACL
;
1216 if ((aclp
->z_version
== ZFS_ACL_VERSION_INITIAL
) &&
1217 (zfsvfs
->z_version
>= ZPL_VERSION_FUID
))
1218 zfs_acl_xform(zp
, aclp
, cr
);
1219 ASSERT(aclp
->z_version
>= ZFS_ACL_VERSION_FUID
);
1224 * Arrgh, we have to handle old on disk format
1225 * as well as newer (preferred) SA format.
1228 if (zp
->z_is_sa
) { /* the easy case, just update the ACL attribute */
1229 locate
.cb_aclp
= aclp
;
1230 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_DACL_ACES(zfsvfs
),
1231 zfs_acl_data_locator
, &locate
, aclp
->z_acl_bytes
);
1232 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_DACL_COUNT(zfsvfs
),
1233 NULL
, &aclp
->z_acl_count
, sizeof (uint64_t));
1234 } else { /* Painful legacy way */
1235 zfs_acl_node_t
*aclnode
;
1237 zfs_acl_phys_t acl_phys
;
1240 if ((error
= sa_lookup(zp
->z_sa_hdl
, SA_ZPL_ZNODE_ACL(zfsvfs
),
1241 &acl_phys
, sizeof (acl_phys
))) != 0)
1244 aoid
= acl_phys
.z_acl_extern_obj
;
1246 if (aclp
->z_acl_bytes
> ZFS_ACE_SPACE
) {
1248 * If ACL was previously external and we are now
1249 * converting to new ACL format then release old
1250 * ACL object and create a new one.
1253 aclp
->z_version
!= acl_phys
.z_acl_version
) {
1254 error
= dmu_object_free(zfsvfs
->z_os
, aoid
, tx
);
1260 aoid
= dmu_object_alloc(zfsvfs
->z_os
,
1261 otype
, aclp
->z_acl_bytes
,
1262 otype
== DMU_OT_ACL
?
1263 DMU_OT_SYSACL
: DMU_OT_NONE
,
1264 otype
== DMU_OT_ACL
?
1265 DN_MAX_BONUSLEN
: 0, tx
);
1267 (void) dmu_object_set_blocksize(zfsvfs
->z_os
,
1268 aoid
, aclp
->z_acl_bytes
, 0, tx
);
1270 acl_phys
.z_acl_extern_obj
= aoid
;
1271 for (aclnode
= list_head(&aclp
->z_acl
); aclnode
;
1272 aclnode
= list_next(&aclp
->z_acl
, aclnode
)) {
1273 if (aclnode
->z_ace_count
== 0)
1275 dmu_write(zfsvfs
->z_os
, aoid
, off
,
1276 aclnode
->z_size
, aclnode
->z_acldata
, tx
);
1277 off
+= aclnode
->z_size
;
1280 void *start
= acl_phys
.z_ace_data
;
1282 * Migrating back embedded?
1284 if (acl_phys
.z_acl_extern_obj
) {
1285 error
= dmu_object_free(zfsvfs
->z_os
,
1286 acl_phys
.z_acl_extern_obj
, tx
);
1289 acl_phys
.z_acl_extern_obj
= 0;
1292 for (aclnode
= list_head(&aclp
->z_acl
); aclnode
;
1293 aclnode
= list_next(&aclp
->z_acl
, aclnode
)) {
1294 if (aclnode
->z_ace_count
== 0)
1296 bcopy(aclnode
->z_acldata
, start
,
1298 start
= (caddr_t
)start
+ aclnode
->z_size
;
1302 * If Old version then swap count/bytes to match old
1303 * layout of znode_acl_phys_t.
1305 if (aclp
->z_version
== ZFS_ACL_VERSION_INITIAL
) {
1306 acl_phys
.z_acl_size
= aclp
->z_acl_count
;
1307 acl_phys
.z_acl_count
= aclp
->z_acl_bytes
;
1309 acl_phys
.z_acl_size
= aclp
->z_acl_bytes
;
1310 acl_phys
.z_acl_count
= aclp
->z_acl_count
;
1312 acl_phys
.z_acl_version
= aclp
->z_version
;
1314 SA_ADD_BULK_ATTR(bulk
, count
, SA_ZPL_ZNODE_ACL(zfsvfs
), NULL
,
1315 &acl_phys
, sizeof (acl_phys
));
1319 * Replace ACL wide bits, but first clear them.
1321 zp
->z_pflags
&= ~ZFS_ACL_WIDE_FLAGS
;
1323 zp
->z_pflags
|= aclp
->z_hints
;
1325 if (ace_trivial_common(aclp
, 0, zfs_ace_walk
) == 0)
1326 zp
->z_pflags
|= ZFS_ACL_TRIVIAL
;
1328 zfs_tstamp_update_setup(zp
, STATE_CHANGED
, NULL
, ctime
, B_TRUE
);
1329 return (sa_bulk_update(zp
->z_sa_hdl
, bulk
, count
, tx
));
1333 zfs_acl_chmod(vtype_t vtype
, uint64_t mode
, boolean_t split
, boolean_t trim
,
1338 int new_count
, new_bytes
;
1341 uint16_t iflags
, type
;
1342 uint32_t access_mask
;
1343 zfs_acl_node_t
*newnode
;
1344 size_t abstract_size
= aclp
->z_ops
.ace_abstract_size();
1347 trivial_acl_t masks
;
1349 new_count
= new_bytes
= 0;
1351 isdir
= (vtype
== VDIR
);
1353 acl_trivial_access_masks((mode_t
)mode
, isdir
, &masks
);
1355 newnode
= zfs_acl_node_alloc((abstract_size
* 6) + aclp
->z_acl_bytes
);
1357 zacep
= newnode
->z_acldata
;
1359 zfs_set_ace(aclp
, zacep
, masks
.allow0
, ALLOW
, -1, ACE_OWNER
);
1360 zacep
= (void *)((uintptr_t)zacep
+ abstract_size
);
1362 new_bytes
+= abstract_size
;
1365 zfs_set_ace(aclp
, zacep
, masks
.deny1
, DENY
, -1, ACE_OWNER
);
1366 zacep
= (void *)((uintptr_t)zacep
+ abstract_size
);
1368 new_bytes
+= abstract_size
;
1371 zfs_set_ace(aclp
, zacep
, masks
.deny2
, DENY
, -1, OWNING_GROUP
);
1372 zacep
= (void *)((uintptr_t)zacep
+ abstract_size
);
1374 new_bytes
+= abstract_size
;
1377 while (acep
= zfs_acl_next_ace(aclp
, acep
, &who
, &access_mask
,
1379 entry_type
= (iflags
& ACE_TYPE_FLAGS
);
1381 * ACEs used to represent the file mode may be divided
1382 * into an equivalent pair of inherit-only and regular
1383 * ACEs, if they are inheritable.
1384 * Skip regular ACEs, which are replaced by the new mode.
1386 if (split
&& (entry_type
== ACE_OWNER
||
1387 entry_type
== OWNING_GROUP
||
1388 entry_type
== ACE_EVERYONE
)) {
1389 if (!isdir
|| !(iflags
&
1390 (ACE_FILE_INHERIT_ACE
|ACE_DIRECTORY_INHERIT_ACE
)))
1393 * We preserve owner@, group@, or @everyone
1394 * permissions, if they are inheritable, by
1395 * copying them to inherit_only ACEs. This
1396 * prevents inheritable permissions from being
1397 * altered along with the file mode.
1399 iflags
|= ACE_INHERIT_ONLY_ACE
;
1403 * If this ACL has any inheritable ACEs, mark that in
1404 * the hints (which are later masked into the pflags)
1405 * so create knows to do inheritance.
1407 if (isdir
&& (iflags
&
1408 (ACE_FILE_INHERIT_ACE
|ACE_DIRECTORY_INHERIT_ACE
)))
1409 aclp
->z_hints
|= ZFS_INHERIT_ACE
;
1411 if ((type
!= ALLOW
&& type
!= DENY
) ||
1412 (iflags
& ACE_INHERIT_ONLY_ACE
)) {
1414 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
1415 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
1416 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
1417 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
1418 aclp
->z_hints
|= ZFS_ACL_OBJ_ACE
;
1423 * Limit permissions granted by ACEs to be no greater
1424 * than permissions of the requested group mode.
1425 * Applies when the "aclmode" property is set to
1428 if ((type
== ALLOW
) && trim
)
1429 access_mask
&= masks
.group
;
1431 zfs_set_ace(aclp
, zacep
, access_mask
, type
, who
, iflags
);
1432 ace_size
= aclp
->z_ops
.ace_size(acep
);
1433 zacep
= (void *)((uintptr_t)zacep
+ ace_size
);
1435 new_bytes
+= ace_size
;
1437 zfs_set_ace(aclp
, zacep
, masks
.owner
, ALLOW
, -1, ACE_OWNER
);
1438 zacep
= (void *)((uintptr_t)zacep
+ abstract_size
);
1439 zfs_set_ace(aclp
, zacep
, masks
.group
, ALLOW
, -1, OWNING_GROUP
);
1440 zacep
= (void *)((uintptr_t)zacep
+ abstract_size
);
1441 zfs_set_ace(aclp
, zacep
, masks
.everyone
, ALLOW
, -1, ACE_EVERYONE
);
1444 new_bytes
+= abstract_size
* 3;
1445 zfs_acl_release_nodes(aclp
);
1446 aclp
->z_acl_count
= new_count
;
1447 aclp
->z_acl_bytes
= new_bytes
;
1448 newnode
->z_ace_count
= new_count
;
1449 newnode
->z_size
= new_bytes
;
1450 list_insert_tail(&aclp
->z_acl
, newnode
);
1454 zfs_acl_chmod_setattr(znode_t
*zp
, zfs_acl_t
**aclp
, uint64_t mode
)
1458 mutex_enter(&zp
->z_acl_lock
);
1459 mutex_enter(&zp
->z_lock
);
1460 if (zp
->z_zfsvfs
->z_acl_mode
== ZFS_ACL_DISCARD
)
1461 *aclp
= zfs_acl_alloc(zfs_acl_version_zp(zp
));
1463 error
= zfs_acl_node_read(zp
, B_TRUE
, aclp
, B_TRUE
);
1466 (*aclp
)->z_hints
= zp
->z_pflags
& V4_ACL_WIDE_FLAGS
;
1467 zfs_acl_chmod(ZTOV(zp
)->v_type
, mode
, B_TRUE
,
1468 (zp
->z_zfsvfs
->z_acl_mode
== ZFS_ACL_GROUPMASK
), *aclp
);
1470 mutex_exit(&zp
->z_lock
);
1471 mutex_exit(&zp
->z_acl_lock
);
1477 * Should ACE be inherited?
1480 zfs_ace_can_use(vtype_t vtype
, uint16_t acep_flags
)
1482 int iflags
= (acep_flags
& 0xf);
1484 if ((vtype
== VDIR
) && (iflags
& ACE_DIRECTORY_INHERIT_ACE
))
1486 else if (iflags
& ACE_FILE_INHERIT_ACE
)
1487 return (!((vtype
== VDIR
) &&
1488 (iflags
& ACE_NO_PROPAGATE_INHERIT_ACE
)));
1493 * inherit inheritable ACEs from parent
1496 zfs_acl_inherit(zfsvfs_t
*zfsvfs
, vtype_t vtype
, zfs_acl_t
*paclp
,
1501 zfs_acl_node_t
*aclnode
;
1502 zfs_acl_t
*aclp
= NULL
;
1504 uint32_t access_mask
;
1505 uint16_t iflags
, newflags
, type
;
1507 void *data1
, *data2
;
1508 size_t data1sz
, data2sz
;
1510 boolean_t isdir
= (vtype
== VDIR
);
1512 aclp
= zfs_acl_alloc(paclp
->z_version
);
1513 aclinherit
= zfsvfs
->z_acl_inherit
;
1514 if (aclinherit
== ZFS_ACL_DISCARD
|| vtype
== VLNK
)
1517 while (pacep
= zfs_acl_next_ace(paclp
, pacep
, &who
,
1518 &access_mask
, &iflags
, &type
)) {
1521 * don't inherit bogus ACEs
1523 if (!zfs_acl_valid_ace_type(type
, iflags
))
1527 * Check if ACE is inheritable by this vnode
1529 if ((aclinherit
== ZFS_ACL_NOALLOW
&& type
== ALLOW
) ||
1530 !zfs_ace_can_use(vtype
, iflags
))
1534 * Strip inherited execute permission from file if
1537 if (aclinherit
== ZFS_ACL_PASSTHROUGH_X
&& type
== ALLOW
&&
1538 !isdir
&& ((mode
& (S_IXUSR
|S_IXGRP
|S_IXOTH
)) == 0)) {
1539 access_mask
&= ~ACE_EXECUTE
;
1543 * Strip write_acl and write_owner from permissions
1544 * when inheriting an ACE
1546 if (aclinherit
== ZFS_ACL_RESTRICTED
&& type
== ALLOW
) {
1547 access_mask
&= ~RESTRICTED_CLEAR
;
1550 ace_size
= aclp
->z_ops
.ace_size(pacep
);
1551 aclnode
= zfs_acl_node_alloc(ace_size
);
1552 list_insert_tail(&aclp
->z_acl
, aclnode
);
1553 acep
= aclnode
->z_acldata
;
1555 zfs_set_ace(aclp
, acep
, access_mask
, type
,
1556 who
, iflags
|ACE_INHERITED_ACE
);
1559 * Copy special opaque data if any
1561 if ((data1sz
= paclp
->z_ops
.ace_data(pacep
, &data1
)) != 0) {
1562 VERIFY((data2sz
= aclp
->z_ops
.ace_data(acep
,
1563 &data2
)) == data1sz
);
1564 bcopy(data1
, data2
, data2sz
);
1567 aclp
->z_acl_count
++;
1568 aclnode
->z_ace_count
++;
1569 aclp
->z_acl_bytes
+= aclnode
->z_size
;
1570 newflags
= aclp
->z_ops
.ace_flags_get(acep
);
1573 * If ACE is not to be inherited further, or if the vnode is
1574 * not a directory, remove all inheritance flags
1576 if (!isdir
|| (iflags
& ACE_NO_PROPAGATE_INHERIT_ACE
)) {
1577 newflags
&= ~ALL_INHERIT
;
1578 aclp
->z_ops
.ace_flags_set(acep
,
1579 newflags
|ACE_INHERITED_ACE
);
1584 * This directory has an inheritable ACE
1586 aclp
->z_hints
|= ZFS_INHERIT_ACE
;
1589 * If only FILE_INHERIT is set then turn on
1592 if ((iflags
& (ACE_FILE_INHERIT_ACE
|
1593 ACE_DIRECTORY_INHERIT_ACE
)) == ACE_FILE_INHERIT_ACE
) {
1594 newflags
|= ACE_INHERIT_ONLY_ACE
;
1595 aclp
->z_ops
.ace_flags_set(acep
,
1596 newflags
|ACE_INHERITED_ACE
);
1598 newflags
&= ~ACE_INHERIT_ONLY_ACE
;
1599 aclp
->z_ops
.ace_flags_set(acep
,
1600 newflags
|ACE_INHERITED_ACE
);
1608 * Create file system object initial permissions
1609 * including inheritable ACEs.
1610 * Also, create FUIDs for owner and group.
1613 zfs_acl_ids_create(znode_t
*dzp
, int flag
, vattr_t
*vap
, cred_t
*cr
,
1614 vsecattr_t
*vsecp
, zfs_acl_ids_t
*acl_ids
)
1617 zfsvfs_t
*zfsvfs
= dzp
->z_zfsvfs
;
1620 boolean_t trim
= B_FALSE
;
1621 boolean_t inherited
= B_FALSE
;
1623 bzero(acl_ids
, sizeof (zfs_acl_ids_t
));
1624 acl_ids
->z_mode
= MAKEIMODE(vap
->va_type
, vap
->va_mode
);
1627 if ((error
= zfs_vsec_2_aclp(zfsvfs
, vap
->va_type
, vsecp
, cr
,
1628 &acl_ids
->z_fuidp
, &acl_ids
->z_aclp
)) != 0)
1631 * Determine uid and gid.
1633 if ((flag
& IS_ROOT_NODE
) || zfsvfs
->z_replay
||
1634 ((flag
& IS_XATTR
) && (vap
->va_type
== VDIR
))) {
1635 acl_ids
->z_fuid
= zfs_fuid_create(zfsvfs
,
1636 (uint64_t)vap
->va_uid
, cr
,
1637 ZFS_OWNER
, &acl_ids
->z_fuidp
);
1638 acl_ids
->z_fgid
= zfs_fuid_create(zfsvfs
,
1639 (uint64_t)vap
->va_gid
, cr
,
1640 ZFS_GROUP
, &acl_ids
->z_fuidp
);
1643 acl_ids
->z_fuid
= zfs_fuid_create_cred(zfsvfs
, ZFS_OWNER
,
1644 cr
, &acl_ids
->z_fuidp
);
1645 acl_ids
->z_fgid
= 0;
1646 if (vap
->va_mask
& AT_GID
) {
1647 acl_ids
->z_fgid
= zfs_fuid_create(zfsvfs
,
1648 (uint64_t)vap
->va_gid
,
1649 cr
, ZFS_GROUP
, &acl_ids
->z_fuidp
);
1651 if (acl_ids
->z_fgid
!= dzp
->z_gid
&&
1652 !groupmember(vap
->va_gid
, cr
) &&
1653 secpolicy_vnode_create_gid(cr
) != 0)
1654 acl_ids
->z_fgid
= 0;
1656 if (acl_ids
->z_fgid
== 0) {
1657 if (dzp
->z_mode
& S_ISGID
) {
1661 acl_ids
->z_fgid
= dzp
->z_gid
;
1662 gid
= zfs_fuid_map_id(zfsvfs
, acl_ids
->z_fgid
,
1665 if (zfsvfs
->z_use_fuids
&&
1666 IS_EPHEMERAL(acl_ids
->z_fgid
)) {
1667 domain
= zfs_fuid_idx_domain(
1668 &zfsvfs
->z_fuid_idx
,
1669 FUID_INDEX(acl_ids
->z_fgid
));
1670 rid
= FUID_RID(acl_ids
->z_fgid
);
1671 zfs_fuid_node_add(&acl_ids
->z_fuidp
,
1673 FUID_INDEX(acl_ids
->z_fgid
),
1674 acl_ids
->z_fgid
, ZFS_GROUP
);
1677 acl_ids
->z_fgid
= zfs_fuid_create_cred(zfsvfs
,
1678 ZFS_GROUP
, cr
, &acl_ids
->z_fuidp
);
1685 * If we're creating a directory, and the parent directory has the
1686 * set-GID bit set, set in on the new directory.
1687 * Otherwise, if the user is neither privileged nor a member of the
1688 * file's new group, clear the file's set-GID bit.
1691 if (!(flag
& IS_ROOT_NODE
) && (dzp
->z_mode
& S_ISGID
) &&
1692 (vap
->va_type
== VDIR
)) {
1693 acl_ids
->z_mode
|= S_ISGID
;
1695 if ((acl_ids
->z_mode
& S_ISGID
) &&
1696 secpolicy_vnode_setids_setgids(cr
, gid
) != 0)
1697 acl_ids
->z_mode
&= ~S_ISGID
;
1700 if (acl_ids
->z_aclp
== NULL
) {
1701 mutex_enter(&dzp
->z_acl_lock
);
1702 mutex_enter(&dzp
->z_lock
);
1703 if (!(flag
& IS_ROOT_NODE
) &&
1704 (dzp
->z_pflags
& ZFS_INHERIT_ACE
) &&
1705 !(dzp
->z_pflags
& ZFS_XATTR
)) {
1706 VERIFY(0 == zfs_acl_node_read(dzp
, B_TRUE
,
1708 acl_ids
->z_aclp
= zfs_acl_inherit(zfsvfs
,
1709 vap
->va_type
, paclp
, acl_ids
->z_mode
);
1713 zfs_acl_alloc(zfs_acl_version_zp(dzp
));
1714 acl_ids
->z_aclp
->z_hints
|= ZFS_ACL_TRIVIAL
;
1716 mutex_exit(&dzp
->z_lock
);
1717 mutex_exit(&dzp
->z_acl_lock
);
1719 if (vap
->va_type
== VDIR
)
1720 acl_ids
->z_aclp
->z_hints
|= ZFS_ACL_AUTO_INHERIT
;
1722 if (zfsvfs
->z_acl_mode
== ZFS_ACL_GROUPMASK
&&
1723 zfsvfs
->z_acl_inherit
!= ZFS_ACL_PASSTHROUGH
&&
1724 zfsvfs
->z_acl_inherit
!= ZFS_ACL_PASSTHROUGH_X
)
1726 zfs_acl_chmod(vap
->va_type
, acl_ids
->z_mode
, B_FALSE
, trim
,
1730 if (inherited
|| vsecp
) {
1731 acl_ids
->z_mode
= zfs_mode_compute(acl_ids
->z_mode
,
1732 acl_ids
->z_aclp
, &acl_ids
->z_aclp
->z_hints
,
1733 acl_ids
->z_fuid
, acl_ids
->z_fgid
);
1734 if (ace_trivial_common(acl_ids
->z_aclp
, 0, zfs_ace_walk
) == 0)
1735 acl_ids
->z_aclp
->z_hints
|= ZFS_ACL_TRIVIAL
;
1742 * Free ACL and fuid_infop, but not the acl_ids structure
1745 zfs_acl_ids_free(zfs_acl_ids_t
*acl_ids
)
1747 if (acl_ids
->z_aclp
)
1748 zfs_acl_free(acl_ids
->z_aclp
);
1749 if (acl_ids
->z_fuidp
)
1750 zfs_fuid_info_free(acl_ids
->z_fuidp
);
1751 acl_ids
->z_aclp
= NULL
;
1752 acl_ids
->z_fuidp
= NULL
;
1756 zfs_acl_ids_overquota(zfsvfs_t
*zfsvfs
, zfs_acl_ids_t
*acl_ids
)
1758 return (zfs_fuid_overquota(zfsvfs
, B_FALSE
, acl_ids
->z_fuid
) ||
1759 zfs_fuid_overquota(zfsvfs
, B_TRUE
, acl_ids
->z_fgid
));
1763 * Retrieve a file's ACL
1766 zfs_getacl(znode_t
*zp
, vsecattr_t
*vsecp
, boolean_t skipaclchk
, cred_t
*cr
)
1774 mask
= vsecp
->vsa_mask
& (VSA_ACE
| VSA_ACECNT
|
1775 VSA_ACE_ACLFLAGS
| VSA_ACE_ALLTYPES
);
1778 return (SET_ERROR(ENOSYS
));
1780 if (error
= zfs_zaccess(zp
, ACE_READ_ACL
, 0, skipaclchk
, cr
))
1783 mutex_enter(&zp
->z_acl_lock
);
1785 error
= zfs_acl_node_read(zp
, B_FALSE
, &aclp
, B_FALSE
);
1787 mutex_exit(&zp
->z_acl_lock
);
1792 * Scan ACL to determine number of ACEs
1794 if ((zp
->z_pflags
& ZFS_ACL_OBJ_ACE
) && !(mask
& VSA_ACE_ALLTYPES
)) {
1797 uint32_t access_mask
;
1798 uint16_t type
, iflags
;
1800 while (zacep
= zfs_acl_next_ace(aclp
, zacep
,
1801 &who
, &access_mask
, &iflags
, &type
)) {
1803 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE
:
1804 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE
:
1805 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE
:
1806 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE
:
1813 vsecp
->vsa_aclcnt
= count
;
1815 count
= (int)aclp
->z_acl_count
;
1817 if (mask
& VSA_ACECNT
) {
1818 vsecp
->vsa_aclcnt
= count
;
1821 if (mask
& VSA_ACE
) {
1824 aclsz
= count
* sizeof (ace_t
) +
1825 sizeof (ace_object_t
) * largeace
;
1827 vsecp
->vsa_aclentp
= kmem_alloc(aclsz
, KM_SLEEP
);
1828 vsecp
->vsa_aclentsz
= aclsz
;
1830 if (aclp
->z_version
== ZFS_ACL_VERSION_FUID
)
1831 zfs_copy_fuid_2_ace(zp
->z_zfsvfs
, aclp
, cr
,
1832 vsecp
->vsa_aclentp
, !(mask
& VSA_ACE_ALLTYPES
));
1834 zfs_acl_node_t
*aclnode
;
1835 void *start
= vsecp
->vsa_aclentp
;
1837 for (aclnode
= list_head(&aclp
->z_acl
); aclnode
;
1838 aclnode
= list_next(&aclp
->z_acl
, aclnode
)) {
1839 bcopy(aclnode
->z_acldata
, start
,
1841 start
= (caddr_t
)start
+ aclnode
->z_size
;
1843 ASSERT((caddr_t
)start
- (caddr_t
)vsecp
->vsa_aclentp
==
1847 if (mask
& VSA_ACE_ACLFLAGS
) {
1848 vsecp
->vsa_aclflags
= 0;
1849 if (zp
->z_pflags
& ZFS_ACL_DEFAULTED
)
1850 vsecp
->vsa_aclflags
|= ACL_DEFAULTED
;
1851 if (zp
->z_pflags
& ZFS_ACL_PROTECTED
)
1852 vsecp
->vsa_aclflags
|= ACL_PROTECTED
;
1853 if (zp
->z_pflags
& ZFS_ACL_AUTO_INHERIT
)
1854 vsecp
->vsa_aclflags
|= ACL_AUTO_INHERIT
;
1857 mutex_exit(&zp
->z_acl_lock
);
1863 zfs_vsec_2_aclp(zfsvfs_t
*zfsvfs
, vtype_t obj_type
,
1864 vsecattr_t
*vsecp
, cred_t
*cr
, zfs_fuid_info_t
**fuidp
, zfs_acl_t
**zaclp
)
1867 zfs_acl_node_t
*aclnode
;
1868 int aclcnt
= vsecp
->vsa_aclcnt
;
1871 if (vsecp
->vsa_aclcnt
> MAX_ACL_ENTRIES
|| vsecp
->vsa_aclcnt
<= 0)
1872 return (SET_ERROR(EINVAL
));
1874 aclp
= zfs_acl_alloc(zfs_acl_version(zfsvfs
->z_version
));
1877 aclnode
= zfs_acl_node_alloc(aclcnt
* sizeof (zfs_object_ace_t
));
1878 if (aclp
->z_version
== ZFS_ACL_VERSION_INITIAL
) {
1879 if ((error
= zfs_copy_ace_2_oldace(obj_type
, aclp
,
1880 (ace_t
*)vsecp
->vsa_aclentp
, aclnode
->z_acldata
,
1881 aclcnt
, &aclnode
->z_size
)) != 0) {
1883 zfs_acl_node_free(aclnode
);
1887 if ((error
= zfs_copy_ace_2_fuid(zfsvfs
, obj_type
, aclp
,
1888 vsecp
->vsa_aclentp
, aclnode
->z_acldata
, aclcnt
,
1889 &aclnode
->z_size
, fuidp
, cr
)) != 0) {
1891 zfs_acl_node_free(aclnode
);
1895 aclp
->z_acl_bytes
= aclnode
->z_size
;
1896 aclnode
->z_ace_count
= aclcnt
;
1897 aclp
->z_acl_count
= aclcnt
;
1898 list_insert_head(&aclp
->z_acl
, aclnode
);
1901 * If flags are being set then add them to z_hints
1903 if (vsecp
->vsa_mask
& VSA_ACE_ACLFLAGS
) {
1904 if (vsecp
->vsa_aclflags
& ACL_PROTECTED
)
1905 aclp
->z_hints
|= ZFS_ACL_PROTECTED
;
1906 if (vsecp
->vsa_aclflags
& ACL_DEFAULTED
)
1907 aclp
->z_hints
|= ZFS_ACL_DEFAULTED
;
1908 if (vsecp
->vsa_aclflags
& ACL_AUTO_INHERIT
)
1909 aclp
->z_hints
|= ZFS_ACL_AUTO_INHERIT
;
1921 zfs_setacl(znode_t
*zp
, vsecattr_t
*vsecp
, boolean_t skipaclchk
, cred_t
*cr
)
1923 zfsvfs_t
*zfsvfs
= zp
->z_zfsvfs
;
1924 zilog_t
*zilog
= zfsvfs
->z_log
;
1925 ulong_t mask
= vsecp
->vsa_mask
& (VSA_ACE
| VSA_ACECNT
);
1929 zfs_fuid_info_t
*fuidp
= NULL
;
1930 boolean_t fuid_dirtied
;
1934 return (SET_ERROR(ENOSYS
));
1936 if (zp
->z_pflags
& ZFS_IMMUTABLE
)
1937 return (SET_ERROR(EPERM
));
1939 if (error
= zfs_zaccess(zp
, ACE_WRITE_ACL
, 0, skipaclchk
, cr
))
1942 error
= zfs_vsec_2_aclp(zfsvfs
, ZTOV(zp
)->v_type
, vsecp
, cr
, &fuidp
,
1948 * If ACL wide flags aren't being set then preserve any
1951 if (!(vsecp
->vsa_mask
& VSA_ACE_ACLFLAGS
)) {
1953 (zp
->z_pflags
& V4_ACL_WIDE_FLAGS
);
1956 mutex_enter(&zp
->z_acl_lock
);
1957 mutex_enter(&zp
->z_lock
);
1959 tx
= dmu_tx_create(zfsvfs
->z_os
);
1961 dmu_tx_hold_sa(tx
, zp
->z_sa_hdl
, B_TRUE
);
1963 fuid_dirtied
= zfsvfs
->z_fuid_dirty
;
1965 zfs_fuid_txhold(zfsvfs
, tx
);
1968 * If old version and ACL won't fit in bonus and we aren't
1969 * upgrading then take out necessary DMU holds
1972 if ((acl_obj
= zfs_external_acl(zp
)) != 0) {
1973 if (zfsvfs
->z_version
>= ZPL_VERSION_FUID
&&
1974 zfs_znode_acl_version(zp
) <= ZFS_ACL_VERSION_INITIAL
) {
1975 dmu_tx_hold_free(tx
, acl_obj
, 0,
1977 dmu_tx_hold_write(tx
, DMU_NEW_OBJECT
, 0,
1980 dmu_tx_hold_write(tx
, acl_obj
, 0, aclp
->z_acl_bytes
);
1982 } else if (!zp
->z_is_sa
&& aclp
->z_acl_bytes
> ZFS_ACE_SPACE
) {
1983 dmu_tx_hold_write(tx
, DMU_NEW_OBJECT
, 0, aclp
->z_acl_bytes
);
1986 zfs_sa_upgrade_txholds(tx
, zp
);
1987 error
= dmu_tx_assign(tx
, TXG_NOWAIT
);
1989 mutex_exit(&zp
->z_acl_lock
);
1990 mutex_exit(&zp
->z_lock
);
1992 if (error
== ERESTART
) {
2002 error
= zfs_aclset_common(zp
, aclp
, cr
, tx
);
2004 ASSERT(zp
->z_acl_cached
== NULL
);
2005 zp
->z_acl_cached
= aclp
;
2008 zfs_fuid_sync(zfsvfs
, tx
);
2010 zfs_log_acl(zilog
, tx
, zp
, vsecp
, fuidp
);
2013 zfs_fuid_info_free(fuidp
);
2016 mutex_exit(&zp
->z_lock
);
2017 mutex_exit(&zp
->z_acl_lock
);
2023 * Check accesses of interest (AoI) against attributes of the dataset
2024 * such as read-only. Returns zero if no AoI conflict with dataset
2025 * attributes, otherwise an appropriate errno is returned.
2028 zfs_zaccess_dataset_check(znode_t
*zp
, uint32_t v4_mode
)
2030 if ((v4_mode
& WRITE_MASK
) &&
2031 (zp
->z_zfsvfs
->z_vfs
->vfs_flag
& VFS_RDONLY
) &&
2032 (!IS_DEVVP(ZTOV(zp
)) ||
2033 (IS_DEVVP(ZTOV(zp
)) && (v4_mode
& WRITE_MASK_ATTRS
)))) {
2034 return (SET_ERROR(EROFS
));
2038 * Intentionally allow ZFS_READONLY through here.
2039 * See zfs_zaccess_common().
2041 if ((v4_mode
& WRITE_MASK_DATA
) &&
2042 (zp
->z_pflags
& ZFS_IMMUTABLE
)) {
2043 return (SET_ERROR(EPERM
));
2046 if ((v4_mode
& (ACE_DELETE
| ACE_DELETE_CHILD
)) &&
2047 (zp
->z_pflags
& ZFS_NOUNLINK
)) {
2048 return (SET_ERROR(EPERM
));
2051 if (((v4_mode
& (ACE_READ_DATA
|ACE_EXECUTE
)) &&
2052 (zp
->z_pflags
& ZFS_AV_QUARANTINED
))) {
2053 return (SET_ERROR(EACCES
));
2060 * The primary usage of this function is to loop through all of the
2061 * ACEs in the znode, determining what accesses of interest (AoI) to
2062 * the caller are allowed or denied. The AoI are expressed as bits in
2063 * the working_mode parameter. As each ACE is processed, bits covered
2064 * by that ACE are removed from the working_mode. This removal
2065 * facilitates two things. The first is that when the working mode is
2066 * empty (= 0), we know we've looked at all the AoI. The second is
2067 * that the ACE interpretation rules don't allow a later ACE to undo
2068 * something granted or denied by an earlier ACE. Removing the
2069 * discovered access or denial enforces this rule. At the end of
2070 * processing the ACEs, all AoI that were found to be denied are
2071 * placed into the working_mode, giving the caller a mask of denied
2072 * accesses. Returns:
2073 * 0 if all AoI granted
2074 * EACCES if the denied mask is non-zero
2075 * other error if abnormal failure (e.g., IO error)
2077 * A secondary usage of the function is to determine if any of the
2078 * AoI are granted. If an ACE grants any access in
2079 * the working_mode, we immediately short circuit out of the function.
2080 * This mode is chosen by setting anyaccess to B_TRUE. The
2081 * working_mode is not a denied access mask upon exit if the function
2082 * is used in this manner.
2085 zfs_zaccess_aces_check(znode_t
*zp
, uint32_t *working_mode
,
2086 boolean_t anyaccess
, cred_t
*cr
)
2088 zfsvfs_t
*zfsvfs
= zp
->z_zfsvfs
;
2091 uid_t uid
= crgetuid(cr
);
2093 uint16_t type
, iflags
;
2094 uint16_t entry_type
;
2095 uint32_t access_mask
;
2096 uint32_t deny_mask
= 0;
2097 zfs_ace_hdr_t
*acep
= NULL
;
2102 zfs_fuid_map_ids(zp
, cr
, &fowner
, &gowner
);
2104 mutex_enter(&zp
->z_acl_lock
);
2106 error
= zfs_acl_node_read(zp
, B_FALSE
, &aclp
, B_FALSE
);
2108 mutex_exit(&zp
->z_acl_lock
);
2112 ASSERT(zp
->z_acl_cached
);
2114 while (acep
= zfs_acl_next_ace(aclp
, acep
, &who
, &access_mask
,
2116 uint32_t mask_matched
;
2118 if (!zfs_acl_valid_ace_type(type
, iflags
))
2121 if (ZTOV(zp
)->v_type
== VDIR
&& (iflags
& ACE_INHERIT_ONLY_ACE
))
2124 /* Skip ACE if it does not affect any AoI */
2125 mask_matched
= (access_mask
& *working_mode
);
2129 entry_type
= (iflags
& ACE_TYPE_FLAGS
);
2133 switch (entry_type
) {
2141 case ACE_IDENTIFIER_GROUP
:
2142 checkit
= zfs_groupmember(zfsvfs
, who
, cr
);
2150 if (entry_type
== 0) {
2153 newid
= zfs_fuid_map_id(zfsvfs
, who
, cr
,
2155 if (newid
!= IDMAP_WK_CREATOR_OWNER_UID
&&
2160 mutex_exit(&zp
->z_acl_lock
);
2161 return (SET_ERROR(EIO
));
2167 DTRACE_PROBE3(zfs__ace__denies
,
2169 zfs_ace_hdr_t
*, acep
,
2170 uint32_t, mask_matched
);
2171 deny_mask
|= mask_matched
;
2173 DTRACE_PROBE3(zfs__ace__allows
,
2175 zfs_ace_hdr_t
*, acep
,
2176 uint32_t, mask_matched
);
2178 mutex_exit(&zp
->z_acl_lock
);
2182 *working_mode
&= ~mask_matched
;
2186 if (*working_mode
== 0)
2190 mutex_exit(&zp
->z_acl_lock
);
2192 /* Put the found 'denies' back on the working mode */
2194 *working_mode
|= deny_mask
;
2195 return (SET_ERROR(EACCES
));
2196 } else if (*working_mode
) {
2204 * Return true if any access whatsoever granted, we don't actually
2205 * care what access is granted.
2208 zfs_has_access(znode_t
*zp
, cred_t
*cr
)
2210 uint32_t have
= ACE_ALL_PERMS
;
2212 if (zfs_zaccess_aces_check(zp
, &have
, B_TRUE
, cr
) != 0) {
2215 owner
= zfs_fuid_map_id(zp
->z_zfsvfs
, zp
->z_uid
, cr
, ZFS_OWNER
);
2216 return (secpolicy_vnode_any_access(cr
, ZTOV(zp
), owner
) == 0);
2222 zfs_zaccess_common(znode_t
*zp
, uint32_t v4_mode
, uint32_t *working_mode
,
2223 boolean_t
*check_privs
, boolean_t skipaclchk
, cred_t
*cr
)
2225 zfsvfs_t
*zfsvfs
= zp
->z_zfsvfs
;
2228 *working_mode
= v4_mode
;
2229 *check_privs
= B_TRUE
;
2232 * Short circuit empty requests
2234 if (v4_mode
== 0 || zfsvfs
->z_replay
) {
2239 if ((err
= zfs_zaccess_dataset_check(zp
, v4_mode
)) != 0) {
2240 *check_privs
= B_FALSE
;
2245 * The caller requested that the ACL check be skipped. This
2246 * would only happen if the caller checked fop_access() with a
2247 * 32 bit ACE mask and already had the appropriate permissions.
2255 * Note: ZFS_READONLY represents the "DOS R/O" attribute.
2256 * When that flag is set, we should behave as if write access
2257 * were not granted by anything in the ACL. In particular:
2258 * We _must_ allow writes after opening the file r/w, then
2259 * setting the DOS R/O attribute, and writing some more.
2260 * (Similar to how you can write after fchmod(fd, 0444).)
2262 * Therefore ZFS_READONLY is ignored in the dataset check
2263 * above, and checked here as if part of the ACL check.
2264 * Also note: DOS R/O is ignored for directories.
2266 if ((v4_mode
& WRITE_MASK_DATA
) &&
2267 (ZTOV(zp
)->v_type
!= VDIR
) &&
2268 (zp
->z_pflags
& ZFS_READONLY
)) {
2269 return (SET_ERROR(EPERM
));
2272 return (zfs_zaccess_aces_check(zp
, working_mode
, B_FALSE
, cr
));
2276 zfs_zaccess_append(znode_t
*zp
, uint32_t *working_mode
, boolean_t
*check_privs
,
2279 if (*working_mode
!= ACE_WRITE_DATA
)
2280 return (SET_ERROR(EACCES
));
2282 return (zfs_zaccess_common(zp
, ACE_APPEND_DATA
, working_mode
,
2283 check_privs
, B_FALSE
, cr
));
2287 zfs_fastaccesschk_execute(znode_t
*zdp
, cred_t
*cr
)
2289 boolean_t owner
= B_FALSE
;
2290 boolean_t groupmbr
= B_FALSE
;
2292 uid_t uid
= crgetuid(cr
);
2295 if (zdp
->z_pflags
& ZFS_AV_QUARANTINED
)
2296 return (SET_ERROR(EACCES
));
2298 is_attr
= ((zdp
->z_pflags
& ZFS_XATTR
) &&
2299 (ZTOV(zdp
)->v_type
== VDIR
));
2304 mutex_enter(&zdp
->z_acl_lock
);
2306 if (zdp
->z_pflags
& ZFS_NO_EXECS_DENIED
) {
2307 mutex_exit(&zdp
->z_acl_lock
);
2311 if (FUID_INDEX(zdp
->z_uid
) != 0 || FUID_INDEX(zdp
->z_gid
) != 0) {
2312 mutex_exit(&zdp
->z_acl_lock
);
2316 if (uid
== zdp
->z_uid
) {
2318 if (zdp
->z_mode
& S_IXUSR
) {
2319 mutex_exit(&zdp
->z_acl_lock
);
2322 mutex_exit(&zdp
->z_acl_lock
);
2326 if (groupmember(zdp
->z_gid
, cr
)) {
2328 if (zdp
->z_mode
& S_IXGRP
) {
2329 mutex_exit(&zdp
->z_acl_lock
);
2332 mutex_exit(&zdp
->z_acl_lock
);
2336 if (!owner
&& !groupmbr
) {
2337 if (zdp
->z_mode
& S_IXOTH
) {
2338 mutex_exit(&zdp
->z_acl_lock
);
2343 mutex_exit(&zdp
->z_acl_lock
);
2346 DTRACE_PROBE(zfs__fastpath__execute__access__miss
);
2347 ZFS_ENTER(zdp
->z_zfsvfs
);
2348 error
= zfs_zaccess(zdp
, ACE_EXECUTE
, 0, B_FALSE
, cr
);
2349 ZFS_EXIT(zdp
->z_zfsvfs
);
2354 * Determine whether Access should be granted/denied.
2356 * The least priv subsytem is always consulted as a basic privilege
2357 * can define any form of access.
2360 zfs_zaccess(znode_t
*zp
, int mode
, int flags
, boolean_t skipaclchk
, cred_t
*cr
)
2362 uint32_t working_mode
;
2365 boolean_t check_privs
;
2367 znode_t
*check_zp
= zp
;
2371 is_attr
= ((zp
->z_pflags
& ZFS_XATTR
) && (ZTOV(zp
)->v_type
== VDIR
));
2374 * If attribute then validate against base file
2379 if ((error
= sa_lookup(zp
->z_sa_hdl
,
2380 SA_ZPL_PARENT(zp
->z_zfsvfs
), &parent
,
2381 sizeof (parent
))) != 0)
2384 if ((error
= zfs_zget(zp
->z_zfsvfs
,
2385 parent
, &xzp
)) != 0) {
2392 * fixup mode to map to xattr perms
2395 if (mode
& (ACE_WRITE_DATA
|ACE_APPEND_DATA
)) {
2396 mode
&= ~(ACE_WRITE_DATA
|ACE_APPEND_DATA
);
2397 mode
|= ACE_WRITE_NAMED_ATTRS
;
2400 if (mode
& (ACE_READ_DATA
|ACE_EXECUTE
)) {
2401 mode
&= ~(ACE_READ_DATA
|ACE_EXECUTE
);
2402 mode
|= ACE_READ_NAMED_ATTRS
;
2406 owner
= zfs_fuid_map_id(zp
->z_zfsvfs
, zp
->z_uid
, cr
, ZFS_OWNER
);
2408 * Map the bits required to the standard vnode flags VREAD|VWRITE|VEXEC
2409 * in needed_bits. Map the bits mapped by working_mode (currently
2410 * missing) in missing_bits.
2411 * Call secpolicy_vnode_access2() with (needed_bits & ~checkmode),
2416 working_mode
= mode
;
2417 if ((working_mode
& (ACE_READ_ACL
|ACE_READ_ATTRIBUTES
)) &&
2418 owner
== crgetuid(cr
))
2419 working_mode
&= ~(ACE_READ_ACL
|ACE_READ_ATTRIBUTES
);
2421 if (working_mode
& (ACE_READ_DATA
|ACE_READ_NAMED_ATTRS
|
2422 ACE_READ_ACL
|ACE_READ_ATTRIBUTES
|ACE_SYNCHRONIZE
))
2423 needed_bits
|= VREAD
;
2424 if (working_mode
& (ACE_WRITE_DATA
|ACE_WRITE_NAMED_ATTRS
|
2425 ACE_APPEND_DATA
|ACE_WRITE_ATTRIBUTES
|ACE_SYNCHRONIZE
))
2426 needed_bits
|= VWRITE
;
2427 if (working_mode
& ACE_EXECUTE
)
2428 needed_bits
|= VEXEC
;
2430 if ((error
= zfs_zaccess_common(check_zp
, mode
, &working_mode
,
2431 &check_privs
, skipaclchk
, cr
)) == 0) {
2434 return (secpolicy_vnode_access2(cr
, ZTOV(zp
), owner
,
2435 needed_bits
, needed_bits
));
2438 if (error
&& !check_privs
) {
2444 if (error
&& (flags
& V_APPEND
)) {
2445 error
= zfs_zaccess_append(zp
, &working_mode
, &check_privs
, cr
);
2448 if (error
&& check_privs
) {
2449 mode_t checkmode
= 0;
2452 * First check for implicit owner permission on
2453 * read_acl/read_attributes
2457 ASSERT(working_mode
!= 0);
2459 if ((working_mode
& (ACE_READ_ACL
|ACE_READ_ATTRIBUTES
) &&
2460 owner
== crgetuid(cr
)))
2461 working_mode
&= ~(ACE_READ_ACL
|ACE_READ_ATTRIBUTES
);
2463 if (working_mode
& (ACE_READ_DATA
|ACE_READ_NAMED_ATTRS
|
2464 ACE_READ_ACL
|ACE_READ_ATTRIBUTES
|ACE_SYNCHRONIZE
))
2466 if (working_mode
& (ACE_WRITE_DATA
|ACE_WRITE_NAMED_ATTRS
|
2467 ACE_APPEND_DATA
|ACE_WRITE_ATTRIBUTES
|ACE_SYNCHRONIZE
))
2468 checkmode
|= VWRITE
;
2469 if (working_mode
& ACE_EXECUTE
)
2472 error
= secpolicy_vnode_access2(cr
, ZTOV(check_zp
), owner
,
2473 needed_bits
& ~checkmode
, needed_bits
);
2475 if (error
== 0 && (working_mode
& ACE_WRITE_OWNER
))
2476 error
= secpolicy_vnode_chown(cr
, owner
);
2477 if (error
== 0 && (working_mode
& ACE_WRITE_ACL
))
2478 error
= secpolicy_vnode_setdac(cr
, owner
);
2480 if (error
== 0 && (working_mode
&
2481 (ACE_DELETE
|ACE_DELETE_CHILD
)))
2482 error
= secpolicy_vnode_remove(cr
);
2484 if (error
== 0 && (working_mode
& ACE_SYNCHRONIZE
)) {
2485 error
= secpolicy_vnode_chown(cr
, owner
);
2489 * See if any bits other than those already checked
2490 * for are still present. If so then return EACCES
2492 if (working_mode
& ~(ZFS_CHECKED_MASKS
)) {
2493 error
= SET_ERROR(EACCES
);
2496 } else if (error
== 0) {
2497 error
= secpolicy_vnode_access2(cr
, ZTOV(zp
), owner
,
2498 needed_bits
, needed_bits
);
2509 * Translate traditional unix VREAD/VWRITE/VEXEC mode into
2510 * native ACL format and call zfs_zaccess()
2513 zfs_zaccess_rwx(znode_t
*zp
, mode_t mode
, int flags
, cred_t
*cr
)
2515 return (zfs_zaccess(zp
, zfs_unix_to_v4(mode
>> 6), flags
, B_FALSE
, cr
));
2519 * Access function for secpolicy_vnode_setattr
2522 zfs_zaccess_unix(znode_t
*zp
, mode_t mode
, cred_t
*cr
)
2524 int v4_mode
= zfs_unix_to_v4(mode
>> 6);
2526 return (zfs_zaccess(zp
, v4_mode
, 0, B_FALSE
, cr
));
2529 /* See zfs_zaccess_delete() */
2530 int zfs_write_implies_delete_child
= 1;
2533 * Determine whether delete access should be granted.
2535 * The following chart outlines how we handle delete permissions which is
2536 * how recent versions of windows (Windows 2008) handles it. The efficiency
2537 * comes from not having to check the parent ACL where the object itself grants
2540 * -------------------------------------------------------
2541 * | Parent Dir | Target Object Permissions |
2543 * -------------------------------------------------------
2544 * | | ACL Allows | ACL Denies| Delete |
2545 * | | Delete | Delete | unspecified|
2546 * -------------------------------------------------------
2547 * | ACL Allows | Permit | Deny * | Permit |
2548 * | DELETE_CHILD | | | |
2549 * -------------------------------------------------------
2550 * | ACL Denies | Permit | Deny | Deny |
2551 * | DELETE_CHILD | | | |
2552 * -------------------------------------------------------
2553 * | ACL specifies | | | |
2554 * | only allow | Permit | Deny * | Permit |
2555 * | write and | | | |
2557 * -------------------------------------------------------
2558 * | ACL denies | | | |
2559 * | write and | Permit | Deny | Deny |
2561 * -------------------------------------------------------
2564 * Re. execute permission on the directory: if that's missing,
2565 * the vnode lookup of the target will fail before we get here.
2567 * Re [*] in the table above: NFSv4 would normally Permit delete for
2568 * these two cells of the matrix.
2569 * See acl.h for notes on which ACE_... flags should be checked for which
2570 * operations. Specifically, the NFSv4 committee recommendation is in
2571 * conflict with the Windows interpretation of DENY ACEs, where DENY ACEs
2572 * should take precedence ahead of ALLOW ACEs.
2574 * This implementation always consults the target object's ACL first.
2575 * If a DENY ACE is present on the target object that specifies ACE_DELETE,
2576 * delete access is denied. If an ALLOW ACE with ACE_DELETE is present on
2577 * the target object, access is allowed. If and only if no entries with
2578 * ACE_DELETE are present in the object's ACL, check the container's ACL
2579 * for entries with ACE_DELETE_CHILD.
2581 * A summary of the logic implemented from the table above is as follows:
2583 * First check for DENY ACEs that apply.
2584 * If either target or container has a deny, EACCES.
2586 * Delete access can then be summarized as follows:
2587 * 1: The object to be deleted grants ACE_DELETE, or
2588 * 2: The containing directory grants ACE_DELETE_CHILD.
2589 * In a Windows system, that would be the end of the story.
2590 * In this system, (2) has some complications...
2591 * 2a: "sticky" bit on a directory adds restrictions, and
2592 * 2b: existing ACEs from previous versions of ZFS may
2593 * not carry ACE_DELETE_CHILD where they should, so we
2594 * also allow delete when ACE_WRITE_DATA is granted.
2596 * Note: 2b is technically a work-around for a prior bug,
2597 * which hopefully can go away some day. For those who
2598 * no longer need the work around, and for testing, this
2599 * work-around is made conditional via the tunable:
2600 * zfs_write_implies_delete_child
2603 zfs_zaccess_delete(znode_t
*dzp
, znode_t
*zp
, cred_t
*cr
)
2605 uint32_t wanted_dirperms
;
2606 uint32_t dzp_working_mode
= 0;
2607 uint32_t zp_working_mode
= 0;
2608 int dzp_error
, zp_error
;
2609 boolean_t dzpcheck_privs
;
2610 boolean_t zpcheck_privs
;
2612 if (zp
->z_pflags
& (ZFS_IMMUTABLE
| ZFS_NOUNLINK
))
2613 return (SET_ERROR(EPERM
));
2617 * If target object grants ACE_DELETE then we are done. This is
2618 * indicated by a return value of 0. For this case we don't worry
2619 * about the sticky bit because sticky only applies to the parent
2620 * directory and this is the child access result.
2622 * If we encounter a DENY ACE here, we're also done (EACCES).
2623 * Note that if we hit a DENY ACE here (on the target) it should
2624 * take precedence over a DENY ACE on the container, so that when
2625 * we have more complete auditing support we will be able to
2626 * report an access failure against the specific target.
2627 * (This is part of why we're checking the target first.)
2629 zp_error
= zfs_zaccess_common(zp
, ACE_DELETE
, &zp_working_mode
,
2630 &zpcheck_privs
, B_FALSE
, cr
);
2631 if (zp_error
== EACCES
) {
2632 /* We hit a DENY ACE. */
2634 return (SET_ERROR(zp_error
));
2635 return (secpolicy_vnode_remove(cr
));
2643 * If the containing directory grants ACE_DELETE_CHILD,
2644 * or we're in backward compatibility mode and the
2645 * containing directory has ACE_WRITE_DATA, allow.
2646 * Case 2b is handled with wanted_dirperms.
2648 wanted_dirperms
= ACE_DELETE_CHILD
;
2649 if (zfs_write_implies_delete_child
)
2650 wanted_dirperms
|= ACE_WRITE_DATA
;
2651 dzp_error
= zfs_zaccess_common(dzp
, wanted_dirperms
,
2652 &dzp_working_mode
, &dzpcheck_privs
, B_FALSE
, cr
);
2653 if (dzp_error
== EACCES
) {
2654 /* We hit a DENY ACE. */
2655 if (!dzpcheck_privs
)
2656 return (SET_ERROR(dzp_error
));
2657 return (secpolicy_vnode_remove(cr
));
2661 * Cases 2a, 2b (continued)
2663 * Note: dzp_working_mode now contains any permissions
2664 * that were NOT granted. Therefore, if any of the
2665 * wanted_dirperms WERE granted, we will have:
2666 * dzp_working_mode != wanted_dirperms
2667 * We're really asking if ANY of those permissions
2668 * were granted, and if so, grant delete access.
2670 if (dzp_working_mode
!= wanted_dirperms
)
2674 * dzp_error is 0 if the container granted us permissions to "modify".
2675 * If we do not have permission via one or more ACEs, our current
2676 * privileges may still permit us to modify the container.
2678 * dzpcheck_privs is false when i.e. the FS is read-only.
2679 * Otherwise, do privilege checks for the container.
2681 if (dzp_error
!= 0 && dzpcheck_privs
) {
2685 * The secpolicy call needs the requested access and
2686 * the current access mode of the container, but it
2687 * only knows about Unix-style modes (VEXEC, VWRITE),
2688 * so this must condense the fine-grained ACE bits into
2691 * The VEXEC flag is easy, because we know that has
2692 * always been checked before we get here (during the
2693 * lookup of the target vnode). The container has not
2694 * granted us permissions to "modify", so we do not set
2695 * the VWRITE flag in the current access mode.
2697 owner
= zfs_fuid_map_id(dzp
->z_zfsvfs
, dzp
->z_uid
, cr
,
2699 dzp_error
= secpolicy_vnode_access2(cr
, ZTOV(dzp
),
2700 owner
, VEXEC
, VWRITE
|VEXEC
);
2702 if (dzp_error
!= 0) {
2704 * Note: We may have dzp_error = -1 here (from
2705 * zfs_zacess_common). Don't return that.
2707 return (SET_ERROR(EACCES
));
2711 * At this point, we know that the directory permissions allow
2712 * us to modify, but we still need to check for the additional
2713 * restrictions that apply when the "sticky bit" is set.
2715 * Yes, zfs_sticky_remove_access() also checks this bit, but
2716 * checking it here and skipping the call below is nice when
2717 * you're watching all of this with dtrace.
2719 if ((dzp
->z_mode
& S_ISVTX
) == 0)
2723 * zfs_sticky_remove_access will succeed if:
2724 * 1. The sticky bit is absent.
2725 * 2. We pass the sticky bit restrictions.
2726 * 3. We have privileges that always allow file removal.
2728 return (zfs_sticky_remove_access(dzp
, zp
, cr
));
2732 zfs_zaccess_rename(znode_t
*sdzp
, znode_t
*szp
, znode_t
*tdzp
,
2733 znode_t
*tzp
, cred_t
*cr
)
2738 if (szp
->z_pflags
& ZFS_AV_QUARANTINED
)
2739 return (SET_ERROR(EACCES
));
2741 add_perm
= (ZTOV(szp
)->v_type
== VDIR
) ?
2742 ACE_ADD_SUBDIRECTORY
: ACE_ADD_FILE
;
2745 * Rename permissions are combination of delete permission +
2746 * add file/subdir permission.
2750 * first make sure we do the delete portion.
2752 * If that succeeds then check for add_file/add_subdir permissions
2755 if (error
= zfs_zaccess_delete(sdzp
, szp
, cr
))
2759 * If we have a tzp, see if we can delete it?
2762 if (error
= zfs_zaccess_delete(tdzp
, tzp
, cr
))
2767 * Now check for add permissions
2769 error
= zfs_zaccess(tdzp
, add_perm
, 0, B_FALSE
, cr
);