usr/src/uts/common/fs/fs_subr.c
author ahrens
Mon, 31 Oct 2005 11:33:35 -0800
changeset 789 b348f31ed315
parent 0 68f95e015346
child 2051 50a87bae0c3a
permissions -rw-r--r--
PSARC 2002/240 ZFS 6338653 Integrate ZFS PSARC 2004/652 - DKIOCFLUSH 5096886 Write caching disks need mechanism to flush cache to physical media
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
    27
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * Generic vnode operations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/flock.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/statvfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/vfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/poll.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <fs/fs_subr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/acl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/share.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/nbmlock.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
    60
#include <acl/acl_common.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static callb_cpr_t *frlock_serialize_blocked(flk_cb_when_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 * The associated operation is not supported by the file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
fs_nosys()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	return (ENOSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 * The associated operation is invalid (on this vnode).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
fs_inval()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * The associated operation is valid only for directories.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
fs_notdir()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	return (ENOTDIR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * Free the file system specific resources. For the file systems that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * do not support the forced unmount, it will be a nop function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
fs_freevfs(vfs_t *vfsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
fs_nosys_map(struct vnode *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	offset_t off,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	struct as *as,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	caddr_t *addrp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	size_t len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	uchar_t prot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	uchar_t maxprot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	uint_t flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	struct cred *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	return (ENOSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
fs_nosys_addmap(struct vnode *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	offset_t off,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	struct as *as,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	caddr_t addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	size_t len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	uchar_t prot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	uchar_t maxprot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	uint_t flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	struct cred *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	return (ENOSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
fs_nosys_poll(vnode_t *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	register short events,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	int anyyet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	register short *reventsp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	struct pollhead **phpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	return (ENOSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
 * The file system has nothing to sync to disk.  However, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 * VFS_SYNC operation must not fail.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
fs_sync(struct vfs *vfspp, short flag, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * Read/write lock/unlock.  Does nothing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
fs_rwlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
fs_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
 * Compare two vnodes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
fs_cmp(vnode_t *vp1, vnode_t *vp2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	return (vp1 == vp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
 * No-op seek operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
fs_seek(vnode_t *vp, offset_t ooff, offset_t *noffp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	return ((*noffp < 0 || *noffp > MAXOFFSET_T) ? EINVAL : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 * File and record locking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
fs_frlock(register vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	offset_t offset, flk_callback_t *flk_cbp, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	int frcmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	int nlmid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	flk_callback_t serialize_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	int serialize = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	case F_GETLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	case F_O_GETLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		if (flag & F_REMOTELOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
			frcmd = RCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		if (flag & F_PXFSLOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			frcmd = PCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		bfp->l_pid = ttoproc(curthread)->p_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		bfp->l_sysid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		frcmd = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	case F_SETLK_NBMAND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		 * Are NBMAND locks allowed on this file?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		if (!vp->v_vfsp ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		    !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		if (vp->v_type != VREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	case F_SETLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		 * Check whether there is an NBMAND share reservation that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		 * conflicts with the lock request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		if (nbl_need_check(vp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			serialize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
			if (share_blocks_lock(vp, bfp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				error = EAGAIN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		if (flag & F_REMOTELOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			frcmd = SETFLCK|RCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		if (flag & F_PXFSLOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			frcmd = SETFLCK|PCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		bfp->l_pid = ttoproc(curthread)->p_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		bfp->l_sysid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		frcmd = SETFLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		if (cmd == F_SETLK_NBMAND &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		    (bfp->l_type == F_RDLCK || bfp->l_type == F_WRLCK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			/* would check here for conflict with mapped region */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			frcmd |= NBMLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	case F_SETLKW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		 * If there is an NBMAND share reservation that conflicts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		 * with the lock request, block until the conflicting share
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		 * reservation goes away.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		if (nbl_need_check(vp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
			serialize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
			if (share_blocks_lock(vp, bfp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
				error = wait_for_share(vp, bfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
				if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
					goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		if (flag & F_REMOTELOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
			frcmd = SETFLCK|SLPFLCK|RCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		if (flag & F_PXFSLOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
			frcmd = SETFLCK|SLPFLCK|PCMDLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		bfp->l_pid = ttoproc(curthread)->p_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		bfp->l_sysid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		frcmd = SETFLCK|SLPFLCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	case F_HASREMOTELOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		nlmid = GETNLMID(bfp->l_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		if (nlmid != 0) {	/* booted as a cluster */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			l_has_rmt(bfp) =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
				cl_flk_has_remote_locks_for_nlmid(vp, nlmid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		} else {		/* not booted as a cluster */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
			l_has_rmt(bfp) = flk_has_remote_locks(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	 * If this is a blocking lock request and we're serializing lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	 * requests, modify the callback list to leave the critical region
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	 * while we're waiting for the lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	if (serialize && (frcmd & SLPFLCK) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		flk_add_callback(&serialize_callback,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
				frlock_serialize_blocked, vp, flk_cbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		flk_cbp = &serialize_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	error = reclock(vp, bfp, frcmd, flag, offset, flk_cbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	if (serialize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
 * Callback when a lock request blocks and we are serializing requests.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
 * before sleeping, leave the critical region.  If after wakeup, reenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
 * the critical region.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
static callb_cpr_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
frlock_serialize_blocked(flk_cb_when_t when, void *infop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	vnode_t *vp = (vnode_t *)infop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	if (when == FLK_BEFORE_SLEEP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
 * Allow any flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
fs_setfl(vnode_t *vp, int oflags, int nflags, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
 * Return the answer requested to poll() for non-device files.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
 * Only POLLIN, POLLRDNORM, and POLLOUT are recognized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
struct pollhead fs_pollhd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
fs_poll(vnode_t *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	register short events,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	int anyyet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	register short *reventsp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	struct pollhead **phpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	*reventsp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	if (events & POLLIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		*reventsp |= POLLIN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	if (events & POLLRDNORM)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		*reventsp |= POLLRDNORM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	if (events & POLLRDBAND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		*reventsp |= POLLRDBAND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	if (events & POLLOUT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		*reventsp |= POLLOUT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	if (events & POLLWRBAND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		*reventsp |= POLLWRBAND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	*phpp = !anyyet && !*reventsp ? &fs_pollhd : (struct pollhead *)NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
 * POSIX pathconf() support.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
fs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	register ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	register int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	struct statvfs64 vfsbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	case _PC_LINK_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		val = MAXLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	case _PC_MAX_CANON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		val = MAX_CANON;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	case _PC_MAX_INPUT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		val = MAX_INPUT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	case _PC_NAME_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		bzero(&vfsbuf, sizeof (vfsbuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		if (error = VFS_STATVFS(vp->v_vfsp, &vfsbuf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		val = vfsbuf.f_namemax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	case _PC_PATH_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	case _PC_SYMLINK_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		val = MAXPATHLEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	case _PC_PIPE_BUF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		val = PIPE_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	case _PC_NO_TRUNC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
		if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
			val = 1;	/* NOTRUNC is enabled for vp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
			val = (ulong_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	case _PC_VDISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		val = _POSIX_VDISABLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	case _PC_CHOWN_RESTRICTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		if (rstchown)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
			val = rstchown; /* chown restricted enabled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
			val = (ulong_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	case _PC_FILESIZEBITS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		 * If ever we come here it means that underlying file system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		 * does not recognise the command and therefore this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		 * configurable limit cannot be determined. We return -1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		 * and don't change errno.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		val = (ulong_t)-1;    /* large file support */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	case _PC_ACL_ENABLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		val = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	if (error == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		*valp = val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
 * Dispose of a page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
fs_dispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	ASSERT(fl == B_FREE || fl == B_INVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	if (fl == B_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		page_free(pp, dn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		page_destroy(pp, dn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
fs_nodispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	cmn_err(CE_PANIC, "fs_nodispose invoked");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
 * fabricate acls for file systems that do not support acls.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
fs_fab_acl(vp, vsecattr, flag, cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
vnode_t		*vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
vsecattr_t	*vsecattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
int		flag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
cred_t		*cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	aclent_t	*aclentp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	struct vattr	vattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	int		error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	vsecattr->vsa_aclcnt	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	vsecattr->vsa_aclentp	= NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	vsecattr->vsa_dfaclcnt	= 0;	/* Default ACLs are not fabricated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	vsecattr->vsa_dfaclentp	= NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	if (vsecattr->vsa_mask & (VSA_ACLCNT | VSA_ACL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
		vsecattr->vsa_aclcnt	= 4; /* USER, GROUP, OTHER, and CLASS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	if (vsecattr->vsa_mask & VSA_ACL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		vsecattr->vsa_aclentp = kmem_zalloc(4 * sizeof (aclent_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
		    KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		vattr.va_mask = AT_MODE | AT_UID | AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		if (error = VOP_GETATTR(vp, &vattr, 0, CRED()))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
			return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		aclentp = vsecattr->vsa_aclentp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		aclentp->a_type = USER_OBJ;	/* Owner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0700)) >> 6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		aclentp->a_id = vattr.va_uid;   /* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		aclentp->a_type = GROUP_OBJ;    /* Group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0070)) >> 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		aclentp->a_id = vattr.va_gid;   /* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		aclentp->a_type = OTHER_OBJ;    /* Other */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		aclentp->a_perm = vattr.va_mode & 0007;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		aclentp->a_id = -1;		/* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		aclentp->a_type = CLASS_OBJ;    /* Class */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
		aclentp->a_perm = (ushort_t)(0777);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
		aclentp->a_id = -1;		/* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
 * Common code for implementing DOS share reservations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
/* ARGSUSED4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
fs_shrlock(struct vnode *vp, int cmd, struct shrlock *shr, int flag, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	 * Make sure that the file was opened with permissions appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	 * for the request, and make sure the caller isn't trying to sneak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	 * in an NBMAND request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	if (cmd == F_SHARE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		if (((shr->s_access & F_RDACC) && (flag & FREAD) == 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		    ((shr->s_access & F_WRACC) && (flag & FWRITE) == 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			return (EBADF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		if (shr->s_deny & F_MANDDNY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	if (cmd == F_SHARE_NBMAND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		/* must have write permission to deny read access */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
		if ((shr->s_deny & F_RDDNY) && (flag & FWRITE) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			return (EBADF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		/* make sure nbmand is allowed on the file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		if (!vp->v_vfsp ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		    !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		if (vp->v_type != VREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	case F_SHARE_NBMAND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		shr->s_deny |= F_MANDDNY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	case F_SHARE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		error = add_share(vp, shr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	case F_UNSHARE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		error = del_share(vp, shr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	case F_HASREMOTELOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
		 * We are overloading this command to refer to remote
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		 * shares as well as remote locks, despite its name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		shr->s_access = shr_has_remote_shares(vp, shr->s_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
/*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
fs_vnevent_nosupport(vnode_t *vp, vnevent_t vnevent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
/*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
fs_vnevent_support(vnode_t *vp, vnevent_t vnevent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   637
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   638
 * return 1 for non-trivial ACL.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   639
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   640
 * NB: It is not necessary for the caller to VOP_RWLOCK since
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   641
 *	we only issue VOP_GETSECATTR.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   642
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   643
 * Returns 0 == trivial
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   644
 *         1 == NOT Trivial
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   645
 *	   <0 could not determine.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   646
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   647
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   648
fs_acl_nontrivial(vnode_t *vp, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   649
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   650
	ulong_t		acl_styles;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   651
	ulong_t		acl_flavor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   652
	vsecattr_t 	vsecattr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   653
	int 		error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   654
	int		isnontrivial;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   655
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   656
	/* determine the forms of ACLs maintained */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   657
	error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &acl_styles, cr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   658
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   659
	/* clear bits we don't understand and establish default acl_style */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   660
	acl_styles &= (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   661
	if (error || (acl_styles == 0))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   662
		acl_styles = _ACL_ACLENT_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   664
	vsecattr.vsa_aclentp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   665
	vsecattr.vsa_dfaclentp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   666
	vsecattr.vsa_aclcnt = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   667
	vsecattr.vsa_dfaclcnt = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   668
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   669
	while (acl_styles) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   670
		/* select one of the styles as current flavor */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   671
		acl_flavor = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   672
		if (acl_styles & _ACL_ACLENT_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   673
			acl_flavor = _ACL_ACLENT_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   674
			vsecattr.vsa_mask = VSA_ACLCNT | VSA_DFACLCNT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   675
		} else if (acl_styles & _ACL_ACE_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   676
			acl_flavor = _ACL_ACE_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   677
			vsecattr.vsa_mask = VSA_ACECNT | VSA_ACE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   678
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   679
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   680
		ASSERT(vsecattr.vsa_mask && acl_flavor);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   681
		error = VOP_GETSECATTR(vp, &vsecattr, 0, cr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   682
		if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   683
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   684
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   685
		/* that flavor failed */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   686
		acl_styles &= ~acl_flavor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   687
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   688
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   689
	/* if all styles fail then assume trivial */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   690
	if (acl_styles == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   691
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   692
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   693
	/* process the flavor that worked */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   694
	isnontrivial = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   695
	if (acl_flavor & _ACL_ACLENT_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   696
		if (vsecattr.vsa_aclcnt > MIN_ACL_ENTRIES)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   697
			isnontrivial = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   698
		if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   699
			kmem_free(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   700
			    vsecattr.vsa_aclcnt * sizeof (aclent_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   701
		if (vsecattr.vsa_dfaclcnt && vsecattr.vsa_dfaclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   702
			kmem_free(vsecattr.vsa_dfaclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   703
			    vsecattr.vsa_dfaclcnt * sizeof (aclent_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   704
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   705
	if (acl_flavor & _ACL_ACE_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   706
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   707
		isnontrivial = ace_trivial(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   708
		    vsecattr.vsa_aclcnt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   709
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   710
		if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   711
			kmem_free(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   712
			    vsecattr.vsa_aclcnt * sizeof (ace_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   713
		/* ACE has no vsecattr.vsa_dfaclcnt */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   714
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   715
	return (isnontrivial);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   716
}