usr/src/uts/common/fs/zfs/zfs_acl.c
author Neil Perrin <Neil.Perrin@Sun.COM>
Wed, 29 Apr 2009 23:01:43 -0600
changeset 9512 64cafcbcc337
parent 9396 f41cf682d0d3
child 9749 105f407a2680
permissions -rw-r--r--
6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
8952
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/param.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/time.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/systm.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/sysmacros.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/resource.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/vfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/vnode.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    34
#include <sys/sid.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/file.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/kmem.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/cmn_err.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/errno.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <sys/unistd.h>
1576
0364d1928a7f 6380036 zfs does not clear S_ISUID and S_ISGID bits on successful writes
marks
parents: 1544
diff changeset
    41
#include <sys/sdt.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <sys/mode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <sys/policy.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
#include <sys/zfs_znode.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    46
#include <sys/zfs_fuid.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#include <sys/zfs_acl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
#include <sys/zfs_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
#include <sys/zfs_vfsops.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
#include <sys/dmu.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    51
#include <sys/dnode.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
#include "fs/fs_subr.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
#include <acl/acl_common.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
#define	ALLOW	ACE_ACCESS_ALLOWED_ACE_TYPE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
#define	DENY	ACE_ACCESS_DENIED_ACE_TYPE
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    58
#define	MAX_ACE_TYPE	ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
    59
#define	MIN_ACE_TYPE	ALLOW
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
#define	OWNING_GROUP		(ACE_GROUP|ACE_IDENTIFIER_GROUP)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
#define	EVERYONE_ALLOW_MASK (ACE_READ_ACL|ACE_READ_ATTRIBUTES | \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
    ACE_READ_NAMED_ATTRS|ACE_SYNCHRONIZE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
#define	EVERYONE_DENY_MASK (ACE_WRITE_ACL|ACE_WRITE_OWNER | \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
    ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
#define	OWNER_ALLOW_MASK (ACE_WRITE_ACL | ACE_WRITE_OWNER | \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
    ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    68
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    69
#define	ZFS_CHECKED_MASKS (ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_DATA| \
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    70
    ACE_READ_NAMED_ATTRS|ACE_WRITE_DATA|ACE_WRITE_ATTRIBUTES| \
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    71
    ACE_WRITE_NAMED_ATTRS|ACE_APPEND_DATA|ACE_EXECUTE|ACE_WRITE_OWNER| \
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    72
    ACE_WRITE_ACL|ACE_DELETE|ACE_DELETE_CHILD|ACE_SYNCHRONIZE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    73
8952
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    74
#define	WRITE_MASK_DATA (ACE_WRITE_DATA|ACE_APPEND_DATA|ACE_WRITE_NAMED_ATTRS)
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    75
#define	WRITE_MASK_ATTRS (ACE_WRITE_ACL|ACE_WRITE_OWNER|ACE_WRITE_ATTRIBUTES| \
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    76
    ACE_DELETE|ACE_DELETE_CHILD)
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    77
#define	WRITE_MASK (WRITE_MASK_DATA|WRITE_MASK_ATTRS)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
#define	OGE_CLEAR	(ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
    ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
#define	OKAY_MASK_BITS (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
    ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
#define	ALL_INHERIT	(ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE | \
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    86
    ACE_NO_PROPAGATE_INHERIT_ACE|ACE_INHERIT_ONLY_ACE|ACE_INHERITED_ACE)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
    88
