usr/src/uts/common/fs/fs_subr.c
author Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
Wed, 14 Apr 2010 13:25:42 -0600
changeset 12164 0eb8d6741e37
parent 11291 80bdcd03e626
child 13370 8c04143bd318
permissions -rw-r--r--
PSARC/2010/029 Improved ACL interoperability 6923083 ZFS/NFS/SMB ACL interoperability changes
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
2051
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
     5
 * Common Development and Distribution License (the "License").
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
/*
12164
0eb8d6741e37 PSARC/2010/029 Improved ACL interoperability
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11291
diff changeset
    26
 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * Generic vnode operations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/flock.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/statvfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/vfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/poll.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <fs/fs_subr.h>
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    50
#include <fs/fs_reparse.h>
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    51
#include <sys/door.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/acl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/share.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/kmem.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/nbmlock.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
    58
#include <acl/acl_common.h>
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    59
#include <sys/pathname.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static callb_cpr_t *frlock_serialize_blocked(flk_cb_when_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
/*
2051
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
    64
 * Tunable to limit the number of retry to recover from STALE error.
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
    65
 */
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
    66
int fs_estale_retry = 5;
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
    67
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
    68
/*
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    69
 * supports for reparse point door upcall
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    70
 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    71
static door_handle_t reparsed_door;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    72
static kmutex_t reparsed_door_lock;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    73
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
    74
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 * The associated operation is not supported by the file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
fs_nosys()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	return (ENOSYS);
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * The associated operation is invalid (on this vnode).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
fs_inval()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	return (EINVAL);
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * The associated operation is valid only for directories.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
fs_notdir()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	return (ENOTDIR);
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
 * Free the file system specific resources. For the file systems that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 * do not support the forced unmount, it will be a nop function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
fs_freevfs(vfs_t *vfsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
fs_nosys_map(struct vnode *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	offset_t off,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	struct as *as,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	caddr_t *addrp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	size_t len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	uchar_t prot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	uchar_t maxprot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	uint_t flags,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   122
	struct cred *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   123
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	return (ENOSYS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
fs_nosys_addmap(struct vnode *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	offset_t off,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	struct as *as,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	caddr_t addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	size_t len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	uchar_t prot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	uchar_t maxprot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	uint_t flags,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   138
	struct cred *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   139
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	return (ENOSYS);
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
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
fs_nosys_poll(vnode_t *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	register short events,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	int anyyet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	register short *reventsp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   150
	struct pollhead **phpp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   151
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	return (ENOSYS);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * The file system has nothing to sync to disk.  However, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * VFS_SYNC operation must not fail.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
fs_sync(struct vfs *vfspp, short flag, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   169
 * Does nothing but VOP_FSYNC must not fail.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   170
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   171
/* ARGSUSED */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   172
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   173
fs_fsync(vnode_t *vp, int syncflag, cred_t *cr, caller_context_t *ct)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   174
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   175
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   176
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   177
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   178
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   179
 * Does nothing but VOP_PUTPAGE must not fail.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   180
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   181
/* ARGSUSED */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   182
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   183
fs_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   184
	caller_context_t *ctp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   185
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   186
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   187
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   188
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   189
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   190
 * Does nothing but VOP_IOCTL must not fail.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   191
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   192
/* ARGSUSED */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   193
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   194
fs_ioctl(vnode_t *vp, int com, intptr_t data, int flag, cred_t *cred,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   195
	int *rvalp)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   196
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   197
	return (0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   198
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   199
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   200
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
 * Read/write lock/unlock.  Does nothing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
fs_rwlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
fs_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
 * Compare two vnodes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   219
/*ARGSUSED2*/
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   221
fs_cmp(vnode_t *vp1, vnode_t *vp2, caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	return (vp1 == vp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
 * No-op seek operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   231
fs_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	return ((*noffp < 0 || *noffp > MAXOFFSET_T) ? EINVAL : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 * File and record locking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
fs_frlock(register vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   242
	offset_t offset, flk_callback_t *flk_cbp, cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   243
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	int frcmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	int nlmid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	flk_callback_t serialize_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	int serialize = 0;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   250
	v_mode_t mode;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	case F_GETLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	case F_O_GETLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		if (flag & F_REMOTELOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			frcmd = RCMDLCK;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   258
		} else if (flag & F_PXFSLOCK) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			frcmd = PCMDLCK;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   260
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   261
			frcmd = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   262
			bfp->l_pid = ttoproc(curthread)->p_pid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   263
			bfp->l_sysid = 0;
0
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_SETLK_NBMAND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		 * Are NBMAND locks allowed on this file?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		if (!vp->v_vfsp ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		    !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		if (vp->v_type != VREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	case F_SETLK:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   283
		if (flag & F_REMOTELOCK) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   284
			frcmd = SETFLCK|RCMDLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   285
		} else if (flag & F_PXFSLOCK) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   286
			frcmd = SETFLCK|PCMDLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   287
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   288
			frcmd = SETFLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   289
			bfp->l_pid = ttoproc(curthread)->p_pid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   290
			bfp->l_sysid = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   291
		}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   292
		if (cmd == F_SETLK_NBMAND &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   293
		    (bfp->l_type == F_RDLCK || bfp->l_type == F_WRLCK)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   294
			frcmd |= NBMLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   295
		}
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 5331
diff changeset
   296
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		if (nbl_need_check(vp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			serialize = 1;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   300
			if (frcmd & NBMLCK) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   301
				mode = (bfp->l_type == F_RDLCK) ?
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   302
				    V_READ : V_RDANDWR;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   303
				if (vn_is_mapped(vp, mode)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   304
					error = EAGAIN;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   305
					goto done;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   306
				}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   307
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	case F_SETLKW:
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   312
		if (flag & F_REMOTELOCK) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   313
			frcmd = SETFLCK|SLPFLCK|RCMDLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   314
		} else if (flag & F_PXFSLOCK) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   315
			frcmd = SETFLCK|SLPFLCK|PCMDLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   316
		} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   317
			frcmd = SETFLCK|SLPFLCK;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   318
			bfp->l_pid = ttoproc(curthread)->p_pid;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   319
			bfp->l_sysid = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   320
		}
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 5331
diff changeset
   321
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		if (nbl_need_check(vp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			serialize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	case F_HASREMOTELOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		nlmid = GETNLMID(bfp->l_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		if (nlmid != 0) {	/* booted as a cluster */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			l_has_rmt(bfp) =
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   332
			    cl_flk_has_remote_locks_for_nlmid(vp, nlmid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		} else {		/* not booted as a cluster */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
			l_has_rmt(bfp) = flk_has_remote_locks(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	 * If this is a blocking lock request and we're serializing lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	 * requests, modify the callback list to leave the critical region
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	 * while we're waiting for the lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	if (serialize && (frcmd & SLPFLCK) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		flk_add_callback(&serialize_callback,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   352
		    frlock_serialize_blocked, vp, flk_cbp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		flk_cbp = &serialize_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	error = reclock(vp, bfp, frcmd, flag, offset, flk_cbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	if (serialize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
		nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
 * Callback when a lock request blocks and we are serializing requests.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
 * before sleeping, leave the critical region.  If after wakeup, reenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
 * the critical region.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
static callb_cpr_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
frlock_serialize_blocked(flk_cb_when_t when, void *infop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	vnode_t *vp = (vnode_t *)infop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	if (when == FLK_BEFORE_SLEEP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
 * Allow any flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   390
fs_setfl(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   391
	vnode_t *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   392
	int oflags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   393
	int nflags,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   394
	cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   395
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
 * Return the answer requested to poll() for non-device files.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
 * Only POLLIN, POLLRDNORM, and POLLOUT are recognized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
struct pollhead fs_pollhd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
fs_poll(vnode_t *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	register short events,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	int anyyet,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	register short *reventsp,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   412
	struct pollhead **phpp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   413
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	*reventsp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	if (events & POLLIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		*reventsp |= POLLIN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	if (events & POLLRDNORM)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		*reventsp |= POLLRDNORM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	if (events & POLLRDBAND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		*reventsp |= POLLRDBAND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	if (events & POLLOUT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		*reventsp |= POLLOUT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	if (events & POLLWRBAND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		*reventsp |= POLLWRBAND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	*phpp = !anyyet && !*reventsp ? &fs_pollhd : (struct pollhead *)NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 * POSIX pathconf() support.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   435
fs_pathconf(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   436
	vnode_t *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   437
	int cmd,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   438
	ulong_t *valp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   439
	cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   440
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	register ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	register int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	struct statvfs64 vfsbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	case _PC_LINK_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		val = MAXLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	case _PC_MAX_CANON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		val = MAX_CANON;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	case _PC_MAX_INPUT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		val = MAX_INPUT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	case _PC_NAME_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		bzero(&vfsbuf, sizeof (vfsbuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		if (error = VFS_STATVFS(vp->v_vfsp, &vfsbuf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		val = vfsbuf.f_namemax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	case _PC_PATH_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	case _PC_SYMLINK_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
		val = MAXPATHLEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	case _PC_PIPE_BUF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		val = PIPE_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	case _PC_NO_TRUNC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
			val = 1;	/* NOTRUNC is enabled for vp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			val = (ulong_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	case _PC_VDISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		val = _POSIX_VDISABLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	case _PC_CHOWN_RESTRICTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		if (rstchown)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
			val = rstchown; /* chown restricted enabled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			val = (ulong_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	case _PC_FILESIZEBITS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		 * If ever we come here it means that underlying file system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		 * does not recognise the command and therefore this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		 * configurable limit cannot be determined. We return -1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		 * and don't change errno.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		val = (ulong_t)-1;    /* large file support */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	case _PC_ACL_ENABLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
		val = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   510
	case _PC_CASE_BEHAVIOR:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   511
		val = _CASE_SENSITIVE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   512
		if (vfs_has_feature(vp->v_vfsp, VFSFT_CASEINSENSITIVE) == 1)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   513
			val |= _CASE_INSENSITIVE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   514
		if (vfs_has_feature(vp->v_vfsp, VFSFT_NOCASESENSITIVE) == 1)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   515
			val &= ~_CASE_SENSITIVE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   516
		break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   517
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   518
	case _PC_SATTR_ENABLED:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   519
	case _PC_SATTR_EXISTS:
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   520
		val = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   521
		break;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   522
9749
105f407a2680 PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents: 7961
diff changeset
   523
	case _PC_ACCESS_FILTERING:
105f407a2680 PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents: 7961
diff changeset
   524
		val = 0;
105f407a2680 PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents: 7961
diff changeset
   525
		break;
105f407a2680 PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents: 7961
diff changeset
   526
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	if (error == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		*valp = val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
 * Dispose of a page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   542
fs_dispose(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   543
	struct vnode *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   544
	page_t *pp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   545
	int fl,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   546
	int dn,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   547
	struct cred *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   548
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	ASSERT(fl == B_FREE || fl == B_INVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	if (fl == B_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		page_free(pp, dn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
		page_destroy(pp, dn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   561
fs_nodispose(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   562
	struct vnode *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   563
	page_t *pp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   564
	int fl,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   565
	int dn,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   566
	struct cred *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   567
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	cmn_err(CE_PANIC, "fs_nodispose invoked");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
 * fabricate acls for file systems that do not support acls.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   577
fs_fab_acl(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   578
	vnode_t *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   579
	vsecattr_t *vsecattr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   580
	int flag,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   581
	cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   582
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	aclent_t	*aclentp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	struct vattr	vattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	int		error;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   587
	size_t		aclsize;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
	vsecattr->vsa_aclcnt	= 0;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   590
	vsecattr->vsa_aclentsz	= 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	vsecattr->vsa_aclentp	= NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	vsecattr->vsa_dfaclcnt	= 0;	/* Default ACLs are not fabricated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	vsecattr->vsa_dfaclentp	= NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
2123
9c702cf3ecf8 5106149 fs_fab_acl sets incorrect OTHER_OBJ/CLASS_OBJ values
szhou
parents: 2051
diff changeset
   595
	vattr.va_mask = AT_MODE | AT_UID | AT_GID;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   596
	if (error = VOP_GETATTR(vp, &vattr, 0, cr, ct))
2123
9c702cf3ecf8 5106149 fs_fab_acl sets incorrect OTHER_OBJ/CLASS_OBJ values
szhou
parents: 2051
diff changeset
   597
		return (error);
9c702cf3ecf8 5106149 fs_fab_acl sets incorrect OTHER_OBJ/CLASS_OBJ values
szhou
parents: 2051
diff changeset
   598
2143
601035b1b4e3 6434606 getfacl/setfacl of files/dirs over NFSv4 with ZFS underneath fail
marks
parents: 2123
diff changeset
   599
	if (vsecattr->vsa_mask & (VSA_ACLCNT | VSA_ACL)) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   600
		aclsize = 4 * sizeof (aclent_t);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		vsecattr->vsa_aclcnt	= 4; /* USER, GROUP, OTHER, and CLASS */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   602
		vsecattr->vsa_aclentp = kmem_zalloc(aclsize, KM_SLEEP);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
		aclentp = vsecattr->vsa_aclentp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
		aclentp->a_type = USER_OBJ;	/* Owner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0700)) >> 6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		aclentp->a_id = vattr.va_uid;   /* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		aclentp->a_type = GROUP_OBJ;    /* Group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0070)) >> 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
		aclentp->a_id = vattr.va_gid;   /* Really undefined */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
		aclentp->a_type = OTHER_OBJ;    /* Other */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		aclentp->a_perm = vattr.va_mode & 0007;
4321
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 2143
diff changeset
   617
		aclentp->a_id = (gid_t)-1;	/* Really undefined */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		aclentp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		aclentp->a_type = CLASS_OBJ;    /* Class */
2123
9c702cf3ecf8 5106149 fs_fab_acl sets incorrect OTHER_OBJ/CLASS_OBJ values
szhou
parents: 2051
diff changeset
   621
		aclentp->a_perm = (ushort_t)(0007);
4321
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 2143
diff changeset
   622
		aclentp->a_id = (gid_t)-1;	/* Really undefined */
2143
601035b1b4e3 6434606 getfacl/setfacl of files/dirs over NFSv4 with ZFS underneath fail
marks
parents: 2123
diff changeset
   623
	} else if (vsecattr->vsa_mask & (VSA_ACECNT | VSA_ACE)) {
12164
0eb8d6741e37 PSARC/2010/029 Improved ACL interoperability
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11291
diff changeset
   624
		VERIFY(0 == acl_trivial_create(vattr.va_mode,
0eb8d6741e37 PSARC/2010/029 Improved ACL interoperability
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11291
diff changeset
   625
		    (ace_t **)&vsecattr->vsa_aclentp, &vsecattr->vsa_aclcnt));
0eb8d6741e37 PSARC/2010/029 Improved ACL interoperability
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11291
diff changeset
   626
		vsecattr->vsa_aclentsz = vsecattr->vsa_aclcnt * sizeof (ace_t);
2143
601035b1b4e3 6434606 getfacl/setfacl of files/dirs over NFSv4 with ZFS underneath fail
marks
parents: 2123
diff changeset
   627
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
12164
0eb8d6741e37 PSARC/2010/029 Improved ACL interoperability
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 11291
diff changeset
   629
	return (error);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
 * Common code for implementing DOS share reservations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
/* ARGSUSED4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   637
fs_shrlock(
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   638
	struct vnode *vp,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   639
	int cmd,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   640
	struct shrlock *shr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   641
	int flag,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   642
	cred_t *cr,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   643
	caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	 * Make sure that the file was opened with permissions appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	 * for the request, and make sure the caller isn't trying to sneak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	 * in an NBMAND request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	if (cmd == F_SHARE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		if (((shr->s_access & F_RDACC) && (flag & FREAD) == 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		    ((shr->s_access & F_WRACC) && (flag & FWRITE) == 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
			return (EBADF);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   656
		if (shr->s_access & (F_RMACC | F_MDACC))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   657
			return (EINVAL);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   658
		if (shr->s_deny & (F_MANDDNY | F_RMDNY))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	if (cmd == F_SHARE_NBMAND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		/* make sure nbmand is allowed on the file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		if (!vp->v_vfsp ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		    !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
		if (vp->v_type != VREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	nbl_start_crit(vp, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	case F_SHARE_NBMAND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		shr->s_deny |= F_MANDDNY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	case F_SHARE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		error = add_share(vp, shr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	case F_UNSHARE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		error = del_share(vp, shr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	case F_HASREMOTELOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		 * We are overloading this command to refer to remote
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		 * shares as well as remote locks, despite its name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		shr->s_access = shr_has_remote_shares(vp, shr->s_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	nbl_end_crit(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
/*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   707
fs_vnevent_nosupport(vnode_t *vp, vnevent_t e, vnode_t *dvp, char *fnm,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   708
    caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
/*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
int
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   716
fs_vnevent_support(vnode_t *vp, vnevent_t e, vnode_t *dvp, char *fnm,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   717
    caller_context_t *ct)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   722
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   723
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   724
 * return 1 for non-trivial ACL.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   725
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   726
 * NB: It is not necessary for the caller to VOP_RWLOCK since
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   727
 *	we only issue VOP_GETSECATTR.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   728
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   729
 * Returns 0 == trivial
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   730
 *         1 == NOT Trivial
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   731
 *	   <0 could not determine.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   732
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   733
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   734
fs_acl_nontrivial(vnode_t *vp, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   735
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   736
	ulong_t		acl_styles;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   737
	ulong_t		acl_flavor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   738
	vsecattr_t 	vsecattr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   739
	int 		error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   740
	int		isnontrivial;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   741
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   742
	/* determine the forms of ACLs maintained */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   743
	error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &acl_styles, cr, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   744
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   745
	/* clear bits we don't understand and establish default acl_style */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   746
	acl_styles &= (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   747
	if (error || (acl_styles == 0))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   748
		acl_styles = _ACL_ACLENT_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   749
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   750
	vsecattr.vsa_aclentp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   751
	vsecattr.vsa_dfaclentp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   752
	vsecattr.vsa_aclcnt = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   753
	vsecattr.vsa_dfaclcnt = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   754
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   755
	while (acl_styles) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   756
		/* select one of the styles as current flavor */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   757
		acl_flavor = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   758
		if (acl_styles & _ACL_ACLENT_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   759
			acl_flavor = _ACL_ACLENT_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   760
			vsecattr.vsa_mask = VSA_ACLCNT | VSA_DFACLCNT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   761
		} else if (acl_styles & _ACL_ACE_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   762
			acl_flavor = _ACL_ACE_ENABLED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   763
			vsecattr.vsa_mask = VSA_ACECNT | VSA_ACE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   764
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   765
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   766
		ASSERT(vsecattr.vsa_mask && acl_flavor);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   767
		error = VOP_GETSECATTR(vp, &vsecattr, 0, cr, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   768
		if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   769
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   770
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   771
		/* that flavor failed */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   772
		acl_styles &= ~acl_flavor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   773
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   774
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   775
	/* if all styles fail then assume trivial */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   776
	if (acl_styles == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   777
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   778
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   779
	/* process the flavor that worked */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   780
	isnontrivial = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   781
	if (acl_flavor & _ACL_ACLENT_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   782
		if (vsecattr.vsa_aclcnt > MIN_ACL_ENTRIES)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   783
			isnontrivial = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   784
		if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   785
			kmem_free(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   786
			    vsecattr.vsa_aclcnt * sizeof (aclent_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   787
		if (vsecattr.vsa_dfaclcnt && vsecattr.vsa_dfaclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   788
			kmem_free(vsecattr.vsa_dfaclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   789
			    vsecattr.vsa_dfaclcnt * sizeof (aclent_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   790
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   791
	if (acl_flavor & _ACL_ACE_ENABLED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   792
		isnontrivial = ace_trivial(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   793
		    vsecattr.vsa_aclcnt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   794
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   795
		if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   796
			kmem_free(vsecattr.vsa_aclentp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   797
			    vsecattr.vsa_aclcnt * sizeof (ace_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   798
		/* ACE has no vsecattr.vsa_dfaclcnt */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   799
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   800
	return (isnontrivial);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   801
}
2051
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   802
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   803
/*
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   804
 * Check whether we need a retry to recover from STALE error.
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   805
 */
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   806
int
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   807
fs_need_estale_retry(int retry_count)
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   808
{
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   809
	if (retry_count < fs_estale_retry)
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   810
		return (1);
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   811
	else
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   812
		return (0);
50a87bae0c3a 5083170 need mechanism to report non-recoverable ESTALE error
prabahar
parents: 789
diff changeset
   813
}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   814
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   815
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   816
static int (*fs_av_scan)(vnode_t *, cred_t *, int) = NULL;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   817
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   818
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   819
 * Routine for anti-virus scanner to call to register its scanning routine.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   820
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   821
void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   822
fs_vscan_register(int (*av_scan)(vnode_t *, cred_t *, int))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   823
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   824
	fs_av_scan = av_scan;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   825
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   826
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   827
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   828
 * Routine for file systems to call to initiate anti-virus scanning.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   829
 * Scanning will only be done on REGular files (currently).
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   830
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   831
int
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   832
fs_vscan(vnode_t *vp, cred_t *cr, int async)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   833
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   834
	int ret = 0;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   835
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   836
	if (fs_av_scan && vp->v_type == VREG)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   837
		ret = (*fs_av_scan)(vp, cr, async);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   838
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   839
	return (ret);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4863
diff changeset
   840
}
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   841
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   842
/*
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   843
 * support functions for reparse point
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   844
 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   845
/*
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   846
 * reparse_vnode_parse
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   847
 *
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   848
 * Read the symlink data of a reparse point specified by the vnode
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   849
 * and return the reparse data as name-value pair in the nvlist.
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   850
 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   851
int
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   852
reparse_vnode_parse(vnode_t *vp, nvlist_t *nvl)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   853
{
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   854
	int err;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   855
	char *lkdata;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   856
	struct uio uio;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   857
	struct iovec iov;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   858
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   859
	if (vp == NULL || nvl == NULL)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   860
		return (EINVAL);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   861
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   862
	lkdata = kmem_alloc(MAXREPARSELEN, KM_SLEEP);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   863
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   864
	/*
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   865
	 * Set up io vector to read sym link data
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   866
	 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   867
	iov.iov_base = lkdata;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   868
	iov.iov_len = MAXREPARSELEN;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   869
	uio.uio_iov = &iov;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   870
	uio.uio_iovcnt = 1;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   871
	uio.uio_segflg = UIO_SYSSPACE;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   872
	uio.uio_extflg = UIO_COPY_CACHED;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   873
	uio.uio_loffset = (offset_t)0;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   874
	uio.uio_resid = MAXREPARSELEN;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   875
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   876
	if ((err = VOP_READLINK(vp, &uio, kcred, NULL)) == 0) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   877
		*(lkdata + MAXREPARSELEN - uio.uio_resid) = '\0';
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   878
		err = reparse_parse(lkdata, nvl);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   879
	}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   880
	kmem_free(lkdata, MAXREPARSELEN);	/* done with lkdata */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   881
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   882
	return (err);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   883
}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   884
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   885
void
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   886
reparse_point_init()
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   887
{
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   888
	mutex_init(&reparsed_door_lock, NULL, MUTEX_DEFAULT, NULL);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   889
}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   890
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   891
static door_handle_t
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   892
reparse_door_get_handle()
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   893
{
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   894
	door_handle_t dh;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   895
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   896
	mutex_enter(&reparsed_door_lock);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   897
	if ((dh = reparsed_door) == NULL) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   898
		if (door_ki_open(REPARSED_DOOR, &reparsed_door) != 0) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   899
			reparsed_door = NULL;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   900
			dh = NULL;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   901
		} else
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   902
			dh = reparsed_door;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   903
	}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   904
	mutex_exit(&reparsed_door_lock);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   905
	return (dh);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   906
}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   907
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   908
static void
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   909
reparse_door_reset_handle()
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   910
{
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   911
	mutex_enter(&reparsed_door_lock);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   912
	reparsed_door = NULL;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   913
	mutex_exit(&reparsed_door_lock);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   914
}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   915
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   916
/*
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   917
 * reparse_kderef
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   918
 *
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   919
 * Accepts the service-specific item from the reparse point and returns
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   920
 * the service-specific data requested.  The caller specifies the size of
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   921
 * the buffer provided via *bufsz; the routine will fail with EOVERFLOW
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   922
 * if the results will not fit in the buffer, in which case, *bufsz will
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   923
 * contain the number of bytes needed to hold the results.
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   924
 *
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   925
 * if ok return 0 and update *bufsize with length of actual result
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   926
 * else return error code.
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   927
 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   928
int
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   929
reparse_kderef(const char *svc_type, const char *svc_data, char *buf,
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   930
    size_t *bufsize)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   931
{
11291
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   932
	int err, retries, need_free, retried_doorhd;
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   933
	size_t dlen, res_len;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   934
	char *darg;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   935
	door_arg_t door_args;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   936
	reparsed_door_res_t *resp;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   937
	door_handle_t rp_door;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   938
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   939
	if (svc_type == NULL || svc_data == NULL || buf == NULL ||
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   940
	    bufsize == NULL)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   941
		return (EINVAL);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   942
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   943
	/* get reparsed's door handle */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   944
	if ((rp_door = reparse_door_get_handle()) == NULL)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   945
		return (EBADF);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   946
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   947
	/* setup buffer for door_call args and results */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   948
	dlen = strlen(svc_type) + strlen(svc_data) + 2;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   949
	if (*bufsize < dlen) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   950
		darg = kmem_alloc(dlen, KM_SLEEP);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   951
		need_free = 1;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   952
	} else {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   953
		darg = buf;	/* use same buffer for door's args & results */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   954
		need_free = 0;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   955
	}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   956
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   957
	/* build argument string of door call */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   958
	(void) snprintf(darg, dlen, "%s:%s", svc_type, svc_data);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   959
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   960
	/* setup args for door call */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   961
	door_args.data_ptr = darg;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   962
	door_args.data_size = dlen;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   963
	door_args.desc_ptr = NULL;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   964
	door_args.desc_num = 0;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   965
	door_args.rbuf = buf;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   966
	door_args.rsize = *bufsize;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   967
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   968
	/* do the door_call */
11291
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   969
	retried_doorhd = 0;
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   970
	retries = 0;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   971
	door_ki_hold(rp_door);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   972
	while ((err = door_ki_upcall_limited(rp_door, &door_args,
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   973
	    NULL, SIZE_MAX, 0)) != 0) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   974
		if (err == EAGAIN || err == EINTR) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   975
			if (++retries < REPARSED_DOORCALL_MAX_RETRY) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   976
				delay(SEC_TO_TICK(1));
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   977
				continue;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   978
			}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   979
		} else if (err == EBADF) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   980
			/* door server goes away... */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   981
			reparse_door_reset_handle();
11291
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   982
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   983
			if (retried_doorhd == 0) {
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   984
				door_ki_rele(rp_door);
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   985
				retried_doorhd++;
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   986
				rp_door = reparse_door_get_handle();
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   987
				if (rp_door != NULL) {
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   988
					door_ki_hold(rp_door);
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   989
					continue;
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   990
				}
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   991
			}
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   992
		}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   993
		break;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   994
	}
11291
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   995
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   996
	if (rp_door)
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   997
		door_ki_rele(rp_door);
80bdcd03e626 6232737 Client should support NFS4ERR_MOVED and fs_locations
Robert Thurlow <Robert.Thurlow@Sun.COM>
parents: 10793
diff changeset
   998
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
   999
	if (need_free)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1000
		kmem_free(darg, dlen);		/* done with args buffer */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1001
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1002
	if (err != 0)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1003
		return (err);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1004
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1005
	resp = (reparsed_door_res_t *)door_args.rbuf;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1006
	if ((err = resp->res_status) == 0) {
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1007
		/*
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1008
		 * have to save the length of the results before the
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1009
		 * bcopy below since it's can be an overlap copy that
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1010
		 * overwrites the reparsed_door_res_t structure at
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1011
		 * the beginning of the buffer.
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1012
		 */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1013
		res_len = (size_t)resp->res_len;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1014
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1015
		/* deref call is ok */
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1016
		if (res_len > *bufsize)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1017
			err = EOVERFLOW;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1018
		else
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1019
			bcopy(resp->res_data, buf, res_len);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1020
		*bufsize = res_len;
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1021
	}
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1022
	if (door_args.rbuf != buf)
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1023
		kmem_free(door_args.rbuf, door_args.rsize);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1024
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1025
	return (err);
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 9749
diff changeset
  1026
}