#define	RESTRICTED_CLEAR	(ACE_WRITE_ACL|ACE_WRITE_OWNER)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    90
#define	V4_ACL_WIDE_FLAGS (ZFS_ACL_AUTO_INHERIT|ZFS_ACL_DEFAULTED|\
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    91
    ZFS_ACL_PROTECTED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    92
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    93
#define	ZFS_ACL_WIDE_FLAGS (V4_ACL_WIDE_FLAGS|ZFS_ACL_TRIVIAL|ZFS_INHERIT_ACE|\
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    94
    ZFS_ACL_OBJ_ACE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    95
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    96
static uint16_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    97
zfs_ace_v0_get_type(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    98
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
    99
	return (((zfs_oldace_t *)acep)->z_type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   100
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   101
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   102
static uint16_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   103
zfs_ace_v0_get_flags(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   104
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   105
	return (((zfs_oldace_t *)acep)->z_flags);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   106
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   107
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   108
static uint32_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   109
zfs_ace_v0_get_mask(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   110
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   111
	return (((zfs_oldace_t *)acep)->z_access_mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   112
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   113
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   114
static uint64_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   115
zfs_ace_v0_get_who(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   116
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   117
	return (((zfs_oldace_t *)acep)->z_fuid);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   118
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   119
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   120
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   121
zfs_ace_v0_set_type(void *acep, uint16_t type)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   122
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   123
	((zfs_oldace_t *)acep)->z_type = type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   124
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   125
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   126
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   127
zfs_ace_v0_set_flags(void *acep, uint16_t flags)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   128
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   129
	((zfs_oldace_t *)acep)->z_flags = flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   130
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   131
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   132
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   133
zfs_ace_v0_set_mask(void *acep, uint32_t mask)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   134
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   135
	((zfs_oldace_t *)acep)->z_access_mask = mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   136
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   137
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   138
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   139
zfs_ace_v0_set_who(void *acep, uint64_t who)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   140
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   141
	((zfs_oldace_t *)acep)->z_fuid = who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   142
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   143
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   144
/*ARGSUSED*/
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   145
static size_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   146
zfs_ace_v0_size(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   147
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   148
	return (sizeof (zfs_oldace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   149
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   150
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   151
static size_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   152
zfs_ace_v0_abstract_size(void)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   153
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   154
	return (sizeof (zfs_oldace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   155
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   156
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   157
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   158
zfs_ace_v0_mask_off(void)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   159
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   160
	return (offsetof(zfs_oldace_t, z_access_mask));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   161
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   162
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   163
/*ARGSUSED*/
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   164
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   165
zfs_ace_v0_data(void *acep, void **datap)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   166
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   167
	*datap = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   168
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   169
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   170
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   171
static acl_ops_t zfs_acl_v0_ops = {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   172
	zfs_ace_v0_get_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   173
	zfs_ace_v0_set_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   174
	zfs_ace_v0_get_flags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   175
	zfs_ace_v0_set_flags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   176
	zfs_ace_v0_get_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   177
	zfs_ace_v0_set_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   178
	zfs_ace_v0_get_who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   179
	zfs_ace_v0_set_who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   180
	zfs_ace_v0_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   181
	zfs_ace_v0_abstract_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   182
	zfs_ace_v0_mask_off,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   183
	zfs_ace_v0_data
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   184
};
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   185
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   186
static uint16_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   187
zfs_ace_fuid_get_type(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   188
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   189
	return (((zfs_ace_hdr_t *)acep)->z_type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   190
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   191
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   192
static uint16_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   193
zfs_ace_fuid_get_flags(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   194
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   195
	return (((zfs_ace_hdr_t *)acep)->z_flags);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   196
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   197
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   198
static uint32_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   199
zfs_ace_fuid_get_mask(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   200
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   201
	return (((zfs_ace_hdr_t *)acep)->z_access_mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   202
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   203
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   204
static uint64_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   205
zfs_ace_fuid_get_who(void *args)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   206
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   207
	uint16_t entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   208
	zfs_ace_t *acep = args;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   209
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   210
	entry_type = acep->z_hdr.z_flags & ACE_TYPE_FLAGS;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   212
	if (entry_type == ACE_OWNER || entry_type == OWNING_GROUP ||
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   213
	    entry_type == ACE_EVERYONE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   214
		return (-1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   215
	return (((zfs_ace_t *)acep)->z_fuid);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   216
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   217
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   218
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   219
zfs_ace_fuid_set_type(void *acep, uint16_t type)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   220
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   221
	((zfs_ace_hdr_t *)acep)->z_type = type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   222
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   223
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   224
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   225
zfs_ace_fuid_set_flags(void *acep, uint16_t flags)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   226
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   227
	((zfs_ace_hdr_t *)acep)->z_flags = flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   228
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   229
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   230
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   231
zfs_ace_fuid_set_mask(void *acep, uint32_t mask)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   232
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   233
	((zfs_ace_hdr_t *)acep)->z_access_mask = mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   234
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   235
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   236
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   237
zfs_ace_fuid_set_who(void *arg, uint64_t who)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   238
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   239
	zfs_ace_t *acep = arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   240
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   241
	uint16_t entry_type = acep->z_hdr.z_flags & ACE_TYPE_FLAGS;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   242
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   243
	if (entry_type == ACE_OWNER || entry_type == OWNING_GROUP ||
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   244
	    entry_type == ACE_EVERYONE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   245
		return;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   246
	acep->z_fuid = who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   247
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   248
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   249
static size_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   250
zfs_ace_fuid_size(void *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   251
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   252
	zfs_ace_hdr_t *zacep = acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   253
	uint16_t entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   254
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   255
	switch (zacep->z_type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   256
	case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   257
	case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   258
	case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   259
	case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   260
		return (sizeof (zfs_object_ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   261
	case ALLOW:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   262
	case DENY:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   263
		entry_type =
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   264
		    (((zfs_ace_hdr_t *)acep)->z_flags & ACE_TYPE_FLAGS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   265
		if (entry_type == ACE_OWNER ||
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   266
		    entry_type == OWNING_GROUP ||
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   267
		    entry_type == ACE_EVERYONE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   268
			return (sizeof (zfs_ace_hdr_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   269
		/*FALLTHROUGH*/
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   270
	default:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   271
		return (sizeof (zfs_ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   272
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   273
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   274
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   275
static size_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   276
zfs_ace_fuid_abstract_size(void)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   277
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   278
	return (sizeof (zfs_ace_hdr_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   279
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   280
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   281
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   282
zfs_ace_fuid_mask_off(void)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   283
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   284
	return (offsetof(zfs_ace_hdr_t, z_access_mask));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   285
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   286
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   287
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   288
zfs_ace_fuid_data(void *acep, void **datap)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   289
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   290
	zfs_ace_t *zacep = acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   291
	zfs_object_ace_t *zobjp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   292
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   293
	switch (zacep->z_hdr.z_type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   294
	case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   295
	case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   296
	case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   297
	case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   298
		zobjp = acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   299
		*datap = (caddr_t)zobjp + sizeof (zfs_ace_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   300
		return (sizeof (zfs_object_ace_t) - sizeof (zfs_ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   301
	default:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   302
		*datap = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   303
		return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   304
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   305
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   306
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   307
static acl_ops_t zfs_acl_fuid_ops = {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   308
	zfs_ace_fuid_get_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   309
	zfs_ace_fuid_set_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   310
	zfs_ace_fuid_get_flags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   311
	zfs_ace_fuid_set_flags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   312
	zfs_ace_fuid_get_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   313
	zfs_ace_fuid_set_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   314
	zfs_ace_fuid_get_who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   315
	zfs_ace_fuid_set_who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   316
	zfs_ace_fuid_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   317
	zfs_ace_fuid_abstract_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   318
	zfs_ace_fuid_mask_off,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   319
	zfs_ace_fuid_data
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   320
};
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   321
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   322
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   323
zfs_acl_version(int version)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   324
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   325
	if (version < ZPL_VERSION_FUID)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   326
		return (ZFS_ACL_VERSION_INITIAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   327
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   328
		return (ZFS_ACL_VERSION_FUID);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   329
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   330
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   331
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   332
zfs_acl_version_zp(znode_t *zp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   333
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   334
	return (zfs_acl_version(zp->z_zfsvfs->z_version));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   335
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
static zfs_acl_t *
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   338
zfs_acl_alloc(int vers)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
	zfs_acl_t *aclp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	aclp = kmem_zalloc(sizeof (zfs_acl_t), KM_SLEEP);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   343
	list_create(&aclp->z_acl, sizeof (zfs_acl_node_t),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   344
	    offsetof(zfs_acl_node_t, z_next));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   345
	aclp->z_version = vers;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   346
	if (vers == ZFS_ACL_VERSION_FUID)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   347
		aclp->z_ops = zfs_acl_fuid_ops;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   348
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   349
		aclp->z_ops = zfs_acl_v0_ops;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   350
	return (aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   351
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   352
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   353
static zfs_acl_node_t *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   354
zfs_acl_node_alloc(size_t bytes)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   355
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   356
	zfs_acl_node_t *aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   357
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   358
	aclnode = kmem_zalloc(sizeof (zfs_acl_node_t), KM_SLEEP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   359
	if (bytes) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   360
		aclnode->z_acldata = kmem_alloc(bytes, KM_SLEEP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   361
		aclnode->z_allocdata = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   362
		aclnode->z_allocsize = bytes;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   363
		aclnode->z_size = bytes;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   365
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   366
	return (aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   367
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   368
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   369
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   370
zfs_acl_node_free(zfs_acl_node_t *aclnode)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   371
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   372
	if (aclnode->z_allocsize)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   373
		kmem_free(aclnode->z_allocdata, aclnode->z_allocsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   374
	kmem_free(aclnode, sizeof (zfs_acl_node_t));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   377
static void
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   378
zfs_acl_release_nodes(zfs_acl_t *aclp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   380
	zfs_acl_node_t *aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   381
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   382
	while (aclnode = list_head(&aclp->z_acl)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   383
		list_remove(&aclp->z_acl, aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   384
		zfs_acl_node_free(aclnode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	}
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   386
	aclp->z_acl_count = 0;
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   387
	aclp->z_acl_bytes = 0;
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   388
}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   389
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   390
void
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   391
zfs_acl_free(zfs_acl_t *aclp)
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   392
{
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   393
	zfs_acl_release_nodes(aclp);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   394
	list_destroy(&aclp->z_acl);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
	kmem_free(aclp, sizeof (zfs_acl_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   398
static boolean_t
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   399
zfs_acl_valid_ace_type(uint_t type, uint_t flags)
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   400
{
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   401
	uint16_t entry_type;
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   402
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   403
	switch (type) {
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   404
	case ALLOW:
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   405
	case DENY:
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   406
	case ACE_SYSTEM_AUDIT_ACE_TYPE:
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   407
	case ACE_SYSTEM_ALARM_ACE_TYPE:
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   408
		entry_type = flags & ACE_TYPE_FLAGS;
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   409
		return (entry_type == ACE_OWNER ||
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   410
		    entry_type == OWNING_GROUP ||
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   411
		    entry_type == ACE_EVERYONE || entry_type == 0 ||
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   412
		    entry_type == ACE_IDENTIFIER_GROUP);
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   413
	default:
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   414
		if (type >= MIN_ACE_TYPE && type <= MAX_ACE_TYPE)
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   415
			return (B_TRUE);
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   416
	}
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   417
	return (B_FALSE);
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   418
}
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   419
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   420
static boolean_t
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   421
zfs_ace_valid(vtype_t obj_type, zfs_acl_t *aclp, uint16_t type, uint16_t iflags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   423
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   424
	 * first check type of entry
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   425
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   426
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   427
	if (!zfs_acl_valid_ace_type(type, iflags))
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   428
		return (B_FALSE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   429
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   430
	switch (type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   431
	case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   432
	case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   433
	case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   434
	case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   435
		if (aclp->z_version < ZFS_ACL_VERSION_FUID)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   436
			return (B_FALSE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   437
		aclp->z_hints |= ZFS_ACL_OBJ_ACE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   438
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   440
	/*
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   441
	 * next check inheritance level flags
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   442
	 */
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   443
7057
d3fa1d6dbef7 PSARC/2008/342 Further SID support
marks
parents: 6385
diff changeset
   444
	if (obj_type == VDIR &&
d3fa1d6dbef7 PSARC/2008/342 Further SID support
marks
parents: 6385
diff changeset
   445
	    (iflags & (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE)))
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   446
		aclp->z_hints |= ZFS_INHERIT_ACE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   447
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   448
	if (iflags & (ACE_INHERIT_ONLY_ACE|ACE_NO_PROPAGATE_INHERIT_ACE)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   449
		if ((iflags & (ACE_FILE_INHERIT_ACE|
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   450
		    ACE_DIRECTORY_INHERIT_ACE)) == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   451
			return (B_FALSE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   452
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   453
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   454
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   455
	return (B_TRUE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   456
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   457
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   458
static void *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   459
zfs_acl_next_ace(zfs_acl_t *aclp, void *start, uint64_t *who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   460
    uint32_t *access_mask, uint16_t *iflags, uint16_t *type)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   461
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   462
	zfs_acl_node_t *aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   463
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   464
	if (start == NULL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   465
		aclnode = list_head(&aclp->z_acl);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   466
		if (aclnode == NULL)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   467
			return (NULL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   468
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   469
		aclp->z_next_ace = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   470
		aclp->z_curr_node = aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   471
		aclnode->z_ace_idx = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   472
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   473
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   474
	aclnode = aclp->z_curr_node;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   475
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   476
	if (aclnode == NULL)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   477
		return (NULL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   478
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   479
	if (aclnode->z_ace_idx >= aclnode->z_ace_count) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   480
		aclnode = list_next(&aclp->z_acl, aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   481
		if (aclnode == NULL)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   482
			return (NULL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   483
		else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   484
			aclp->z_curr_node = aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   485
			aclnode->z_ace_idx = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   486
			aclp->z_next_ace = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   487
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   488
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   489
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   490
	if (aclnode->z_ace_idx < aclnode->z_ace_count) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   491
		void *acep = aclp->z_next_ace;
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   492
		size_t ace_size;
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   493
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   494
		/*
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   495
		 * Make sure we don't overstep our bounds
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   496
		 */
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   497
		ace_size = aclp->z_ops.ace_size(acep);
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   498
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   499
		if (((caddr_t)acep + ace_size) >
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   500
		    ((caddr_t)aclnode->z_acldata + aclnode->z_size)) {
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   501
			return (NULL);
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   502
		}
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   503
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   504
		*iflags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   505
		*type = aclp->z_ops.ace_type_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   506
		*access_mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   507
		*who = aclp->z_ops.ace_who_get(acep);
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   508
		aclp->z_next_ace = (caddr_t)aclp->z_next_ace + ace_size;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   509
		aclnode->z_ace_idx++;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   510
		return ((void *)acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   511
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   512
	return (NULL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   513
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   514
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   515
/*ARGSUSED*/
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   516
static uint64_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   517
zfs_ace_walk(void *datap, uint64_t cookie, int aclcnt,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   518
    uint16_t *flags, uint16_t *type, uint32_t *mask)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   519
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   520
	zfs_acl_t *aclp = datap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   521
	zfs_ace_hdr_t *acep = (zfs_ace_hdr_t *)(uintptr_t)cookie;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   522
	uint64_t who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   523
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   524
	acep = zfs_acl_next_ace(aclp, acep, &who, mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   525
	    flags, type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   526
	return ((uint64_t)(uintptr_t)acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   527
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   528
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   529
static zfs_acl_node_t *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   530
zfs_acl_curr_node(zfs_acl_t *aclp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   531
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   532
	ASSERT(aclp->z_curr_node);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   533
	return (aclp->z_curr_node);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   534
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   535
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   536
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   537
 * Copy ACE to internal ZFS format.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   538
 * While processing the ACL each ACE will be validated for correctness.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   539
 * ACE FUIDs will be created later.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   540
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   541
int
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   542
zfs_copy_ace_2_fuid(zfsvfs_t *zfsvfs, vtype_t obj_type, zfs_acl_t *aclp,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   543
    void *datap, zfs_ace_t *z_acl, int aclcnt, size_t *size,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   544
    zfs_fuid_info_t **fuidp, cred_t *cr)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   545
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   546
	int i;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   547
	uint16_t entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   548
	zfs_ace_t *aceptr = z_acl;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   549
	ace_t *acep = datap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   550
	zfs_object_ace_t *zobjacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   551
	ace_object_t *aceobjp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   552
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   553
	for (i = 0; i != aclcnt; i++) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   554
		aceptr->z_hdr.z_access_mask = acep->a_access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   555
		aceptr->z_hdr.z_flags = acep->a_flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   556
		aceptr->z_hdr.z_type = acep->a_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   557
		entry_type = aceptr->z_hdr.z_flags & ACE_TYPE_FLAGS;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   558
		if (entry_type != ACE_OWNER && entry_type != OWNING_GROUP &&
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
   559
		    entry_type != ACE_EVERYONE) {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   560
			aceptr->z_fuid = zfs_fuid_create(zfsvfs, acep->a_who,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   561
			    cr, (entry_type == 0) ?
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   562
			    ZFS_ACE_USER : ZFS_ACE_GROUP, fuidp);
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
   563
		}
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
   564
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   565
		/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   566
		 * Make sure ACE is valid
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   567
		 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   568
		if (zfs_ace_valid(obj_type, aclp, aceptr->z_hdr.z_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   569
		    aceptr->z_hdr.z_flags) != B_TRUE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   570
			return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   571
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   572
		switch (acep->a_type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   573
		case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   574
		case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   575
		case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   576
		case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   577
			zobjacep = (zfs_object_ace_t *)aceptr;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   578
			aceobjp = (ace_object_t *)acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   579
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   580
			bcopy(aceobjp->a_obj_type, zobjacep->z_object_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   581
			    sizeof (aceobjp->a_obj_type));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   582
			bcopy(aceobjp->a_inherit_obj_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   583
			    zobjacep->z_inherit_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   584
			    sizeof (aceobjp->a_inherit_obj_type));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   585
			acep = (ace_t *)((caddr_t)acep + sizeof (ace_object_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   586
			break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   587
		default:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   588
			acep = (ace_t *)((caddr_t)acep + sizeof (ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   589
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   590
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   591
		aceptr = (zfs_ace_t *)((caddr_t)aceptr +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   592
		    aclp->z_ops.ace_size(aceptr));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   593
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   594
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   595
	*size = (caddr_t)aceptr - (caddr_t)z_acl;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   597
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   598
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   599
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   600
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   601
 * Copy ZFS ACEs to fixed size ace_t layout
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   602
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   603
static void
5771
7ba3a2c57d6a 6552639 Each zone should have it's own idmapd
jp151216
parents: 5762
diff changeset
   604
zfs_copy_fuid_2_ace(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, cred_t *cr,
7ba3a2c57d6a 6552639 Each zone should have it's own idmapd
jp151216
parents: 5762
diff changeset
   605
    void *datap, int filter)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   606
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   607
	uint64_t who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   608
	uint32_t access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   609
	uint16_t iflags, type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   610
	zfs_ace_hdr_t *zacep = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   611
	ace_t *acep = datap;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   612
	ace_object_t *objacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   613
	zfs_object_ace_t *zobjacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   614
	size_t ace_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   615
	uint16_t entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   616
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   617
	while (zacep = zfs_acl_next_ace(aclp, zacep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   618
	    &who, &access_mask, &iflags, &type)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   619
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   620
		switch (type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   621
		case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   622
		case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   623
		case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   624
		case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   625
			if (filter) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   626
				continue;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   627
			}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   628
			zobjacep = (zfs_object_ace_t *)zacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   629
			objacep = (ace_object_t *)acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   630
			bcopy(zobjacep->z_object_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   631
			    objacep->a_obj_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   632
			    sizeof (zobjacep->z_object_type));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   633
			bcopy(zobjacep->z_inherit_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   634
			    objacep->a_inherit_obj_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   635
			    sizeof (zobjacep->z_inherit_type));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   636
			ace_size = sizeof (ace_object_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   637
			break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   638
		default:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   639
			ace_size = sizeof (ace_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   640
			break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   641
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   642
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   643
		entry_type = (iflags & ACE_TYPE_FLAGS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   644
		if ((entry_type != ACE_OWNER &&
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   645
		    entry_type != OWNING_GROUP &&
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   646
		    entry_type != ACE_EVERYONE)) {
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   647
			acep->a_who = zfs_fuid_map_id(zfsvfs, who,
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   648
			    cr, (entry_type & ACE_IDENTIFIER_GROUP) ?
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   649
			    ZFS_ACE_GROUP : ZFS_ACE_USER);
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   650
		} else {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   651
			acep->a_who = (uid_t)(int64_t)who;
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
   652
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   653
		acep->a_access_mask = access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   654
		acep->a_flags = iflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   655
		acep->a_type = type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   656
		acep = (ace_t *)((caddr_t)acep + ace_size);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   657
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   658
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   659
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   660
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   661
zfs_copy_ace_2_oldace(vtype_t obj_type, zfs_acl_t *aclp, ace_t *acep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   662
    zfs_oldace_t *z_acl, int aclcnt, size_t *size)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   663
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   664
	int i;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   665
	zfs_oldace_t *aceptr = z_acl;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   666
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   667
	for (i = 0; i != aclcnt; i++, aceptr++) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   668
		aceptr->z_access_mask = acep[i].a_access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   669
		aceptr->z_type = acep[i].a_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   670
		aceptr->z_flags = acep[i].a_flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   671
		aceptr->z_fuid = acep[i].a_who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   672
		/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   673
		 * Make sure ACE is valid
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   674
		 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   675
		if (zfs_ace_valid(obj_type, aclp, aceptr->z_type,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   676
		    aceptr->z_flags) != B_TRUE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   677
			return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   678
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   679
	*size = (caddr_t)aceptr - (caddr_t)z_acl;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   680
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   681
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   682
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   683
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   684
 * convert old ACL format to new
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   685
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   686
void
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   687
zfs_acl_xform(znode_t *zp, zfs_acl_t *aclp, cred_t *cr)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   688
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   689
	zfs_oldace_t *oldaclp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   690
	int i;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   691
	uint16_t type, iflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   692
	uint32_t access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   693
	uint64_t who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   694
	void *cookie = NULL;
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   695
	zfs_acl_node_t *newaclnode;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   696
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   697
	ASSERT(aclp->z_version == ZFS_ACL_VERSION_INITIAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   698
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   699
	 * First create the ACE in a contiguous piece of memory
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   700
	 * for zfs_copy_ace_2_fuid().
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   701
	 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   702
	 * We only convert an ACL once, so this won't happen
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   703
	 * everytime.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   704
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   705
	oldaclp = kmem_alloc(sizeof (zfs_oldace_t) * aclp->z_acl_count,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   706
	    KM_SLEEP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   707
	i = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   708
	while (cookie = zfs_acl_next_ace(aclp, cookie, &who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   709
	    &access_mask, &iflags, &type)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   710
		oldaclp[i].z_flags = iflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   711
		oldaclp[i].z_type = type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   712
		oldaclp[i].z_fuid = who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   713
		oldaclp[i++].z_access_mask = access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   714
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   715
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   716
	newaclnode = zfs_acl_node_alloc(aclp->z_acl_count *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   717
	    sizeof (zfs_object_ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   718
	aclp->z_ops = zfs_acl_fuid_ops;
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   719
	VERIFY(zfs_copy_ace_2_fuid(zp->z_zfsvfs, ZTOV(zp)->v_type, aclp,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   720
	    oldaclp, newaclnode->z_acldata, aclp->z_acl_count,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   721
	    &newaclnode->z_size, NULL, cr) == 0);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   722
	newaclnode->z_ace_count = aclp->z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   723
	aclp->z_version = ZFS_ACL_VERSION;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   724
	kmem_free(oldaclp, aclp->z_acl_count * sizeof (zfs_oldace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   725
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   726
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   727
	 * Release all previous ACL nodes
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   728
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   729
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   730
	zfs_acl_release_nodes(aclp);
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   731
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   732
	list_insert_head(&aclp->z_acl, newaclnode);
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   733
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   734
	aclp->z_acl_bytes = newaclnode->z_size;
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   735
	aclp->z_acl_count = newaclnode->z_ace_count;
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
   736
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
 * Convert unix access mask to v4 access mask
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
static uint32_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
zfs_unix_to_v4(uint32_t access_mask)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
	uint32_t new_mask = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   747
	if (access_mask & S_IXOTH)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   748
		new_mask |= ACE_EXECUTE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   749
	if (access_mask & S_IWOTH)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   750
		new_mask |= ACE_WRITE_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   751
	if (access_mask & S_IROTH)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
		new_mask |= ACE_READ_DATA;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
	return (new_mask);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   757
zfs_set_ace(zfs_acl_t *aclp, void *acep, uint32_t access_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   758
    uint16_t access_type, uint64_t fuid, uint16_t entry_type)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   760
	uint16_t type = entry_type & ACE_TYPE_FLAGS;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   761
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   762
	aclp->z_ops.ace_mask_set(acep, access_mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   763
	aclp->z_ops.ace_type_set(acep, access_type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   764
	aclp->z_ops.ace_flags_set(acep, entry_type);
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   765
	if ((type != ACE_OWNER && type != OWNING_GROUP &&
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   766
	    type != ACE_EVERYONE))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   767
		aclp->z_ops.ace_who_set(acep, fuid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   770
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   771
 * Determine mode of file based on ACL.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   772
 * Also, create FUIDs for any User/Group ACEs
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   773
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
static uint64_t
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
   775
zfs_mode_compute(znode_t *zp, zfs_acl_t *aclp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   777
	int		entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   778
	mode_t		mode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   779
	mode_t		seen = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   780
	zfs_ace_hdr_t 	*acep = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   781
	uint64_t	who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   782
	uint16_t	iflags, type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   783
	uint32_t	access_mask;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   785
	mode = (zp->z_phys->zp_mode & (S_IFMT | S_ISUID | S_ISGID | S_ISVTX));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   786
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   787
	while (acep = zfs_acl_next_ace(aclp, acep, &who,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   788
	    &access_mask, &iflags, &type)) {
4869
f123f22fc641 6590376 Fails to chmod on a zfs volume with windows ACL
marks
parents: 4321
diff changeset
   789
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   790
		if (!zfs_acl_valid_ace_type(type, iflags))
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   791
			continue;
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
   792
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   793
		entry_type = (iflags & ACE_TYPE_FLAGS);
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   794
4869
f123f22fc641 6590376 Fails to chmod on a zfs volume with windows ACL
marks
parents: 4321
diff changeset
   795
		/*
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   796
		 * Skip over owner@, group@ or everyone@ inherit only ACEs
4869
f123f22fc641 6590376 Fails to chmod on a zfs volume with windows ACL
marks
parents: 4321
diff changeset
   797
		 */
7328
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   798
		if ((iflags & ACE_INHERIT_ONLY_ACE) &&
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   799
		    (entry_type == ACE_OWNER || entry_type == ACE_EVERYONE ||
6bdcaa4505ac 6736457 dmu_tx_dirty_buf+297 panic while Win2003 is copying i386 folder from win2003 CD-ROM to Nevada
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7294
diff changeset
   800
		    entry_type == OWNING_GROUP))
4869
f123f22fc641 6590376 Fails to chmod on a zfs volume with windows ACL
marks
parents: 4321
diff changeset
   801
			continue;
f123f22fc641 6590376 Fails to chmod on a zfs volume with windows ACL
marks
parents: 4321
diff changeset
   802
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
		if (entry_type == ACE_OWNER) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   804
			if ((access_mask & ACE_READ_DATA) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
			    (!(seen & S_IRUSR))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   806
				seen |= S_IRUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   807
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   808
					mode |= S_IRUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   811
			if ((access_mask & ACE_WRITE_DATA) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   812
			    (!(seen & S_IWUSR))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
				seen |= S_IWUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   814
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   815
					mode |= S_IWUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   816
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   817
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   818
			if ((access_mask & ACE_EXECUTE) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   819
			    (!(seen & S_IXUSR))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   820
				seen |= S_IXUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   821
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   822
					mode |= S_IXUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   823
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   824
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   825
		} else if (entry_type == OWNING_GROUP) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   826
			if ((access_mask & ACE_READ_DATA) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   827
			    (!(seen & S_IRGRP))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   828
				seen |= S_IRGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   829
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   830
					mode |= S_IRGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   831
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   832
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   833
			if ((access_mask & ACE_WRITE_DATA) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   834
			    (!(seen & S_IWGRP))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
				seen |= S_IWGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   836
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   837
					mode |= S_IWGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   838
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   839
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   840
			if ((access_mask & ACE_EXECUTE) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
			    (!(seen & S_IXGRP))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   842
				seen |= S_IXGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   843
				if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   844
					mode |= S_IXGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   845
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   846
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   847
		} else if (entry_type == ACE_EVERYONE) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   848
			if ((access_mask & ACE_READ_DATA)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   849
				if (!(seen & S_IRUSR)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
					seen |= S_IRUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   851
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
						mode |= S_IRUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
				if (!(seen & S_IRGRP)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
					seen |= S_IRGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   857
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   858
						mode |= S_IRGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   859
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   860
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   861
				if (!(seen & S_IROTH)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   862
					seen |= S_IROTH;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   863
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   864
						mode |= S_IROTH;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   865
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   866
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   867
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   868
			if ((access_mask & ACE_WRITE_DATA)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   869
				if (!(seen & S_IWUSR)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   870
					seen |= S_IWUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   871
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
						mode |= S_IWUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
				if (!(seen & S_IWGRP)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   876
					seen |= S_IWGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   877
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   878
						mode |= S_IWGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   879
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   881
				if (!(seen & S_IWOTH)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
					seen |= S_IWOTH;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   883
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   884
						mode |= S_IWOTH;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   885
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   886
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   887
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   888
			if ((access_mask & ACE_EXECUTE)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   889
				if (!(seen & S_IXUSR)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   890
					seen |= S_IXUSR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   891
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   892
						mode |= S_IXUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   893
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   894
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   895
				if (!(seen & S_IXGRP)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
					seen |= S_IXGRP;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   897
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   898
						mode |= S_IXGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   899
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   901
				if (!(seen & S_IXOTH)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   902
					seen |= S_IXOTH;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   903
					if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   904
						mode |= S_IXOTH;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   905
					}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   906
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   907
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   908
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   909
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   910
	return (mode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   911
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   912
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   913
static zfs_acl_t *
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   914
zfs_acl_node_read_internal(znode_t *zp, boolean_t will_modify)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   915
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   916
	zfs_acl_t	*aclp;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   917
	zfs_acl_node_t	*aclnode;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   918
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   919
	aclp = zfs_acl_alloc(zp->z_phys->zp_acl.z_acl_version);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   920
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   921
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   922
	 * Version 0 to 1 znode_acl_phys has the size/count fields swapped.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   923
	 * Version 0 didn't have a size field, only a count.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   924
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   925
	if (zp->z_phys->zp_acl.z_acl_version == ZFS_ACL_VERSION_INITIAL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   926
		aclp->z_acl_count = zp->z_phys->zp_acl.z_acl_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   927
		aclp->z_acl_bytes = ZFS_ACL_SIZE(aclp->z_acl_count);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   928
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   929
		aclp->z_acl_count = zp->z_phys->zp_acl.z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   930
		aclp->z_acl_bytes = zp->z_phys->zp_acl.z_acl_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   931
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   932
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   933
	aclnode = zfs_acl_node_alloc(will_modify ? aclp->z_acl_bytes : 0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   934
	aclnode->z_ace_count = aclp->z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   935
	if (will_modify) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   936
		bcopy(zp->z_phys->zp_acl.z_ace_data, aclnode->z_acldata,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   937
		    aclp->z_acl_bytes);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   938
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   939
		aclnode->z_size = aclp->z_acl_bytes;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   940
		aclnode->z_acldata = &zp->z_phys->zp_acl.z_ace_data[0];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   941
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   942
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   943
	list_insert_head(&aclp->z_acl, aclnode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   944
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   945
	return (aclp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   946
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   947
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   948
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   949
 * Read an external acl object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   950
 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   951
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   952
zfs_acl_node_read(znode_t *zp, zfs_acl_t **aclpp, boolean_t will_modify)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   953
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   954
	uint64_t extacl = zp->z_phys->zp_acl.z_acl_extern_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   955
	zfs_acl_t	*aclp;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   956
	size_t		aclsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   957
	size_t		acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   958
	zfs_acl_node_t	*aclnode;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   959
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   961
	ASSERT(MUTEX_HELD(&zp->z_acl_lock));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   963
	if (zp->z_phys->zp_acl.z_acl_extern_obj == 0) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   964
		*aclpp = zfs_acl_node_read_internal(zp, will_modify);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   965
		return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   966
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   968
	aclp = zfs_acl_alloc(zp->z_phys->zp_acl.z_acl_version);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   969
	if (zp->z_phys->zp_acl.z_acl_version == ZFS_ACL_VERSION_INITIAL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   970
		zfs_acl_phys_v0_t *zacl0 =
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   971
		    (zfs_acl_phys_v0_t *)&zp->z_phys->zp_acl;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   972
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   973
		aclsize = ZFS_ACL_SIZE(zacl0->z_acl_count);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   974
		acl_count = zacl0->z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   975
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   976
		aclsize = zp->z_phys->zp_acl.z_acl_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   977
		acl_count = zp->z_phys->zp_acl.z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   978
		if (aclsize == 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   979
			aclsize = acl_count * sizeof (zfs_ace_t);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   980
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   981
	aclnode = zfs_acl_node_alloc(aclsize);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   982
	list_insert_head(&aclp->z_acl, aclnode);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   983
	error = dmu_read(zp->z_zfsvfs->z_os, extacl, 0,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9396
diff changeset
   984
	    aclsize, aclnode->z_acldata, DMU_READ_PREFETCH);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   985
	aclnode->z_ace_count = acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   986
	aclp->z_acl_count = acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   987
	aclp->z_acl_bytes = aclsize;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
   988
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   989
	if (error != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   990
		zfs_acl_free(aclp);
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7163
diff changeset
   991
		/* convert checksum errors into IO errors */
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7163
diff changeset
   992
		if (error == ECKSUM)
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7163
diff changeset
   993
			error = EIO;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   994
		return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   995
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   997
	*aclpp = aclp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
   998
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   999
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1001
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1002
 * common code for setting ACLs.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1003
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1004
 * This function is called from zfs_mode_update, zfs_perm_init, and zfs_setacl.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1005
 * zfs_setacl passes a non-NULL inherit pointer (ihp) to indicate that it's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1006
 * already checked the acl and knows whether to inherit.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1007
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1008
int
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1009
zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1010
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1011
	int		error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1012
	znode_phys_t	*zphys = zp->z_phys;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1013
	zfs_acl_phys_t	*zacl = &zphys->zp_acl;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1014
	zfsvfs_t	*zfsvfs = zp->z_zfsvfs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1015
	uint64_t	aoid = zphys->zp_acl.z_acl_extern_obj;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1016
	uint64_t	off = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1017
	dmu_object_type_t otype;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1018
	zfs_acl_node_t	*aclnode;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1019
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1020
	dmu_buf_will_dirty(zp->z_dbuf, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1021
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1022
	zphys->zp_mode = zfs_mode_compute(zp, aclp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1023
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1024
	/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1025
	 * Decide which opbject type to use.  If we are forced to
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1026
	 * use old ACL format than transform ACL into zfs_oldace_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1027
	 * layout.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1028
	 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1029
	if (!zfsvfs->z_use_fuids) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1030
		otype = DMU_OT_OLDACL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1031
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1032
		if ((aclp->z_version == ZFS_ACL_VERSION_INITIAL) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1033
		    (zfsvfs->z_version >= ZPL_VERSION_FUID))
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1034
			zfs_acl_xform(zp, aclp, cr);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1035
		ASSERT(aclp->z_version >= ZFS_ACL_VERSION_FUID);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1036
		otype = DMU_OT_ACL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1037
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1038
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1039
	if (aclp->z_acl_bytes > ZFS_ACE_SPACE) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1040
		/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1041
		 * If ACL was previously external and we are now
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1042
		 * converting to new ACL format then release old
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1043
		 * ACL object and create a new one.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1044
		 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1045
		if (aoid && aclp->z_version != zacl->z_acl_version) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1046
			error = dmu_object_free(zfsvfs->z_os,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1047
			    zp->z_phys->zp_acl.z_acl_extern_obj, tx);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1048
			if (error)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1049
				return (error);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1050
			aoid = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1051
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
		if (aoid == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
			aoid = dmu_object_alloc(zfsvfs->z_os,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1054
			    otype, aclp->z_acl_bytes,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1055
			    otype == DMU_OT_ACL ? DMU_OT_SYSACL : DMU_OT_NONE,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1056
			    otype == DMU_OT_ACL ? DN_MAX_BONUSLEN : 0, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
			(void) dmu_object_set_blocksize(zfsvfs->z_os, aoid,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1059
			    aclp->z_acl_bytes, 0, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
		zphys->zp_acl.z_acl_extern_obj = aoid;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1062
		for (aclnode = list_head(&aclp->z_acl); aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1063
		    aclnode = list_next(&aclp->z_acl, aclnode)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1064
			if (aclnode->z_ace_count == 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1065
				continue;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1066
			dmu_write(zfsvfs->z_os, aoid, off,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1067
			    aclnode->z_size, aclnode->z_acldata, tx);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1068
			off += aclnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1069
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
	} else {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1071
		void *start = zacl->z_ace_data;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1072
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1073
		 * Migrating back embedded?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1074
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1075
		if (zphys->zp_acl.z_acl_extern_obj) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1076
			error = dmu_object_free(zfsvfs->z_os,
4300
d74de773d6e6 6528189 cp -p invalid argument issue on Redhat linux AS 3.0 NFS client against ZFS NFS directory
marks
parents: 2676
diff changeset
  1077
			    zp->z_phys->zp_acl.z_acl_extern_obj, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1078
			if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1079
				return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1080
			zphys->zp_acl.z_acl_extern_obj = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1082
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1083
		for (aclnode = list_head(&aclp->z_acl); aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1084
		    aclnode = list_next(&aclp->z_acl, aclnode)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1085
			if (aclnode->z_ace_count == 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1086
				continue;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1087
			bcopy(aclnode->z_acldata, start, aclnode->z_size);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1088
			start = (caddr_t)start + aclnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1089
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1090
	}
905
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1091
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1092
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1093
	 * If Old version then swap count/bytes to match old
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1094
	 * layout of znode_acl_phys_t.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1095
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1096
	if (aclp->z_version == ZFS_ACL_VERSION_INITIAL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1097
		zphys->zp_acl.z_acl_size = aclp->z_acl_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1098
		zphys->zp_acl.z_acl_count = aclp->z_acl_bytes;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1099
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1100
		zphys->zp_acl.z_acl_size = aclp->z_acl_bytes;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1101
		zphys->zp_acl.z_acl_count = aclp->z_acl_count;
905
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1102
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1103
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1104
	zphys->zp_acl.z_acl_version = aclp->z_version;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1105
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1106
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1107
	 * Replace ACL wide bits, but first clear them.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1108
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1109
	zp->z_phys->zp_flags &= ~ZFS_ACL_WIDE_FLAGS;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1110
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1111
	zp->z_phys->zp_flags |= aclp->z_hints;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1112
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1113
	if (ace_trivial_common(aclp, 0, zfs_ace_walk) == 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1114
		zp->z_phys->zp_flags |= ZFS_ACL_TRIVIAL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1115
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1117
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1119
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1120
 * Update access mask for prepended ACE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1121
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1122
 * This applies the "groupmask" value for aclmode property.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1123
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1124
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1125
zfs_acl_prepend_fixup(zfs_acl_t *aclp, void  *acep, void  *origacep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1126
    mode_t mode, uint64_t owner)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1127
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1128
	int	rmask, wmask, xmask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1129
	int	user_ace;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1130
	uint16_t aceflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1131
	uint32_t origmask, acepmask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1132
	uint64_t fuid;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1133
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1134
	aceflags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1135
	fuid = aclp->z_ops.ace_who_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1136
	origmask = aclp->z_ops.ace_mask_get(origacep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1137
	acepmask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1138
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1139
	user_ace = (!(aceflags &
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1140
	    (ACE_OWNER|ACE_GROUP|ACE_IDENTIFIER_GROUP)));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1141
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1142
	if (user_ace && (fuid == owner)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1143
		rmask = S_IRUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1144
		wmask = S_IWUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1145
		xmask = S_IXUSR;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1146
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1147
		rmask = S_IRGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1148
		wmask = S_IWGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1149
		xmask = S_IXGRP;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1150
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1151
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1152
	if (origmask & ACE_READ_DATA) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1153
		if (mode & rmask) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1154
			acepmask &= ~ACE_READ_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1155
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1156
			acepmask |= ACE_READ_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1157
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1159
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1160
	if (origmask & ACE_WRITE_DATA) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1161
		if (mode & wmask) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1162
			acepmask &= ~ACE_WRITE_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1163
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1164
			acepmask |= ACE_WRITE_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1165
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1166
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1168
	if (origmask & ACE_APPEND_DATA) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1169
		if (mode & wmask) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1170
			acepmask &= ~ACE_APPEND_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1171
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1172
			acepmask |= ACE_APPEND_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1173
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1174
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1175
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1176
	if (origmask & ACE_EXECUTE) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1177
		if (mode & xmask) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1178
			acepmask &= ~ACE_EXECUTE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1179
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1180
			acepmask |= ACE_EXECUTE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1181
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1183
	aclp->z_ops.ace_mask_set(acep, acepmask);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1187
 * Apply mode to canonical six ACEs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1188
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1189
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
zfs_acl_fixup_canonical_six(zfs_acl_t *aclp, mode_t mode)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1192
	zfs_acl_node_t *aclnode = list_tail(&aclp->z_acl);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1193
	void	*acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1194
	int	maskoff = aclp->z_ops.ace_mask_off();
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1195
	size_t abstract_size = aclp->z_ops.ace_abstract_size();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1196
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1197
	ASSERT(aclnode != NULL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1198
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1199
	acep = (void *)((caddr_t)aclnode->z_acldata +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1200
	    aclnode->z_size - (abstract_size * 6));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
	 * Fixup final ACEs to match the mode
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1206
	adjust_ace_pair_common(acep, maskoff, abstract_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1207
	    (mode & 0700) >> 6);	/* owner@ */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1208
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1209
	acep = (caddr_t)acep + (abstract_size * 2);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1210
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1211
	adjust_ace_pair_common(acep, maskoff, abstract_size,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1212
	    (mode & 0070) >> 3);	/* group@ */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1213
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1214
	acep = (caddr_t)acep + (abstract_size * 2);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1215
	adjust_ace_pair_common(acep, maskoff,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1216
	    abstract_size, mode);	/* everyone@ */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1217
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1218
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1220
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1221
zfs_acl_ace_match(zfs_acl_t *aclp, void *acep, int allow_deny,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1222
    int entry_type, int accessmask)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1223
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1224
	uint32_t mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1225
	uint16_t type = aclp->z_ops.ace_type_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1226
	uint16_t flags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1227
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1228
	return (mask == accessmask && type == allow_deny &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1229
	    ((flags & ACE_TYPE_FLAGS) == entry_type));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1230
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1231
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1232
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1233
 * Can prepended ACE be reused?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1234
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1235
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1236
zfs_reuse_deny(zfs_acl_t *aclp, void *acep, void *prevacep)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1237
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1238
	int okay_masks;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1239
	uint16_t prevtype;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1240
	uint16_t prevflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1241
	uint16_t flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1242
	uint32_t mask, prevmask;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1243
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1244
	if (prevacep == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1245
		return (B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1246
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1247
	prevtype = aclp->z_ops.ace_type_get(prevacep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1248
	prevflags = aclp->z_ops.ace_flags_get(prevacep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1249
	flags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1250
	mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1251
	prevmask = aclp->z_ops.ace_mask_get(prevacep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1252
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1253
	if (prevtype != DENY)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1254
		return (B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1255
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1256
	if (prevflags != (flags & ACE_IDENTIFIER_GROUP))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1257
		return (B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1258
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1259
	okay_masks = (mask & OKAY_MASK_BITS);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1260
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1261
	if (prevmask & ~okay_masks)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1262
		return (B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1264
	return (B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1265
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1266
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1267
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1268
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1269
 * Insert new ACL node into chain of zfs_acl_node_t's
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1270
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1271
 * This will result in two possible results.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1272
 * 1. If the ACL is currently just a single zfs_acl_node and
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1273
 *    we are prepending the entry then current acl node will have
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1274
 *    a new node inserted above it.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1275
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1276
 * 2. If we are inserting in the middle of current acl node then
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1277
 *    the current node will be split in two and new node will be inserted
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1278
 *    in between the two split nodes.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1279
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1280
static zfs_acl_node_t *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1281
zfs_acl_ace_insert(zfs_acl_t *aclp, void  *acep)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1282
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1283
	zfs_acl_node_t 	*newnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1284
	zfs_acl_node_t 	*trailernode = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1285
	zfs_acl_node_t 	*currnode = zfs_acl_curr_node(aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1286
	int		curr_idx = aclp->z_curr_node->z_ace_idx;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1287
	int		trailer_count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1288
	size_t		oldsize;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1289
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1290
	newnode = zfs_acl_node_alloc(aclp->z_ops.ace_size(acep));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1291
	newnode->z_ace_count = 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1292
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1293
	oldsize = currnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1294
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1295
	if (curr_idx != 1) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1296
		trailernode = zfs_acl_node_alloc(0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1297
		trailernode->z_acldata = acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1298
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1299
		trailer_count = currnode->z_ace_count - curr_idx + 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1300
		currnode->z_ace_count = curr_idx - 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1301
		currnode->z_size = (caddr_t)acep - (caddr_t)currnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1302
		trailernode->z_size = oldsize - currnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1303
		trailernode->z_ace_count = trailer_count;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1304
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1305
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1306
	aclp->z_acl_count += 1;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1307
	aclp->z_acl_bytes += aclp->z_ops.ace_size(acep);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1308
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1309
	if (curr_idx == 1)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1310
		list_insert_before(&aclp->z_acl, currnode, newnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1311
	else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1312
		list_insert_after(&aclp->z_acl, currnode, newnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1313
	if (trailernode) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1314
		list_insert_after(&aclp->z_acl, newnode, trailernode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1315
		aclp->z_curr_node = trailernode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1316
		trailernode->z_ace_idx = 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1317
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1318
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1319
	return (newnode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
 * Prepend deny ACE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1325
static void *
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1326
zfs_acl_prepend_deny(uint64_t uid, zfs_acl_t *aclp, void *acep,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
    mode_t mode)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1329
	zfs_acl_node_t *aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1330
	void  *newacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1331
	uint64_t fuid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1332
	uint16_t flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1333
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1334
	aclnode = zfs_acl_ace_insert(aclp, acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1335
	newacep = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1336
	fuid = aclp->z_ops.ace_who_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1337
	flags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1338
	zfs_set_ace(aclp, newacep, 0, DENY, fuid, (flags & ACE_TYPE_FLAGS));
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1339
	zfs_acl_prepend_fixup(aclp, newacep, acep, mode, uid);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1340
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1341
	return (newacep);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1342
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1343
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1344
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1345
 * Split an inherited ACE into inherit_only ACE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1346
 * and original ACE with inheritance flags stripped off.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1348
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1349
zfs_acl_split_ace(zfs_acl_t *aclp, zfs_ace_hdr_t *acep)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1350
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1351
	zfs_acl_node_t *aclnode;
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
  1352
	zfs_acl_node_t *currnode;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1353
	void  *newacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1354
	uint16_t type, flags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1355
	uint32_t mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1356
	uint64_t fuid;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1357
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1358
	type = aclp->z_ops.ace_type_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1359
	flags = aclp->z_ops.ace_flags_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1360
	mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1361
	fuid = aclp->z_ops.ace_who_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1362
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1363
	aclnode = zfs_acl_ace_insert(aclp, acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1364
	newacep = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1365
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1366
	aclp->z_ops.ace_type_set(newacep, type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1367
	aclp->z_ops.ace_flags_set(newacep, flags | ACE_INHERIT_ONLY_ACE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1368
	aclp->z_ops.ace_mask_set(newacep, mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1369
	aclp->z_ops.ace_type_set(newacep, type);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1370
	aclp->z_ops.ace_who_set(newacep, fuid);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1371
	aclp->z_next_ace = acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1372
	flags &= ~ALL_INHERIT;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1373
	aclp->z_ops.ace_flags_set(acep, flags);
5435
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
  1374
	currnode = zfs_acl_curr_node(aclp);
1be0be66916d 6624956 zfs_log_fuid_ids can cause panic on sparc
marks
parents: 5331
diff changeset
  1375
	ASSERT(currnode->z_ace_idx >= 1);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1376
	currnode->z_ace_idx -= 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1377
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1379
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
 * Are ACES started at index i, the canonical six ACES?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1381
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1382
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1383
zfs_have_canonical_six(zfs_acl_t *aclp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1384
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1385
	void *acep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1386
	zfs_acl_node_t *aclnode = list_tail(&aclp->z_acl);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1387
	int		i = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1388
	size_t abstract_size = aclp->z_ops.ace_abstract_size();
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1389
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1390
	ASSERT(aclnode != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1391
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1392
	if (aclnode->z_ace_count < 6)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1393
		return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1394
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1395
	acep = (void *)((caddr_t)aclnode->z_acldata +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1396
	    aclnode->z_size - (aclp->z_ops.ace_abstract_size() * 6));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1397
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1398
	if ((zfs_acl_ace_match(aclp, (caddr_t)acep + (abstract_size * i++),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1399
	    DENY, ACE_OWNER, 0) &&
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1400
	    zfs_acl_ace_match(aclp, (caddr_t)acep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1401
	    ALLOW, ACE_OWNER, OWNER_ALLOW_MASK) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1402
	    zfs_acl_ace_match(aclp, (caddr_t)acep + (abstract_size * i++), DENY,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1403
	    OWNING_GROUP, 0) && zfs_acl_ace_match(aclp, (caddr_t)acep +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1404
	    (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1405
	    ALLOW, OWNING_GROUP, 0) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1406
	    zfs_acl_ace_match(aclp, (caddr_t)acep + (abstract_size * i++),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1407
	    DENY, ACE_EVERYONE, EVERYONE_DENY_MASK) &&
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1408
	    zfs_acl_ace_match(aclp, (caddr_t)acep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1409
	    ALLOW, ACE_EVERYONE, EVERYONE_ALLOW_MASK))) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1410
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1411
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1412
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1414
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1415
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1416
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1417
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1418
 * Apply step 1g, to group entries
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1419
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1420
 * Need to deal with corner case where group may have
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1421
 * greater permissions than owner.  If so then limit
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1422
 * group permissions, based on what extra permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1423
 * group has.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1424
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1426
zfs_fixup_group_entries(zfs_acl_t *aclp, void *acep, void *prevacep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1427
    mode_t mode)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1428
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1429
	uint32_t prevmask = aclp->z_ops.ace_mask_get(prevacep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1430
	uint32_t mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1431
	uint16_t prevflags = aclp->z_ops.ace_flags_get(prevacep);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1432
	mode_t extramode = (mode >> 3) & 07;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1433
	mode_t ownermode = (mode >> 6);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1435
	if (prevflags & ACE_IDENTIFIER_GROUP) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1437
		extramode &= ~ownermode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1439
		if (extramode) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1440
			if (extramode & S_IROTH) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1441
				prevmask &= ~ACE_READ_DATA;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1442
				mask &= ~ACE_READ_DATA;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1443
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1444
			if (extramode & S_IWOTH) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1445
				prevmask &= ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1446
				mask &= ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1447
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1448
			if (extramode & S_IXOTH) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1449
				prevmask  &= ~ACE_EXECUTE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1450
				mask &= ~ACE_EXECUTE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1451
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1452
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1453
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1454
	aclp->z_ops.ace_mask_set(acep, mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1455
	aclp->z_ops.ace_mask_set(prevacep, prevmask);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1456
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1457
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1458
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1459
 * Apply the chmod algorithm as described
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1460
 * in PSARC/2002/240
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1461
 */
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1462
static void
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1463
zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t uid,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1464
    uint64_t mode, zfs_acl_t *aclp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1465
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1466
	void		*acep = NULL, *prevacep = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1467
	uint64_t	who;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1468
	int 		i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1469
	int 		entry_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
	int 		reuse_deny;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1471
	int 		need_canonical_six = 1;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1472
	uint16_t	iflags, type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1473
	uint32_t	access_mask;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1475
	/*
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1476
	 * If discard then just discard all ACL nodes which
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1477
	 * represent the ACEs.
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1478
	 *
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1479
	 * New owner@/group@/everone@ ACEs will be added
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1480
	 * later.
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1481
	 */
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1482
	if (zfsvfs->z_acl_mode == ZFS_ACL_DISCARD)
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1483
		zfs_acl_release_nodes(aclp);
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5435
diff changeset
  1484
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1485
	while (acep = zfs_acl_next_ace(aclp, acep, &who, &access_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1486
	    &iflags, &type)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1487
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1488
		entry_type = (iflags & ACE_TYPE_FLAGS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1489
		iflags = (iflags & ALL_INHERIT);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1491
		if ((type != ALLOW && type != DENY) ||
905
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1492
		    (iflags & ACE_INHERIT_ONLY_ACE)) {
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1493
			if (iflags)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1494
				aclp->z_hints |= ZFS_INHERIT_ACE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1495
			switch (type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1496
			case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1497
			case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1498
			case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1499
			case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1500
				aclp->z_hints |= ZFS_ACL_OBJ_ACE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1501
				break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1502
			}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1503
			goto nextace;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
		 * Need to split ace into two?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
		 */
905
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1509
		if ((iflags & (ACE_FILE_INHERIT_ACE|
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1510
		    ACE_DIRECTORY_INHERIT_ACE)) &&
905
920e9b2e0899 6347134 zfs_zaccess() is killing ZFS stat() performance
marks
parents: 865
diff changeset
  1511
		    (!(iflags & ACE_INHERIT_ONLY_ACE))) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1512
			zfs_acl_split_ace(aclp, acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1513
			aclp->z_hints |= ZFS_INHERIT_ACE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1514
			goto nextace;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
		if (entry_type == ACE_OWNER || entry_type == ACE_EVERYONE ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
		    (entry_type == OWNING_GROUP)) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1519
			access_mask &= ~OGE_CLEAR;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1520
			aclp->z_ops.ace_mask_set(acep, access_mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1521
			goto nextace;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
		} else {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1523
			reuse_deny = B_TRUE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1524
			if (type == ALLOW) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
				/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
				 * Check preceding ACE if any, to see
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
				 * if we need to prepend a DENY ACE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
				 * This is only applicable when the acl_mode
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1530
				 * property == groupmask.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
				 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2638
diff changeset
  1532
				if (zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1534
					reuse_deny = zfs_reuse_deny(aclp, acep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1535
					    prevacep);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1536
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1537
					if (!reuse_deny) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1538
						prevacep =
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1539
						    zfs_acl_prepend_deny(uid,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1540
						    aclp, acep, mode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1541
					} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1542
						zfs_acl_prepend_fixup(
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1543
						    aclp, prevacep,
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1544
						    acep, mode, uid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1545
					}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1546
					zfs_fixup_group_entries(aclp, acep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1547
					    prevacep, mode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1548
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1549
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1550
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1551
nextace:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1552
		prevacep = acep;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1553
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1554
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1555
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1556
	 * Check out last six aces, if we have six.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1557
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1558
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1559
	if (aclp->z_acl_count >= 6) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1560
		if (zfs_have_canonical_six(aclp)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1561
			need_canonical_six = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1562
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1563
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1564
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1565
	if (need_canonical_six) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1566
		size_t abstract_size = aclp->z_ops.ace_abstract_size();
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1567
		void *zacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1568
		zfs_acl_node_t *aclnode =
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1569
		    zfs_acl_node_alloc(abstract_size * 6);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1570
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1571
		aclnode->z_size = abstract_size * 6;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1572
		aclnode->z_ace_count = 6;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1573
		aclp->z_acl_bytes += aclnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1574
		list_insert_tail(&aclp->z_acl, aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1575
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1576
		zacep = aclnode->z_acldata;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1577
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1578
		i = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1579
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1580
		    0, DENY, -1, ACE_OWNER);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1581
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1582
		    OWNER_ALLOW_MASK, ALLOW, -1, ACE_OWNER);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1583
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++), 0,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1584
		    DENY, -1, OWNING_GROUP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1585
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++), 0,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1586
		    ALLOW, -1, OWNING_GROUP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1587
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1588
		    EVERYONE_DENY_MASK, DENY, -1, ACE_EVERYONE);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1589
		zfs_set_ace(aclp, (caddr_t)zacep + (abstract_size * i++),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1590
		    EVERYONE_ALLOW_MASK, ALLOW, -1, ACE_EVERYONE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1591
		aclp->z_acl_count += 6;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1592
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1593
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1594
	zfs_acl_fixup_canonical_six(aclp, mode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1595
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
int
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1598
zfs_acl_chmod_setattr(znode_t *zp, zfs_acl_t **aclp, uint64_t mode)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1602
	mutex_enter(&zp->z_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1603
	mutex_enter(&zp->z_acl_lock);
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1604
	*aclp = NULL;
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1605
	error = zfs_acl_node_read(zp, aclp, B_TRUE);
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1606
	if (error == 0) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1607
		(*aclp)->z_hints = zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1608
		zfs_acl_chmod(zp->z_zfsvfs, zp->z_phys->zp_uid, mode, *aclp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1609
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1610
	mutex_exit(&zp->z_acl_lock);
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  1611
	mutex_exit(&zp->z_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1613
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1614
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
 * strip off write_owner and write_acl
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
static void
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1619
zfs_restricted_update(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, void *acep)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1621
	uint32_t mask = aclp->z_ops.ace_mask_get(acep);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1622
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1623
	if ((zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED) &&
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1624
	    (aclp->z_ops.ace_type_get(acep) == ALLOW)) {
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1625
		mask &= ~RESTRICTED_CLEAR;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1626
		aclp->z_ops.ace_mask_set(acep, mask);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1627
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1628
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1629
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1630
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1631
 * Should ACE be inherited?
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1632
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1633
static int
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1634
zfs_ace_can_use(vtype_t vtype, uint16_t acep_flags)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1635
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1636
	int	iflags = (acep_flags & 0xf);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1637
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1638
	if ((vtype == VDIR) && (iflags & ACE_DIRECTORY_INHERIT_ACE))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1639
		return (1);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1640
	else if (iflags & ACE_FILE_INHERIT_ACE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1641
		return (!((vtype == VDIR) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1642
		    (iflags & ACE_NO_PROPAGATE_INHERIT_ACE)));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1643
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
 * inherit inheritable ACEs from parent
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
static zfs_acl_t *
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1650
zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_acl_t *paclp,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1651
    uint64_t mode, boolean_t *need_chmod)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1653
	void		*pacep;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1654
	void		*acep, *acep2;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1655
	zfs_acl_node_t  *aclnode, *aclnode2;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1656
	zfs_acl_t	*aclp = NULL;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1657
	uint64_t	who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1658
	uint32_t	access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1659
	uint16_t	iflags, newflags, type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1660
	size_t		ace_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1661
	void		*data1, *data2;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1662
	size_t		data1sz, data2sz;
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1663
	boolean_t	vdir = vtype == VDIR;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1664
	boolean_t	vreg = vtype == VREG;
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1665
	boolean_t	passthrough, passthrough_x, noallow;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1666
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1667
	passthrough_x =
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1668
	    zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1669
	passthrough = passthrough_x ||
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1670
	    zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1671
	noallow =
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1672
	    zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1674
	*need_chmod = B_TRUE;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1675
	pacep = NULL;
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
  1676
	aclp = zfs_acl_alloc(paclp->z_version);
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1677
	if (zfsvfs->z_acl_inherit == ZFS_ACL_DISCARD)
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1678
		return (aclp);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1679
	while (pacep = zfs_acl_next_ace(paclp, pacep, &who,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1680
	    &access_mask, &iflags, &type)) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1681
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1682
		/*
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1683
		 * don't inherit bogus ACEs
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1684
		 */
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1685
		if (!zfs_acl_valid_ace_type(type, iflags))
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1686
			continue;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1687
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1688
		if (noallow && type == ALLOW)
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1689
			continue;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1690
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1691
		ace_size = aclp->z_ops.ace_size(pacep);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1692
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1693
		if (!zfs_ace_can_use(vtype, iflags))
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1694
			continue;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1695
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1696
		/*
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1697
		 * If owner@, group@, or everyone@ inheritable
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1698
		 * then zfs_acl_chmod() isn't needed.
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1699
		 */
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1700
		if (passthrough &&
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1701
		    ((iflags & (ACE_OWNER|ACE_EVERYONE)) ||
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1702
		    ((iflags & OWNING_GROUP) ==
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1703
		    OWNING_GROUP)) && (vreg || (vdir && (iflags &
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1704
		    ACE_DIRECTORY_INHERIT_ACE)))) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1705
			*need_chmod = B_FALSE;
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
  1706
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1707
			if (!vdir && passthrough_x &&
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1708
			    ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1709
				access_mask &= ~ACE_EXECUTE;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1710
			}
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1711
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1712
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1713
		aclnode = zfs_acl_node_alloc(ace_size);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1714
		list_insert_tail(&aclp->z_acl, aclnode);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1715
		acep = aclnode->z_acldata;
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1716
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1717
		zfs_set_ace(aclp, acep, access_mask, type,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1718
		    who, iflags|ACE_INHERITED_ACE);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1719
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1720
		/*
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1721
		 * Copy special opaque data if any
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1722
		 */
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1723
		if ((data1sz = paclp->z_ops.ace_data(pacep, &data1)) != 0) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1724
			VERIFY((data2sz = aclp->z_ops.ace_data(acep,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1725
			    &data2)) == data1sz);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1726
			bcopy(data1, data2, data2sz);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1727
		}
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1728
		aclp->z_acl_count++;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1729
		aclnode->z_ace_count++;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1730
		aclp->z_acl_bytes += aclnode->z_size;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1731
		newflags = aclp->z_ops.ace_flags_get(acep);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1732
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1733
		if (vdir)
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1734
			aclp->z_hints |= ZFS_INHERIT_ACE;
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1735
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1736
		if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1737
			newflags &= ~ALL_INHERIT;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1738
			aclp->z_ops.ace_flags_set(acep,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1739
			    newflags|ACE_INHERITED_ACE);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1740
			zfs_restricted_update(zfsvfs, aclp, acep);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1741
			continue;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1742
		}
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1743
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1744
		ASSERT(vdir);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1745
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1746
		newflags = aclp->z_ops.ace_flags_get(acep);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1747
		if ((iflags & (ACE_FILE_INHERIT_ACE |
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1748
		    ACE_DIRECTORY_INHERIT_ACE)) !=
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1749
		    ACE_FILE_INHERIT_ACE) {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1750
			aclnode2 = zfs_acl_node_alloc(ace_size);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1751
			list_insert_tail(&aclp->z_acl, aclnode2);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1752
			acep2 = aclnode2->z_acldata;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1753
			zfs_set_ace(aclp, acep2,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1754
			    access_mask, type, who,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1755
			    iflags|ACE_INHERITED_ACE);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1756
			newflags |= ACE_INHERIT_ONLY_ACE;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1757
			aclp->z_ops.ace_flags_set(acep, newflags);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1758
			newflags &= ~ALL_INHERIT;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1759
			aclp->z_ops.ace_flags_set(acep2,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1760
			    newflags|ACE_INHERITED_ACE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1762
			/*
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1763
			 * Copy special opaque data if any
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1764
			 */
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1765
			if ((data1sz = aclp->z_ops.ace_data(acep,
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1766
			    &data1)) != 0) {
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1767
				VERIFY((data2sz =
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1768
				    aclp->z_ops.ace_data(acep2,
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1769
				    &data2)) == data1sz);
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1770
				bcopy(data1, data2, data1sz);
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1771
			}
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1772
			aclp->z_acl_count++;
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1773
			aclnode2->z_ace_count++;
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1774
			aclp->z_acl_bytes += aclnode->z_size;
8053
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1775
			zfs_restricted_update(zfsvfs, aclp, acep2);
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1776
		} else {
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1777
			newflags |= ACE_INHERIT_ONLY_ACE;
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1778
			aclp->z_ops.ace_flags_set(acep,
271f44d3de11 PSARC/2008/659 New ZFS "passthrough-x" ACL inheritance rules
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7624
diff changeset
  1779
			    newflags|ACE_INHERITED_ACE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
	return (aclp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
 * Create file system object initial permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
 * including inheritable ACEs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
 */
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1789
int
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1790
zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1791
    vsecattr_t *vsecp, zfs_acl_ids_t *acl_ids)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
	int		error;
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1794
	zfsvfs_t	*zfsvfs = dzp->z_zfsvfs;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1795
	zfs_acl_t	*paclp;
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1796
	gid_t		gid;
6385
5437941ec5a1 PSARC/2008/231 New ZFS "passthrough" ACL inheritance rules
marks
parents: 6257
diff changeset
  1797
	boolean_t	need_chmod = B_TRUE;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1798
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1799
	bzero(acl_ids, sizeof (zfs_acl_ids_t));
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1800
	acl_ids->z_mode = MAKEIMODE(vap->va_type, vap->va_mode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1802
	if (vsecp)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1803
		if ((error = zfs_vsec_2_aclp(zfsvfs, vap->va_type, vsecp, cr,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1804
		    &acl_ids->z_fuidp, &acl_ids->z_aclp)) != 0)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1805
			return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1807
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1808
	 * Determine uid and gid.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
	if ((flag & (IS_ROOT_NODE | IS_REPLAY)) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1811
	    ((flag & IS_XATTR) && (vap->va_type == VDIR))) {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1812
		acl_ids->z_fuid = zfs_fuid_create(zfsvfs,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1813
		    (uint64_t)vap->va_uid, cr,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1814
		    ZFS_OWNER, &acl_ids->z_fuidp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1815
		acl_ids->z_fgid = zfs_fuid_create(zfsvfs,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1816
		    (uint64_t)vap->va_gid, cr,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1817
		    ZFS_GROUP, &acl_ids->z_fuidp);
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1818
		gid = vap->va_gid;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1819
	} else {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1820
		acl_ids->z_fuid = zfs_fuid_create_cred(zfsvfs, ZFS_OWNER,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1821
		    cr, &acl_ids->z_fuidp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1822
		acl_ids->z_fgid = 0;
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1823
		if (vap->va_mask & AT_GID)  {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1824
			acl_ids->z_fgid = zfs_fuid_create(zfsvfs,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1825
			    (uint64_t)vap->va_gid,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1826
			    cr, ZFS_GROUP, &acl_ids->z_fuidp);
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1827
			gid = vap->va_gid;
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1828
			if (acl_ids->z_fgid != dzp->z_phys->zp_gid &&
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1829
			    !groupmember(vap->va_gid, cr) &&
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1830
			    secpolicy_vnode_create_gid(cr) != 0)
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1831
				acl_ids->z_fgid = 0;
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1832
		}
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1833
		if (acl_ids->z_fgid == 0) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1834
			if (dzp->z_phys->zp_mode & S_ISGID) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1835
				acl_ids->z_fgid = dzp->z_phys->zp_gid;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1836
				gid = zfs_fuid_map_id(zfsvfs, acl_ids->z_fgid,
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1837
				    cr, ZFS_GROUP);
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1838
			} else {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1839
				acl_ids->z_fgid = zfs_fuid_create_cred(zfsvfs,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1840
				    ZFS_GROUP, cr, &acl_ids->z_fuidp);
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1841
				gid = crgetgid(cr);
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1842
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1843
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1844
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1845
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1846
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1847
	 * If we're creating a directory, and the parent directory has the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1848
	 * set-GID bit set, set in on the new directory.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1849
	 * Otherwise, if the user is neither privileged nor a member of the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1850
	 * file's new group, clear the file's set-GID bit.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1851
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1852
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1853
	if (!(flag & IS_ROOT_NODE) && (dzp->z_phys->zp_mode & S_ISGID) &&
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1854
	    (vap->va_type == VDIR)) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1855
		acl_ids->z_mode |= S_ISGID;
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  1856
	} else {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1857
		if ((acl_ids->z_mode & S_ISGID) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1858
		    secpolicy_vnode_setids_setgids(cr, gid) != 0)
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1859
			acl_ids->z_mode &= ~S_ISGID;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1860
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1861
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1862
	if (acl_ids->z_aclp == NULL) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1863
		mutex_enter(&dzp->z_lock);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1864
		if (!(flag & IS_ROOT_NODE) && (ZTOV(dzp)->v_type == VDIR &&
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1865
		    (dzp->z_phys->zp_flags & ZFS_INHERIT_ACE)) &&
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1866
		    !(dzp->z_phys->zp_flags & ZFS_XATTR)) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1867
			mutex_enter(&dzp->z_acl_lock);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1868
			VERIFY(0 == zfs_acl_node_read(dzp, &paclp, B_FALSE));
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1869
			mutex_exit(&dzp->z_acl_lock);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1870
			acl_ids->z_aclp = zfs_acl_inherit(zfsvfs,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1871
			    vap->va_type, paclp, acl_ids->z_mode, &need_chmod);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1872
			zfs_acl_free(paclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1873
		} else {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1874
			acl_ids->z_aclp =
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1875
			    zfs_acl_alloc(zfs_acl_version_zp(dzp));
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1876
		}
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1877
		mutex_exit(&dzp->z_lock);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1878
		if (need_chmod) {
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1879
			acl_ids->z_aclp->z_hints = (vap->va_type == VDIR) ?
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1880
			    ZFS_ACL_AUTO_INHERIT : 0;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1881
			zfs_acl_chmod(zfsvfs, acl_ids->z_fuid,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1882
			    acl_ids->z_mode, acl_ids->z_aclp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1883
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1884
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1885
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1886
	return (0);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1887
}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1888
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1889
/*
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1890
 * Free ACL and fuid_infop, but not the acl_ids structure
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1891
 */
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1892
void
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1893
zfs_acl_ids_free(zfs_acl_ids_t *acl_ids)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1894
{
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1895
	if (acl_ids->z_aclp)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1896
		zfs_acl_free(acl_ids->z_aclp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1897
	if (acl_ids->z_fuidp)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1898
		zfs_fuid_info_free(acl_ids->z_fuidp);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1899
	acl_ids->z_aclp = NULL;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1900
	acl_ids->z_fuidp = NULL;
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  1901
}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1902
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1903
boolean_t
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1904
zfs_acl_ids_overquota(zfsvfs_t *zfsvfs, zfs_acl_ids_t *acl_ids)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1905
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1906
	return (zfs_usergroup_overquota(zfsvfs, B_FALSE, acl_ids->z_fuid) ||
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1907
	    zfs_usergroup_overquota(zfsvfs, B_TRUE, acl_ids->z_fgid));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  1908
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1909
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1910
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1911
 * Retrieve a files ACL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1912
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1913
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1914
zfs_getacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1915
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1916
	zfs_acl_t	*aclp;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1917
	ulong_t		mask;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1918
	int		error;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1919
	int 		count = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1920
	int		largeace = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1921
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1922
	mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT |
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1923
	    VSA_ACE_ACLFLAGS | VSA_ACE_ALLTYPES);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1924
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1925
	if (error = zfs_zaccess(zp, ACE_READ_ACL, 0, skipaclchk, cr))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1926
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1927
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1928
	if (mask == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1929
		return (ENOSYS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1930
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1931
	mutex_enter(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1932
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1933
	error = zfs_acl_node_read(zp, &aclp, B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  1934
	if (error != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  1935
		mutex_exit(&zp->z_acl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  1936
		return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  1937
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  1938
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1939
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1940
	 * Scan ACL to determine number of ACEs
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1941
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1942
	if ((zp->z_phys->zp_flags & ZFS_ACL_OBJ_ACE) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1943
	    !(mask & VSA_ACE_ALLTYPES)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1944
		void *zacep = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1945
		uint64_t who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1946
		uint32_t access_mask;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1947
		uint16_t type, iflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1948
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1949
		while (zacep = zfs_acl_next_ace(aclp, zacep,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1950
		    &who, &access_mask, &iflags, &type)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1951
			switch (type) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1952
			case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1953
			case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1954
			case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1955
			case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1956
				largeace++;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1957
				continue;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1958
			default:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1959
				count++;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1960
			}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1961
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1962
		vsecp->vsa_aclcnt = count;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1963
	} else
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1964
		count = aclp->z_acl_count;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1965
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1966
	if (mask & VSA_ACECNT) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1967
		vsecp->vsa_aclcnt = count;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1968
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1969
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1970
	if (mask & VSA_ACE) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1971
		size_t aclsz;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1972
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1973
		zfs_acl_node_t *aclnode = list_head(&aclp->z_acl);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1974
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1975
		aclsz = count * sizeof (ace_t) +
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1976
		    sizeof (ace_object_t) * largeace;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1977
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1978
		vsecp->vsa_aclentp = kmem_alloc(aclsz, KM_SLEEP);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1979
		vsecp->vsa_aclentsz = aclsz;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1980
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1981
		if (aclp->z_version == ZFS_ACL_VERSION_FUID)
5771
7ba3a2c57d6a 6552639 Each zone should have it's own idmapd
jp151216
parents: 5762
diff changeset
  1982
			zfs_copy_fuid_2_ace(zp->z_zfsvfs, aclp, cr,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1983
			    vsecp->vsa_aclentp, !(mask & VSA_ACE_ALLTYPES));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1984
		else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1985
			bcopy(aclnode->z_acldata, vsecp->vsa_aclentp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1986
			    count * sizeof (ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1987
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1988
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1989
	if (mask & VSA_ACE_ACLFLAGS) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1990
		vsecp->vsa_aclflags = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1991
		if (zp->z_phys->zp_flags & ZFS_ACL_DEFAULTED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1992
			vsecp->vsa_aclflags |= ACL_DEFAULTED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1993
		if (zp->z_phys->zp_flags & ZFS_ACL_PROTECTED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1994
			vsecp->vsa_aclflags |= ACL_PROTECTED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1995
		if (zp->z_phys->zp_flags & ZFS_ACL_AUTO_INHERIT)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  1996
			vsecp->vsa_aclflags |= ACL_AUTO_INHERIT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1997
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1998
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1999
	mutex_exit(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2000
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2001
	zfs_acl_free(aclp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2002
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2003
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2004
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2005
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2006
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2007
zfs_vsec_2_aclp(zfsvfs_t *zfsvfs, vtype_t obj_type,
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2008
    vsecattr_t *vsecp, cred_t *cr, zfs_fuid_info_t **fuidp, zfs_acl_t **zaclp)
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2009
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2010
	zfs_acl_t *aclp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2011
	zfs_acl_node_t *aclnode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2012
	int aclcnt = vsecp->vsa_aclcnt;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2013
	int error;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2014
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2015
	if (vsecp->vsa_aclcnt > MAX_ACL_ENTRIES || vsecp->vsa_aclcnt <= 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2016
		return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2017
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2018
	aclp = zfs_acl_alloc(zfs_acl_version(zfsvfs->z_version));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2019
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2020
	aclp->z_hints = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2021
	aclnode = zfs_acl_node_alloc(aclcnt * sizeof (zfs_object_ace_t));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2022
	if (aclp->z_version == ZFS_ACL_VERSION_INITIAL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2023
		if ((error = zfs_copy_ace_2_oldace(obj_type, aclp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2024
		    (ace_t *)vsecp->vsa_aclentp, aclnode->z_acldata,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2025
		    aclcnt, &aclnode->z_size)) != 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2026
			zfs_acl_free(aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2027
			zfs_acl_node_free(aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2028
			return (error);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2029
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2030
	} else {
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2031
		if ((error = zfs_copy_ace_2_fuid(zfsvfs, obj_type, aclp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2032
		    vsecp->vsa_aclentp, aclnode->z_acldata, aclcnt,
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2033
		    &aclnode->z_size, fuidp, cr)) != 0) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2034
			zfs_acl_free(aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2035
			zfs_acl_node_free(aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2036
			return (error);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2037
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2038
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2039
	aclp->z_acl_bytes = aclnode->z_size;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2040
	aclnode->z_ace_count = aclcnt;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2041
	aclp->z_acl_count = aclcnt;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2042
	list_insert_head(&aclp->z_acl, aclnode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2043
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2044
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2045
	 * If flags are being set then add them to z_hints
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2046
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2047
	if (vsecp->vsa_mask & VSA_ACE_ACLFLAGS) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2048
		if (vsecp->vsa_aclflags & ACL_PROTECTED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2049
			aclp->z_hints |= ZFS_ACL_PROTECTED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2050
		if (vsecp->vsa_aclflags & ACL_DEFAULTED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2051
			aclp->z_hints |= ZFS_ACL_DEFAULTED;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2052
		if (vsecp->vsa_aclflags & ACL_AUTO_INHERIT)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2053
			aclp->z_hints |= ZFS_ACL_AUTO_INHERIT;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2054
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2055
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2056
	*zaclp = aclp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2057
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2058
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2059
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2060
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2061
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2062
 * Set a files ACL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2063
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2065
zfs_setacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2066
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2067
	zfsvfs_t	*zfsvfs = zp->z_zfsvfs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2068
	zilog_t		*zilog = zfsvfs->z_log;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2069
	ulong_t		mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2070
	dmu_tx_t	*tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2071
	int		error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2072
	zfs_acl_t	*aclp;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2073
	zfs_fuid_info_t	*fuidp = NULL;
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2074
	boolean_t	fuid_dirtied;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2075
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2076
	if (mask == 0)
4300
d74de773d6e6 6528189 cp -p invalid argument issue on Redhat linux AS 3.0 NFS client against ZFS NFS directory
marks
parents: 2676
diff changeset
  2077
		return (ENOSYS);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2078
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2079
	if (zp->z_phys->zp_flags & ZFS_IMMUTABLE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2080
		return (EPERM);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2081
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2082
	if (error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2083
		return (error);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2084
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2085
	error = zfs_vsec_2_aclp(zfsvfs, ZTOV(zp)->v_type, vsecp, cr, &fuidp,
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2086
	    &aclp);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2087
	if (error)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2088
		return (error);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2089
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2090
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2091
	 * If ACL wide flags aren't being set then preserve any
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2092
	 * existing flags.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2093
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2094
	if (!(vsecp->vsa_mask & VSA_ACE_ACLFLAGS)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2095
		aclp->z_hints |= (zp->z_phys->zp_flags & V4_ACL_WIDE_FLAGS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2096
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2097
top:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2098
	if (error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2099
		zfs_acl_free(aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2100
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2101
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2102
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2103
	mutex_enter(&zp->z_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2104
	mutex_enter(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2105
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2106
	tx = dmu_tx_create(zfsvfs->z_os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2107
	dmu_tx_hold_bonus(tx, zp->z_id);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2108
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2109
	if (zp->z_phys->zp_acl.z_acl_extern_obj) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2110
		/* Are we upgrading ACL? */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2111
		if (zfsvfs->z_version <= ZPL_VERSION_FUID &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2112
		    zp->z_phys->zp_acl.z_acl_version ==
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2113
		    ZFS_ACL_VERSION_INITIAL) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2114
			dmu_tx_hold_free(tx,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2115
			    zp->z_phys->zp_acl.z_acl_extern_obj,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2116
			    0, DMU_OBJECT_END);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2117
			dmu_tx_hold_write(tx, DMU_NEW_OBJECT,
5824
1d2d522d19b5 6603908 can't change mode if FS/dir is out of quota
marks
parents: 5771
diff changeset
  2118
			    0, aclp->z_acl_bytes);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2119
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2120
			dmu_tx_hold_write(tx,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2121
			    zp->z_phys->zp_acl.z_acl_extern_obj,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2122
			    0, aclp->z_acl_bytes);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2123
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2124
	} else if (aclp->z_acl_bytes > ZFS_ACE_SPACE) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2125
		dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, aclp->z_acl_bytes);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2126
	}
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2127
	fuid_dirtied = zfsvfs->z_fuid_dirty;
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  2128
	if (fuid_dirtied)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9179
diff changeset
  2129
		zfs_fuid_txhold(zfsvfs, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2130
8227
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 8053
diff changeset
  2131
	error = dmu_tx_assign(tx, TXG_NOWAIT);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2132
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2133
		mutex_exit(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2134
		mutex_exit(&zp->z_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2135
8227
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 8053
diff changeset
  2136
		if (error == ERESTART) {
2113
0510bb40c993 6430121 3-way deadlock involving tc_lock within zfs
ahrens
parents: 2058
diff changeset
  2137
			dmu_tx_wait(tx);
0510bb40c993 6430121 3-way deadlock involving tc_lock within zfs
ahrens
parents: 2058
diff changeset
  2138
			dmu_tx_abort(tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2139
			goto top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2140
		}
2113
0510bb40c993 6430121 3-way deadlock involving tc_lock within zfs
ahrens
parents: 2058
diff changeset
  2141
		dmu_tx_abort(tx);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2142
		zfs_acl_free(aclp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2143
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2144
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2145
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2146
	error = zfs_aclset_common(zp, aclp, cr, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2147
	ASSERT(error == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2148
9179
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2149
	if (fuid_dirtied)
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2150
		zfs_fuid_sync(zfsvfs, tx);
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2151
d8fbd96b79b3 6790064 zfs needs to determine uid and gid earlier in create process
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8952
diff changeset
  2152
	zfs_time_stamper_locked(zp, STATE_CHANGED, tx);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2153
	zfs_log_acl(zilog, tx, zp, vsecp, fuidp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2154
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2155
	if (fuidp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2156
		zfs_fuid_info_free(fuidp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2157
	zfs_acl_free(aclp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2158
	dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2159
done:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2160
	mutex_exit(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2161
	mutex_exit(&zp->z_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2163
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2164
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2165
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2166
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2167
 * working_mode returns the permissions that were not granted
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2168
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2169
static int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2170
zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2171
    boolean_t *check_privs, boolean_t skipaclchk, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2172
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2173
	zfs_acl_t	*aclp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2174
	zfsvfs_t	*zfsvfs = zp->z_zfsvfs;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2175
	int		error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2176
	uid_t		uid = crgetuid(cr);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2177
	uint64_t 	who;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2178
	uint16_t	type, iflags;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2179
	uint16_t	entry_type;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2180
	uint32_t	access_mask;
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2181
	uint32_t	deny_mask = 0;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2182
	zfs_ace_hdr_t	*acep = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2183
	boolean_t	checkit;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2184
	uid_t		fowner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2185
	uid_t		gowner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2186
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2187
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2188
	 * Short circuit empty requests
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2189
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2190
	if (v4_mode == 0)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2191
		return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2192
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2193
	*check_privs = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2194
8227
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 8053
diff changeset
  2195
	if (zfsvfs->z_replay) {
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2604
diff changeset
  2196
		*working_mode = 0;
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2604
diff changeset
  2197
		return (0);
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2604
diff changeset
  2198
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2199
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2604
diff changeset
  2200
	*working_mode = v4_mode;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2202
	if ((v4_mode & WRITE_MASK) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2203
	    (zp->z_zfsvfs->z_vfs->vfs_flag & VFS_RDONLY) &&
8952
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
  2204
	    (!IS_DEVVP(ZTOV(zp)) ||
c2f95230b0ff 6809529 dirtying snapshot! rears its head again
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
  2205
	    (IS_DEVVP(ZTOV(zp)) && (v4_mode & WRITE_MASK_ATTRS)))) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2206
		*check_privs = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2207
		return (EROFS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2208
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2209
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2210
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2211
	 * Only check for READONLY on non-directories.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2212
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2213
	if ((v4_mode & WRITE_MASK_DATA) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2214
	    (((ZTOV(zp)->v_type != VDIR) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2215
	    (zp->z_phys->zp_flags & (ZFS_READONLY | ZFS_IMMUTABLE))) ||
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2216
	    (ZTOV(zp)->v_type == VDIR &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2217
	    (zp->z_phys->zp_flags & ZFS_IMMUTABLE)))) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2218
		*check_privs = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2219
		return (EPERM);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2220
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2221
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2222
	if ((v4_mode & (ACE_DELETE | ACE_DELETE_CHILD)) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2223
	    (zp->z_phys->zp_flags & ZFS_NOUNLINK)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2224
		*check_privs = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2225
		return (EPERM);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2226
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2227
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2228
	if (((v4_mode & (ACE_READ_DATA|ACE_EXECUTE)) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2229
	    (zp->z_phys->zp_flags & ZFS_AV_QUARANTINED))) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2230
		*check_privs = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2231
		return (EACCES);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2232
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2233
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2234
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2235
	 * The caller requested that the ACL check be skipped.  This
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2236
	 * would only happen if the caller checked VOP_ACCESS() with a
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2237
	 * 32 bit ACE mask and already had the appropriate permissions.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2238
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2239
	if (skipaclchk) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2240
		*working_mode = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2241
		return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2242
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2243
5771
7ba3a2c57d6a 6552639 Each zone should have it's own idmapd
jp151216
parents: 5762
diff changeset
  2244
	zfs_fuid_map_ids(zp, cr, &fowner, &gowner);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2245
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2246
	mutex_enter(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2247
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2248
	error = zfs_acl_node_read(zp, &aclp, B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2249
	if (error != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2250
		mutex_exit(&zp->z_acl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2251
		return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2252
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1308
diff changeset
  2253
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2254
	while (acep = zfs_acl_next_ace(aclp, acep, &who, &access_mask,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2255
	    &iflags, &type)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2256
7559
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
  2257
		if (!zfs_acl_valid_ace_type(type, iflags))
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
  2258
			continue;
a2e9a3201169 6746456 ZFS doesn't inherit old ACLs correctly on upgraded file system
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7328
diff changeset
  2259
7057
d3fa1d6dbef7 PSARC/2008/342 Further SID support
marks
parents: 6385
diff changeset
  2260
		if (ZTOV(zp)->v_type == VDIR && (iflags & ACE_INHERIT_ONLY_ACE))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2261
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2262
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2263
		entry_type = (iflags & ACE_TYPE_FLAGS);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2264
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2265
		checkit = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2266
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2267
		switch (entry_type) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2268
		case ACE_OWNER:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2269
			if (uid == fowner)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2270
				checkit = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2271
			break;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2272
		case OWNING_GROUP:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2273
			who = gowner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2274
			/*FALLTHROUGH*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2275
		case ACE_IDENTIFIER_GROUP:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2276
			checkit = zfs_groupmember(zfsvfs, who, cr);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2277
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2278
		case ACE_EVERYONE:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2279
			checkit = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2280
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2281
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2282
		/* USER Entry */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2283
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2284
			if (entry_type == 0) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2285
				uid_t newid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2286
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2287
				newid = zfs_fuid_map_id(zfsvfs, who, cr,
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2288
				    ZFS_ACE_USER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2289
				if (newid != IDMAP_WK_CREATOR_OWNER_UID &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2290
				    uid == newid)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2291
					checkit = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2292
				break;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2293
			} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2294
				zfs_acl_free(aclp);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2295
				mutex_exit(&zp->z_acl_lock);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2296
				return (EIO);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2297
			}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2298
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2299
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2300
		if (checkit) {
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2301
			uint32_t mask_matched = (access_mask & *working_mode);
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2302
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2303
			if (mask_matched) {
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2304
				if (type == DENY)
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2305
					deny_mask |= mask_matched;
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2306
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2307
				*working_mode &= ~mask_matched;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2308
			}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2309
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2310
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2311
		/* Are we done? */
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2312
		if (*working_mode == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2313
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2314
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2315
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2316
	mutex_exit(&zp->z_acl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2317
	zfs_acl_free(aclp);
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2318
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2319
	/* Put the found 'denies' back on the working mode */
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2320
	if (deny_mask) {
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2321
		*working_mode |= deny_mask;
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2322
		return (EACCES);
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2323
	} else if (*working_mode) {
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2324
		return (-1);
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2325
	}
6056
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2326
37f30782c577 6664536 zfs O_RDWR access check more stringent than tmpfs or ufs
marks
parents: 5959
diff changeset
  2327
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2328
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2329
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2330
static int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2331
zfs_zaccess_append(znode_t *zp, uint32_t *working_mode, boolean_t *check_privs,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2332
    cred_t *cr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2333
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2334
	if (*working_mode != ACE_WRITE_DATA)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2335
		return (EACCES);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2336
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2337
	return (zfs_zaccess_common(zp, ACE_APPEND_DATA, working_mode,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2338
	    check_privs, B_FALSE, cr));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2339
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2340
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2341
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2342
 * Determine whether Access should be granted/denied, invoking least
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2343
 * priv subsytem when a deny is determined.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2344
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2345
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2346
zfs_zaccess(znode_t *zp, int mode, int flags, boolean_t skipaclchk, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2347
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2348
	uint32_t	working_mode;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2349
	int		error;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2350
	int		is_attr;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2351
	zfsvfs_t	*zfsvfs = zp->z_zfsvfs;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2352
	boolean_t 	check_privs;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2353
	znode_t		*xzp;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2354
	znode_t 	*check_zp = zp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2355
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2356
	is_attr = ((zp->z_phys->zp_flags & ZFS_XATTR) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2357
	    (ZTOV(zp)->v_type == VDIR));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2358
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2359
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2360
	 * If attribute then validate against base file
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2361
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2362
	if (is_attr) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2363
		if ((error = zfs_zget(zp->z_zfsvfs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2364
		    zp->z_phys->zp_parent, &xzp)) != 0)	{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2365
			return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2366
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2367
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2368
		check_zp = xzp;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2369
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2370
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2371
		 * fixup mode to map to xattr perms
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2372
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2373
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2374
		if (mode & (ACE_WRITE_DATA|ACE_APPEND_DATA)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2375
			mode &= ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2376
			mode |= ACE_WRITE_NAMED_ATTRS;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2377
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2379
		if (mode & (ACE_READ_DATA|ACE_EXECUTE)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2380
			mode &= ~(ACE_READ_DATA|ACE_EXECUTE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2381
			mode |= ACE_READ_NAMED_ATTRS;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2382
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2383
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2384
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2385
	if ((error = zfs_zaccess_common(check_zp, mode, &working_mode,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2386
	    &check_privs, skipaclchk, cr)) == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2387
		if (is_attr)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2388
			VN_RELE(ZTOV(xzp));
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2389
		return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2390
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2391
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2392
	if (error && !check_privs) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2393
		if (is_attr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2394
			VN_RELE(ZTOV(xzp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2395
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2396
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2397
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2398
	if (error && (flags & V_APPEND)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2399
		error = zfs_zaccess_append(zp, &working_mode, &check_privs, cr);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2400
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2401
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2402
	if (error && check_privs) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2403
		uid_t		owner;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2404
		mode_t		checkmode = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2405
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2406
		owner = zfs_fuid_map_id(zfsvfs, check_zp->z_phys->zp_uid, cr,
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2407
		    ZFS_OWNER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2408
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2409
		/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2410
		 * First check for implicit owner permission on
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2411
		 * read_acl/read_attributes
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2412
		 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2413
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2414
		error = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2415
		ASSERT(working_mode != 0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2416
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2417
		if ((working_mode & (ACE_READ_ACL|ACE_READ_ATTRIBUTES) &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2418
		    owner == crgetuid(cr)))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2419
			working_mode &= ~(ACE_READ_ACL|ACE_READ_ATTRIBUTES);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2420
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2421
		if (working_mode & (ACE_READ_DATA|ACE_READ_NAMED_ATTRS|
7624
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2422
		    ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_SYNCHRONIZE))
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2423
			checkmode |= VREAD;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2424
		if (working_mode & (ACE_WRITE_DATA|ACE_WRITE_NAMED_ATTRS|
7624
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2425
		    ACE_APPEND_DATA|ACE_WRITE_ATTRIBUTES|ACE_SYNCHRONIZE))
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2426
			checkmode |= VWRITE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2427
		if (working_mode & ACE_EXECUTE)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2428
			checkmode |= VEXEC;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2429
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2430
		if (checkmode)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2431
			error = secpolicy_vnode_access(cr, ZTOV(check_zp),
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2432
			    owner, checkmode);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2433
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2434
		if (error == 0 && (working_mode & ACE_WRITE_OWNER))
7624
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2435
			error = secpolicy_vnode_chown(cr, B_TRUE);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2436
		if (error == 0 && (working_mode & ACE_WRITE_ACL))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2437
			error = secpolicy_vnode_setdac(cr, owner);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2438
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2439
		if (error == 0 && (working_mode &
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2440
		    (ACE_DELETE|ACE_DELETE_CHILD)))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2441
			error = secpolicy_vnode_remove(cr);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2442
7624
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2443
		if (error == 0 && (working_mode & ACE_SYNCHRONIZE)) {
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2444
			error = secpolicy_vnode_chown(cr, B_FALSE);
0a59f685e81b 6744510 Should not allow to rename a file/folder when a user does not have permission
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 7559
diff changeset
  2445
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2446
		if (error == 0) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2447
			/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2448
			 * See if any bits other than those already checked
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2449
			 * for are still present.  If so then return EACCES
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2450
			 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2451
			if (working_mode & ~(ZFS_CHECKED_MASKS)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2452
				error = EACCES;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2453
			}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2454
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2455
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2456
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2457
	if (is_attr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2458
		VN_RELE(ZTOV(xzp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2459
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2460
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2461
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2462
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2463
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2464
 * Translate traditional unix VREAD/VWRITE/VEXEC mode into
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2465
 * native ACL format and call zfs_zaccess()
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2466
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2467
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2468
zfs_zaccess_rwx(znode_t *zp, mode_t mode, int flags, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2469
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2470
	return (zfs_zaccess(zp, zfs_unix_to_v4(mode >> 6), flags, B_FALSE, cr));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2471
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2472
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2473
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2474
 * Access function for secpolicy_vnode_setattr
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2475
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2476
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2477
zfs_zaccess_unix(znode_t *zp, mode_t mode, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2478
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2479
	int v4_mode = zfs_unix_to_v4(mode >> 6);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2480
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2481
	return (zfs_zaccess(zp, v4_mode, 0, B_FALSE, cr));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2482
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2483
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2484
static int
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2485
zfs_delete_final_check(znode_t *zp, znode_t *dzp,
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2486
    mode_t missing_perms, cred_t *cr)
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2487
{
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2488
	int error;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2489
	uid_t downer;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2490
	zfsvfs_t *zfsvfs = zp->z_zfsvfs;
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2491
5959
1e1904b8526d 6650192 zfs ACL/fuid code could use some minor cleanup
marks
parents: 5824
diff changeset
  2492
	downer = zfs_fuid_map_id(zfsvfs, dzp->z_phys->zp_uid, cr, ZFS_OWNER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2493
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2494
	error = secpolicy_vnode_access(cr, ZTOV(dzp), downer, missing_perms);
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2495
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2496
	if (error == 0)
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2497
		error = zfs_sticky_remove_access(dzp, zp, cr);
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2498
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2499
	return (error);
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2500
}
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2501
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2502
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2503
 * Determine whether Access should be granted/deny, without
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2504
 * consulting least priv subsystem.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2505
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2506
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2507
 * The following chart is the recommended NFSv4 enforcement for
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2508
 * ability to delete an object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2509
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2510
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2511
 *      |   Parent Dir  |           Target Object Permissions |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2512
 *      |  permissions  |                                     |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2513
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2514
 *      |               | ACL Allows | ACL Denies| Delete     |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2515
 *      |               |  Delete    |  Delete   | unspecified|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2516
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2517
 *      |  ACL Allows   | Permit     | Permit    | Permit     |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2518
 *      |  DELETE_CHILD |                                     |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2519
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2520
 *      |  ACL Denies   | Permit     | Deny      | Deny       |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2521
 *      |  DELETE_CHILD |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2522
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2523
 *      | ACL specifies |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2524
 *      | only allow    | Permit     | Permit    | Permit     |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2525
 *      | write and     |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2526
 *      | execute       |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2527
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2528
 *      | ACL denies    |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2529
 *      | write and     | Permit     | Deny      | Deny       |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2530
 *      | execute       |            |           |            |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2531
 *      -------------------------------------------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2532
 *         ^
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2533
 *         |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2534
 *         No search privilege, can't even look up file?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2535
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2536
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2537
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2538
zfs_zaccess_delete(znode_t *dzp, znode_t *zp, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2539
{
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2540
	uint32_t dzp_working_mode = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2541
	uint32_t zp_working_mode = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2542
	int dzp_error, zp_error;
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2543
	mode_t missing_perms;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2544
	boolean_t dzpcheck_privs = B_TRUE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2545
	boolean_t zpcheck_privs = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2546
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2547
	/*
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2548
	 * We want specific DELETE permissions to
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2549
	 * take precedence over WRITE/EXECUTE.  We don't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2550
	 * want an ACL such as this to mess us up.
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2551
	 * user:joe:write_data:deny,user:joe:delete:allow
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2552
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2553
	 * However, deny permissions may ultimately be overridden
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2554
	 * by secpolicy_vnode_access().
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2555
	 *
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2556
	 * We will ask for all of the necessary permissions and then
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2557
	 * look at the working modes from the directory and target object
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2558
	 * to determine what was found.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2559
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2560
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2561
	if (zp->z_phys->zp_flags & (ZFS_IMMUTABLE | ZFS_NOUNLINK))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2562
		return (EPERM);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2563
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2564
	/*
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2565
	 * First row
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2566
	 * If the directory permissions allow the delete, we are done.
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2567
	 */
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2568
	if ((dzp_error = zfs_zaccess_common(dzp, ACE_DELETE_CHILD,
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2569
	    &dzp_working_mode, &dzpcheck_privs, B_FALSE, cr)) == 0)
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2570
		return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2571
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2572
	/*
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2573
	 * If target object has delete permission then we are done
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2574
	 */
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2575
	if ((zp_error = zfs_zaccess_common(zp, ACE_DELETE, &zp_working_mode,
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2576
	    &zpcheck_privs, B_FALSE, cr)) == 0)
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2577
		return (0);
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2578
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2579
	ASSERT(dzp_error && zp_error);
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2580
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2581
	if (!dzpcheck_privs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2582
		return (dzp_error);
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2583
	if (!zpcheck_privs)
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2584
		return (zp_error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2585
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2586
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2587
	 * Second row
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2588
	 *
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2589
	 * If directory returns EACCES then delete_child was denied
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2590
	 * due to deny delete_child.  In this case send the request through
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2591
	 * secpolicy_vnode_remove().  We don't use zfs_delete_final_check()
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2592
	 * since that *could* allow the delete based on write/execute permission
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2593
	 * and we want delete permissions to override write/execute.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2594
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2595
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2596
	if (dzp_error == EACCES)
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2597
		return (secpolicy_vnode_remove(cr));
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2598
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2599
	/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2600
	 * Third Row
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2601
	 * only need to see if we have write/execute on directory.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2602
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2603
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2604
	if ((dzp_error = zfs_zaccess_common(dzp, ACE_EXECUTE|ACE_WRITE_DATA,
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2605
	    &dzp_working_mode, &dzpcheck_privs, B_FALSE, cr)) == 0)
2604
b2fb13f56fe7 6461609 zfs delete permissions are not working correctly
marks
parents: 2113
diff changeset
  2606
		return (zfs_sticky_remove_access(dzp, zp, cr));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2607
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2608
	if (!dzpcheck_privs)
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2609
		return (dzp_error);
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2610
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2611
	/*
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2612
	 * Fourth row
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2613
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2614
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2615
	missing_perms = (dzp_working_mode & ACE_WRITE_DATA) ? VWRITE : 0;
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2616
	missing_perms |= (dzp_working_mode & ACE_EXECUTE) ? VEXEC : 0;
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2617
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2618
	ASSERT(missing_perms);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2619
6257
0c7475fa4852 6674548 zfs_delete_final_check calls secpolicy_vnode_access on wrong vnode
marks
parents: 6056
diff changeset
  2620
	return (zfs_delete_final_check(zp, dzp, missing_perms, cr));
7163
b0960f193b35 6723181 delete deny permissions broken
marks
parents: 7057
diff changeset
  2621
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2622
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2623
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2624
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2625
zfs_zaccess_rename(znode_t *sdzp, znode_t *szp, znode_t *tdzp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2626
    znode_t *tzp, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2627
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2628
	int add_perm;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2629
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2630
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2631
	if (szp->z_phys->zp_flags & ZFS_AV_QUARANTINED)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2632
		return (EACCES);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2633
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2634
	add_perm = (ZTOV(szp)->v_type == VDIR) ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2635
	    ACE_ADD_SUBDIRECTORY : ACE_ADD_FILE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2637
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2638
	 * Rename permissions are combination of delete permission +
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2639
	 * add file/subdir permission.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2640
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2641
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2642
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2643
	 * first make sure we do the delete portion.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2644
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2645
	 * If that succeeds then check for add_file/add_subdir permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2646
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2647
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2648
	if (error = zfs_zaccess_delete(sdzp, szp, cr))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2649
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2650
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2651
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2652
	 * If we have a tzp, see if we can delete it?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2653
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2654
	if (tzp) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2655
		if (error = zfs_zaccess_delete(tdzp, tzp, cr))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2656
			return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2657
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2658
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2659
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2660
	 * Now check for add permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2661
	 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4869
diff changeset
  2662
	error = zfs_zaccess(tdzp, add_perm, 0, B_FALSE, cr);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2664
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2665
}