usr/src/uts/common/fs/nfs/nfs_server.c
author natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
Tue, 28 Oct 2008 03:34:04 -0700
changeset 7961 4b5e3051f38b
parent 5982 6eafe3bf5f9e
child 8395 62c9dba0f531
permissions -rw-r--r--
6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory 6753904 SVCCTL server side service 6741484 Local users cannot connect to CIFS shares from MacOS 10.5 6746898 win98 can not overwrite *.files 6753310 Incorrect handling of SmbNegotiate request when invalid dialects are negotiated. 6751123 Unable to join domain, core dump generated with IPMP setting 6722437 SMB_TRANS2_FIND returns wrong status code when stream file is passed 6716578 can not delete file in extended attribute name space in cifs client when cifs server is solaris PSARC 2008/584 Correction in nbmand behavior 6734067 Long delay when viewing MS Word Read-only file properties with nbmand enabled. PSARC/2007/281 NFS share properties for Montana compatibility 6475452 Need Solaris support for Montana approve file functionality in NFS 6582170 Host-based access control (approve file) 6749075 Unable to join domain if user password exceeds 20 characters 6612716 Join domain fails if hostname is > 15 chars 6753251 server signing: wrong signature is generated for the NetShareEnum reply 6757521 SMB daemon leaks memory after displaying GSS status 6760315 Local user cannot connnect to CIFS shares if CIFS server's hostname is not specified 6757333 Share publisher thread runs into infinite loop of displaying GSS major/minor status 6757132 smbd crashes at smb_idmap_batch_getmappings 6760876 security descriptor decoding function has a glitch 6761491 Cannot open or delete a named stream on a directory file. 6741449 Cleanup list in smbns_ads module 6593958 Users with restore privilege can take ownership of files
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
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
     5
 * Common Development and Distribution License (the "License").
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
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
/*
5982
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
 *	Copyright (c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
 *	All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 *	Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.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/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/buf.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/pathname.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/uio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/siginfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/tiuser.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <sys/statvfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/strsubr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/stropts.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/timod.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/t_kuser.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <sys/kstat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/dirent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <sys/unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <sys/vtrace.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/mode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <sys/acl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <sys/sdt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <rpc/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <rpc/auth.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#include <rpc/auth_unix.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <rpc/auth_des.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <rpc/svc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <rpc/xdr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include <nfs/export.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include <nfs/nfssys.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#include <nfs/nfs_clnt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#include <nfs/nfs_acl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#include <nfs/nfs_log.h>
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: 5982
diff changeset
    80
#include <nfs/nfs_cmd.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#include <nfs/lm.h>
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
    82
#include <nfs/nfs_dispatch.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
    83
#include <nfs/nfs4_drc.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#include <sys/cladm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#include <sys/clconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	MAXHOST 32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
const char *kinet_ntop6(uchar_t *, char *, size_t);
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
 * Module linkage information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
static struct modlmisc modlmisc = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	&mod_miscops, "NFS server module"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
static struct modlinkage modlinkage = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	MODREV_1, (void *)&modlmisc, NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
char _depends_on[] = "misc/klmmod";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	int status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	if ((status = nfs_srvinit()) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		cmn_err(CE_WARN, "_init: nfs_srvinit failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	status = mod_install((struct modlinkage *)&modlinkage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	if (status != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		 * Could not load module, cleanup previous
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		 * initialization work.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
		nfs_srvfini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   125
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   126
	 * Initialise some placeholders for nfssys() calls. These have
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   127
	 * to be declared by the nfs module, since that handles nfssys()
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   128
	 * calls - also used by NFS clients - but are provided by this
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   129
	 * nfssrv module. These also then serve as confirmation to the
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   130
	 * relevant code in nfs that nfssrv has been loaded, as they're
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   131
	 * initially NULL.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   132
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	nfs_srv_quiesce_func = nfs_srv_quiesce_all;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   134
	nfs_srv_dss_func = rfs4_dss_setpaths;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   135
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   136
	/* setup DSS paths here; must be done before initial server startup */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   137
	rfs4_dss_paths = rfs4_dss_oldpaths = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
_fini()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	return (EBUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
_info(struct modinfo *modinfop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	return (mod_info(&modlinkage, modinfop));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 * PUBLICFH_CHECK() checks if the dispatch routine supports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * RPC_PUBLICFH_OK, if the filesystem is exported public, and if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 * incoming request is using the public filehandle. The check duplicates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * the exportmatch() call done in checkexport(), and we should consider
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * modifying those routines to avoid the duplication. For now, we optimize
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 * by calling exportmatch() only after checking that the dispatch routine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
 * supports RPC_PUBLICFH_OK, and if the filesystem is explicitly exported
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
 * public (i.e., not the placeholder).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
 */
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   164
#define	PUBLICFH_CHECK(disp, exi, fsid, xfid) \
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		((disp->dis_flags & RPC_PUBLICFH_OK) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		((exi->exi_export.ex_flags & EX_PUBLIC) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		(exi == exi_public && exportmatch(exi_root, \
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   168
		fsid, xfid))))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
static void	nfs_srv_shutdown_all(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
static void	rfs4_server_start(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
static void	nullfree(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
static void	rfs_dispatch(struct svc_req *, SVCXPRT *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
static void	acl_dispatch(struct svc_req *, SVCXPRT *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
static void	common_dispatch(struct svc_req *, SVCXPRT *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		rpcvers_t, rpcvers_t, char *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
		struct rpc_disptable *);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   178
static void	hanfsv4_failover(void);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
static	int	checkauth(struct exportinfo *, struct svc_req *, cred_t *, int,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
			bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
static char	*client_name(struct svc_req *req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
static char	*client_addr(struct svc_req *req, char *buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
extern	int	sec_svc_getcred(struct svc_req *, cred_t *cr, char **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
extern	bool_t	sec_svc_inrootlist(int, caddr_t, int, caddr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
#define	NFSLOG_COPY_NETBUF(exi, xprt, nb)	{		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	(nb)->maxlen = (xprt)->xp_rtaddr.maxlen;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	(nb)->len = (xprt)->xp_rtaddr.len;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	(nb)->buf = kmem_alloc((nb)->len, KM_SLEEP);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	bcopy((xprt)->xp_rtaddr.buf, (nb)->buf, (nb)->len);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 * Public Filehandle common nfs routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
static int	MCLpath(char **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
static void	URLparse(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
 * NFS callout table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
 * This table is used by svc_getreq() to dispatch a request with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 * a given prog/vers pair to an appropriate service provider
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 * dispatch routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
 * NOTE: ordering is relied upon below when resetting the version min/max
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
 * for NFS_PROGRAM.  Careful, if this is ever changed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
static SVC_CALLOUT __nfs_sc_clts[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	{ NFS_PROGRAM,	   NFS_VERSMIN,	    NFS_VERSMAX,	rfs_dispatch },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	{ NFS_ACL_PROGRAM, NFS_ACL_VERSMIN, NFS_ACL_VERSMAX,	acl_dispatch }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
static SVC_CALLOUT_TABLE nfs_sct_clts = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	sizeof (__nfs_sc_clts) / sizeof (__nfs_sc_clts[0]), FALSE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	__nfs_sc_clts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
static SVC_CALLOUT __nfs_sc_cots[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	{ NFS_PROGRAM,	   NFS_VERSMIN,	    NFS_VERSMAX,	rfs_dispatch },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	{ NFS_ACL_PROGRAM, NFS_ACL_VERSMIN, NFS_ACL_VERSMAX,	acl_dispatch }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
static SVC_CALLOUT_TABLE nfs_sct_cots = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	sizeof (__nfs_sc_cots) / sizeof (__nfs_sc_cots[0]), FALSE, __nfs_sc_cots
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
static SVC_CALLOUT __nfs_sc_rdma[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	{ NFS_PROGRAM,	   NFS_VERSMIN,	    NFS_VERSMAX,	rfs_dispatch },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	{ NFS_ACL_PROGRAM, NFS_ACL_VERSMIN, NFS_ACL_VERSMAX,	acl_dispatch }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
static SVC_CALLOUT_TABLE nfs_sct_rdma = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	sizeof (__nfs_sc_rdma) / sizeof (__nfs_sc_rdma[0]), FALSE, __nfs_sc_rdma
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
rpcvers_t nfs_versmin = NFS_VERSMIN_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
rpcvers_t nfs_versmax = NFS_VERSMAX_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 * Used to track the state of the server so that initialization
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 * can be done properly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	NFS_SERVER_STOPPED,	/* server state destroyed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	NFS_SERVER_STOPPING,	/* server state being destroyed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	NFS_SERVER_RUNNING,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	NFS_SERVER_QUIESCED,	/* server state preserved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	NFS_SERVER_OFFLINE	/* server pool offline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
} nfs_server_running_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
static nfs_server_running_t nfs_server_upordown;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
static kmutex_t nfs_server_upordown_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
static	kcondvar_t nfs_server_upordown_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   254
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   255
 * DSS: distributed stable storage
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   256
 * lists of all DSS paths: current, and before last warmstart
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   257
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   258
nvlist_t *rfs4_dss_paths, *rfs4_dss_oldpaths;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   259
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   260
int rfs4_dispatch(struct rpcdisp *, struct svc_req *, SVCXPRT *, char *);
4635
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
   261
bool_t rfs4_minorvers_mismatch(struct svc_req *, SVCXPRT *, void *);
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   262
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 * RDMA wait variables.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
static kcondvar_t rdma_wait_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
static kmutex_t rdma_wait_mutex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
 * Will be called at the point the server pool is being unregistered
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
 * from the pool list. From that point onwards, the pool is waiting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 * to be drained and as such the server state is stale and pertains
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 * to the old instantiation of the NFS server pool.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
nfs_srv_offline(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	mutex_enter(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	if (nfs_server_upordown == NFS_SERVER_RUNNING) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		nfs_server_upordown = NFS_SERVER_OFFLINE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	mutex_exit(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
 * Will be called at the point the server pool is being destroyed so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
 * all transports have been closed and no service threads are in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
 * existence.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
 * If we quiesce the server, we're shutting it down without destroying the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
 * server state. This allows it to warm start subsequently.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
nfs_srv_stop_all(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	int quiesce = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	nfs_srv_shutdown_all(quiesce);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
 * This alternative shutdown routine can be requested via nfssys()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
nfs_srv_quiesce_all(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	int quiesce = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	nfs_srv_shutdown_all(quiesce);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
nfs_srv_shutdown_all(int quiesce) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	mutex_enter(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	if (quiesce) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		if (nfs_server_upordown == NFS_SERVER_RUNNING ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
			nfs_server_upordown == NFS_SERVER_OFFLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
			nfs_server_upordown = NFS_SERVER_QUIESCED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
			cv_signal(&nfs_server_upordown_cv);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   318
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   319
			/* reset DSS state, for subsequent warm restart */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   320
			rfs4_dss_numnewpaths = 0;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   321
			rfs4_dss_newpaths = NULL;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   322
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			cmn_err(CE_NOTE, "nfs_server: server is now quiesced; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
			    "NFSv4 state has been preserved");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		if (nfs_server_upordown == NFS_SERVER_OFFLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			nfs_server_upordown = NFS_SERVER_STOPPING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
			mutex_exit(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
			rfs4_state_fini();
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   331
			rfs4_fini_drc(nfs4_drc);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
			mutex_enter(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
			nfs_server_upordown = NFS_SERVER_STOPPED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
			cv_signal(&nfs_server_upordown_cv);
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
	mutex_exit(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
nfs_srv_set_sc_versions(struct file *fp, SVC_CALLOUT_TABLE **sctpp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			rpcvers_t versmin, rpcvers_t versmax)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	struct strioctl strioc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	struct T_info_ack tinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	int		error, retval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	 * Find out what type of transport this is.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	strioc.ic_cmd = TI_GETINFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	strioc.ic_timout = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	strioc.ic_len = sizeof (tinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	strioc.ic_dp = (char *)&tinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	tinfo.PRIM_type = T_INFO_REQ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	error = strioctl(fp->f_vnode, I_STR, (intptr_t)&strioc, 0, K_TO_K,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	    CRED(), &retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	if (error || retval)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	 * Based on our query of the transport type...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	 * Reset the min/max versions based on the caller's request
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	 * NOTE: This assumes that NFS_PROGRAM is first in the array!!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	 * And the second entry is the NFS_ACL_PROGRAM.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	switch (tinfo.SERV_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	case T_CLTS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		if (versmax == NFS_V4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		__nfs_sc_clts[0].sc_versmin = versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		__nfs_sc_clts[0].sc_versmax = versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		__nfs_sc_clts[1].sc_versmin = versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		__nfs_sc_clts[1].sc_versmax = versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		*sctpp = &nfs_sct_clts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	case T_COTS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	case T_COTS_ORD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		__nfs_sc_cots[0].sc_versmin = versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		__nfs_sc_cots[0].sc_versmax = versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		/* For the NFS_ACL program, check the max version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		if (versmax > NFS_ACL_VERSMAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
			versmax = NFS_ACL_VERSMAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		__nfs_sc_cots[1].sc_versmin = versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		__nfs_sc_cots[1].sc_versmax = versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		*sctpp = &nfs_sct_cots;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
 * NFS Server system call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
 * Does all of the work of running a NFS server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
 * uap->fd is the fd of an open transport provider
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
nfs_svc(struct nfs_svc_args *arg, model_t model)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	file_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	SVCMASTERXPRT *xprt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	int readsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	char buf[KNC_STRSIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	STRUCT_HANDLE(nfs_svc_args, uap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	struct netbuf addrmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	SVC_CALLOUT_TABLE *sctp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
#ifdef lint
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	model = model;		/* STRUCT macros don't always refer to it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	STRUCT_SET_HANDLE(uap, model, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	/* Check privileges in nfssys() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	if ((fp = getf(STRUCT_FGET(uap, fd))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		return (EBADF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	 * Set read buffer size to rsize
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	 * and add room for RPC headers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	readsize = nfs3tsize() + (RPC_MAXDATASIZE - NFS_MAXDATA);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	if (readsize < RPC_MAXDATASIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		readsize = RPC_MAXDATASIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	error = copyinstr((const char *)STRUCT_FGETP(uap, netid), buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	    KNC_STRSIZE, &len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		releasef(STRUCT_FGET(uap, fd));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	addrmask.len = STRUCT_FGET(uap, addrmask.len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	addrmask.maxlen = STRUCT_FGET(uap, addrmask.maxlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	addrmask.buf = kmem_alloc(addrmask.maxlen, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	error = copyin(STRUCT_FGETP(uap, addrmask.buf), addrmask.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	    addrmask.len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		releasef(STRUCT_FGET(uap, fd));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		kmem_free(addrmask.buf, addrmask.maxlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	nfs_versmin = STRUCT_FGET(uap, versmin);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	nfs_versmax = STRUCT_FGET(uap, versmax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	/* Double check the vers min/max ranges */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	if ((nfs_versmin > nfs_versmax) ||
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: 5982
diff changeset
   457
	    (nfs_versmin < NFS_VERSMIN) ||
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: 5982
diff changeset
   458
	    (nfs_versmax > NFS_VERSMAX)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		nfs_versmin = NFS_VERSMIN_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		nfs_versmax = NFS_VERSMAX_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	if (error =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	    nfs_srv_set_sc_versions(fp, &sctp, nfs_versmin, nfs_versmax)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		releasef(STRUCT_FGET(uap, fd));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		kmem_free(addrmask.buf, addrmask.maxlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	/* Initialize nfsv4 server */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	if (nfs_versmax == (rpcvers_t)NFS_V4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		rfs4_server_start(STRUCT_FGET(uap, delegation));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	/* Create a transport handle. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	error = svc_tli_kcreate(fp, readsize, buf, &addrmask, &xprt,
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: 5982
diff changeset
   476
	    sctp, NULL, NFS_SVCPOOL_ID, TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		kmem_free(addrmask.buf, addrmask.maxlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	releasef(STRUCT_FGET(uap, fd));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   483
	/* HA-NFSv4: save the cluster nodeid */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	if (cluster_bootflags & CLUSTER_BOOTED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
		lm_global_nlmid = clconf_get_nodeid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
rfs4_server_start(int nfs4_srv_delegation)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	 * Determine if the server has previously been "started" and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	 * if not, do the per instance initialization
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	mutex_enter(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	if (nfs_server_upordown != NFS_SERVER_RUNNING) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		/* Do we need to stop and wait on the previous server? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		while (nfs_server_upordown == NFS_SERVER_STOPPING ||
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: 5982
diff changeset
   502
		    nfs_server_upordown == NFS_SERVER_OFFLINE)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			cv_wait(&nfs_server_upordown_cv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			    &nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		if (nfs_server_upordown != NFS_SERVER_RUNNING) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			(void) svc_pool_control(NFS_SVCPOOL_ID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
			    SVCPSET_UNREGISTER_PROC, (void *)&nfs_srv_offline);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			(void) svc_pool_control(NFS_SVCPOOL_ID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
			    SVCPSET_SHUTDOWN_PROC, (void *)&nfs_srv_stop_all);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			/* is this an nfsd warm start? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
			if (nfs_server_upordown == NFS_SERVER_QUIESCED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
				cmn_err(CE_NOTE, "nfs_server: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
				    "server was previously quiesced; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
				    "existing NFSv4 state will be re-used");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
				/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   519
				 * HA-NFSv4: this is also the signal
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   520
				 * that a Resource Group failover has
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   521
				 * occurred.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
				 */
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
   523
				if (cluster_bootflags & CLUSTER_BOOTED)
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   524
					hanfsv4_failover();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
			} else {
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
   526
				/* cold start */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
				rfs4_state_init();
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   528
				nfs4_drc = rfs4_init_drc(nfs4_drc_max,
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: 5982
diff changeset
   529
				    nfs4_drc_hash);
0
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
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
			 * Check to see if delegation is to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			 * enabled at the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
			if (nfs4_srv_delegation != FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
				rfs4_set_deleg_policy(SRV_NORMAL_DELEGATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
			nfs_server_upordown = NFS_SERVER_RUNNING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		cv_signal(&nfs_server_upordown_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	mutex_exit(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 * If RDMA device available,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 * start RDMA listener.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
rdma_start(struct rdma_svc_args *rsa)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	rdma_xprt_group_t started_rdma_xprts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	/* Double check the vers min/max ranges */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	if ((rsa->nfs_versmin > rsa->nfs_versmax) ||
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: 5982
diff changeset
   558
	    (rsa->nfs_versmin < NFS_VERSMIN) ||
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: 5982
diff changeset
   559
	    (rsa->nfs_versmax > NFS_VERSMAX)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		rsa->nfs_versmin = NFS_VERSMIN_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		rsa->nfs_versmax = NFS_VERSMAX_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	nfs_versmin = rsa->nfs_versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	nfs_versmax = rsa->nfs_versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	/* Set the versions in the callout table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	__nfs_sc_rdma[0].sc_versmin = rsa->nfs_versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	__nfs_sc_rdma[0].sc_versmax = rsa->nfs_versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	/* For the NFS_ACL program, check the max version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	__nfs_sc_rdma[1].sc_versmin = rsa->nfs_versmin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	if (rsa->nfs_versmax > NFS_ACL_VERSMAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		__nfs_sc_rdma[1].sc_versmax = NFS_ACL_VERSMAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		__nfs_sc_rdma[1].sc_versmax = rsa->nfs_versmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	/* Initialize nfsv4 server */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	if (rsa->nfs_versmax == (rpcvers_t)NFS_V4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		rfs4_server_start(rsa->delegation);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	started_rdma_xprts.rtg_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	started_rdma_xprts.rtg_listhead = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	started_rdma_xprts.rtg_poolid = rsa->poolid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	error = svc_rdma_kcreate(rsa->netid, &nfs_sct_rdma, rsa->poolid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	    &started_rdma_xprts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		mutex_enter(&rdma_wait_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		if (!cv_wait_sig(&rdma_wait_cv, &rdma_wait_mutex)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			rdma_stop(started_rdma_xprts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		mutex_exit(&rdma_wait_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
/* ARGSUSED */
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   598
void
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
rpc_null(caddr_t *argp, caddr_t *resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
/* ARGSUSED */
5982
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   604
void
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   605
rpc_null_v3(caddr_t *argp, caddr_t *resp, struct exportinfo *exi,
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   606
    struct svc_req *req, cred_t *cr)
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   607
{
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   608
	DTRACE_NFSV3_3(op__null__start, struct svc_req *, req,
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   609
	    cred_t *, cr, vnode_t *, NULL);
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   610
	DTRACE_NFSV3_3(op__null__done, struct svc_req *, req,
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   611
	    cred_t *, cr, vnode_t *, NULL);
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   612
}
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   613
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   614
/* ARGSUSED */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
rfs_error(caddr_t *argp, caddr_t *resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	/* return (EOPNOTSUPP); */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
nullfree(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
static char *rfscallnames_v2[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	"RFS2_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	"RFS2_GETATTR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	"RFS2_SETATTR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	"RFS2_ROOT",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	"RFS2_LOOKUP",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	"RFS2_READLINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	"RFS2_READ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	"RFS2_WRITECACHE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	"RFS2_WRITE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	"RFS2_CREATE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	"RFS2_REMOVE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	"RFS2_RENAME",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	"RFS2_LINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	"RFS2_SYMLINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	"RFS2_MKDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	"RFS2_RMDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	"RFS2_READDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	"RFS2_STATFS"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
static struct rpcdisp rfsdisptab_v2[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	 * NFS VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	{rpc_null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   657
	    0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	/* RFS_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	{rfs_getattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	    xdr_fhandle, xdr_fastfhandle, sizeof (fhandle_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	    xdr_attrstat, xdr_fastattrstat, sizeof (struct nfsattrstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	    nullfree, RPC_IDEMPOTENT|RPC_ALLOWANON|RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   664
	    rfs_getattr_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	/* RFS_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	{rfs_setattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	    xdr_saargs, NULL_xdrproc_t, sizeof (struct nfssaargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	    xdr_attrstat, xdr_fastattrstat, sizeof (struct nfsattrstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   671
	    rfs_setattr_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	/* RFS_ROOT = 3 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	{rfs_error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   678
	    0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	/* RFS_LOOKUP = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	{rfs_lookup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	    xdr_diropargs, NULL_xdrproc_t, sizeof (struct nfsdiropargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	    xdr_diropres, xdr_fastdiropres, sizeof (struct nfsdiropres),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	    nullfree, RPC_IDEMPOTENT|RPC_MAPRESP|RPC_PUBLICFH_OK,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   685
	    rfs_lookup_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	/* RFS_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	{rfs_readlink,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	    xdr_fhandle, xdr_fastfhandle, sizeof (fhandle_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	    xdr_rdlnres, NULL_xdrproc_t, sizeof (struct nfsrdlnres),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	    rfs_rlfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   692
	    rfs_readlink_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	/* RFS_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	{rfs_read,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	    xdr_readargs, NULL_xdrproc_t, sizeof (struct nfsreadargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	    xdr_rdresult, NULL_xdrproc_t, sizeof (struct nfsrdresult),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	    rfs_rdfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   699
	    rfs_read_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	/* RFS_WRITECACHE = 7 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	{rfs_error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   706
	    0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	/* RFS_WRITE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	{rfs_write,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	    xdr_writeargs, NULL_xdrproc_t, sizeof (struct nfswriteargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	    xdr_attrstat, xdr_fastattrstat, sizeof (struct nfsattrstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   713
	    rfs_write_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	/* RFS_CREATE = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	{rfs_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	    xdr_creatargs, NULL_xdrproc_t, sizeof (struct nfscreatargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
	    xdr_diropres, xdr_fastdiropres, sizeof (struct nfsdiropres),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   720
	    rfs_create_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	/* RFS_REMOVE = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	{rfs_remove,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	    xdr_diropargs, NULL_xdrproc_t, sizeof (struct nfsdiropargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
	    xdr_enum, xdr_fastenum, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	    xdr_enum, NULL_xdrproc_t, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   731
	    rfs_remove_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	/* RFS_RENAME = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	{rfs_rename,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	    xdr_rnmargs, NULL_xdrproc_t, sizeof (struct nfsrnmargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	    xdr_enum, xdr_fastenum, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	    xdr_enum, NULL_xdrproc_t, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   742
	    rfs_rename_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	/* RFS_LINK = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	{rfs_link,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	    xdr_linkargs, NULL_xdrproc_t, sizeof (struct nfslinkargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	    xdr_enum, xdr_fastenum, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	    xdr_enum, NULL_xdrproc_t, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   753
	    rfs_link_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	/* RFS_SYMLINK = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	{rfs_symlink,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	    xdr_slargs, NULL_xdrproc_t, sizeof (struct nfsslargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	    xdr_enum, xdr_fastenum, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	    xdr_enum, NULL_xdrproc_t, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   764
	    rfs_symlink_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	/* RFS_MKDIR = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	{rfs_mkdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	    xdr_creatargs, NULL_xdrproc_t, sizeof (struct nfscreatargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	    xdr_diropres, xdr_fastdiropres, sizeof (struct nfsdiropres),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   771
	    rfs_mkdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	/* RFS_RMDIR = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
	{rfs_rmdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	    xdr_diropargs, NULL_xdrproc_t, sizeof (struct nfsdiropargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	    xdr_enum, xdr_fastenum, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	    xdr_enum, NULL_xdrproc_t, sizeof (enum nfsstat),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	    nullfree, RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   782
	    rfs_rmdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	/* RFS_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
	{rfs_readdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
	    xdr_rddirargs, NULL_xdrproc_t, sizeof (struct nfsrddirargs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	    xdr_putrddirres, NULL_xdrproc_t, sizeof (struct nfsrddirres),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	    rfs_rddirfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   789
	    rfs_readdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
	/* RFS_STATFS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	{rfs_statfs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
	    xdr_fhandle, xdr_fastfhandle, sizeof (fhandle_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	    xdr_statfs, xdr_faststatfs, sizeof (struct nfsstatfs),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	    nullfree, RPC_IDEMPOTENT|RPC_ALLOWANON|RPC_MAPRESP,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   796
	    rfs_statfs_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
static char *rfscallnames_v3[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	"RFS3_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	"RFS3_GETATTR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	"RFS3_SETATTR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	"RFS3_LOOKUP",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	"RFS3_ACCESS",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	"RFS3_READLINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	"RFS3_READ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	"RFS3_WRITE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	"RFS3_CREATE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	"RFS3_MKDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	"RFS3_SYMLINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	"RFS3_MKNOD",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	"RFS3_REMOVE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	"RFS3_RMDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	"RFS3_RENAME",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	"RFS3_LINK",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	"RFS3_READDIR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	"RFS3_READDIRPLUS",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	"RFS3_FSSTAT",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	"RFS3_FSINFO",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	"RFS3_PATHCONF",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	"RFS3_COMMIT"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
static struct rpcdisp rfsdisptab_v3[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	 * NFS VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	/* RFS_NULL = 0 */
5982
6eafe3bf5f9e PSARC 2008/050 DTrace NFS v3 Provider
ahl
parents: 5331
diff changeset
   830
	{rpc_null_v3,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   834
	    0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	/* RFS3_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	{rfs3_getattr,
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   838
	    xdr_nfs_fh3_server, NULL_xdrproc_t, sizeof (GETATTR3args),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	    xdr_GETATTR3res, NULL_xdrproc_t, sizeof (GETATTR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	    nullfree, (RPC_IDEMPOTENT | RPC_ALLOWANON),
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   841
	    rfs3_getattr_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	/* RFS3_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
	{rfs3_setattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	    xdr_SETATTR3args, NULL_xdrproc_t, sizeof (SETATTR3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	    xdr_SETATTR3res, NULL_xdrproc_t, sizeof (SETATTR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   848
	    rfs3_setattr_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	/* RFS3_LOOKUP = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	{rfs3_lookup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	    xdr_diropargs3, NULL_xdrproc_t, sizeof (LOOKUP3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	    xdr_LOOKUP3res, NULL_xdrproc_t, sizeof (LOOKUP3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	    nullfree, (RPC_IDEMPOTENT | RPC_PUBLICFH_OK),
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   855
	    rfs3_lookup_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
	/* RFS3_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	{rfs3_access,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
	    xdr_ACCESS3args, NULL_xdrproc_t, sizeof (ACCESS3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	    xdr_ACCESS3res, NULL_xdrproc_t, sizeof (ACCESS3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   862
	    rfs3_access_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	/* RFS3_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	{rfs3_readlink,
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   866
	    xdr_nfs_fh3_server, NULL_xdrproc_t, sizeof (READLINK3args),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	    xdr_READLINK3res, NULL_xdrproc_t, sizeof (READLINK3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
	    rfs3_readlink_free, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   869
	    rfs3_readlink_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	/* RFS3_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	{rfs3_read,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	    xdr_READ3args, NULL_xdrproc_t, sizeof (READ3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
	    xdr_READ3res, NULL_xdrproc_t, sizeof (READ3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
	    rfs3_read_free, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   876
	    rfs3_read_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	/* RFS3_WRITE = 7 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
	{rfs3_write,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
	    xdr_WRITE3args, NULL_xdrproc_t, sizeof (WRITE3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	    xdr_WRITE3res, NULL_xdrproc_t, sizeof (WRITE3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   883
	    rfs3_write_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
	/* RFS3_CREATE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	{rfs3_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	    xdr_CREATE3args, NULL_xdrproc_t, sizeof (CREATE3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	    xdr_CREATE3res, NULL_xdrproc_t, sizeof (CREATE3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   890
	    rfs3_create_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	/* RFS3_MKDIR = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	{rfs3_mkdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	    xdr_MKDIR3args, NULL_xdrproc_t, sizeof (MKDIR3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	    xdr_MKDIR3res, NULL_xdrproc_t, sizeof (MKDIR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   897
	    rfs3_mkdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	/* RFS3_SYMLINK = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	{rfs3_symlink,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	    xdr_SYMLINK3args, NULL_xdrproc_t, sizeof (SYMLINK3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	    xdr_SYMLINK3res, NULL_xdrproc_t, sizeof (SYMLINK3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   904
	    rfs3_symlink_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	/* RFS3_MKNOD = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	{rfs3_mknod,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	    xdr_MKNOD3args, NULL_xdrproc_t, sizeof (MKNOD3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	    xdr_MKNOD3res, NULL_xdrproc_t, sizeof (MKNOD3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   911
	    rfs3_mknod_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	/* RFS3_REMOVE = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
	{rfs3_remove,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	    xdr_diropargs3, NULL_xdrproc_t, sizeof (REMOVE3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
	    xdr_REMOVE3res, NULL_xdrproc_t, sizeof (REMOVE3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   918
	    rfs3_remove_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	/* RFS3_RMDIR = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
	{rfs3_rmdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
	    xdr_diropargs3, NULL_xdrproc_t, sizeof (RMDIR3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	    xdr_RMDIR3res, NULL_xdrproc_t, sizeof (RMDIR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   925
	    rfs3_rmdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	/* RFS3_RENAME = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	{rfs3_rename,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	    xdr_RENAME3args, NULL_xdrproc_t, sizeof (RENAME3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	    xdr_RENAME3res, NULL_xdrproc_t, sizeof (RENAME3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   932
	    rfs3_rename_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
	/* RFS3_LINK = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	{rfs3_link,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	    xdr_LINK3args, NULL_xdrproc_t, sizeof (LINK3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	    xdr_LINK3res, NULL_xdrproc_t, sizeof (LINK3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	    nullfree, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   939
	    rfs3_link_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	/* RFS3_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	{rfs3_readdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	    xdr_READDIR3args, NULL_xdrproc_t, sizeof (READDIR3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	    xdr_READDIR3res, NULL_xdrproc_t, sizeof (READDIR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	    rfs3_readdir_free, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   946
	    rfs3_readdir_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	/* RFS3_READDIRPLUS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	{rfs3_readdirplus,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	    xdr_READDIRPLUS3args, NULL_xdrproc_t, sizeof (READDIRPLUS3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	    xdr_READDIRPLUS3res, NULL_xdrproc_t, sizeof (READDIRPLUS3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
	    rfs3_readdirplus_free, RPC_AVOIDWORK,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   953
	    rfs3_readdirplus_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	/* RFS3_FSSTAT = 18 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	{rfs3_fsstat,
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   957
	    xdr_nfs_fh3_server, NULL_xdrproc_t, sizeof (FSSTAT3args),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	    xdr_FSSTAT3res, NULL_xdrproc_t, sizeof (FSSTAT3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   960
	    rfs3_fsstat_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	/* RFS3_FSINFO = 19 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
	{rfs3_fsinfo,
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   964
	    xdr_nfs_fh3_server, NULL_xdrproc_t, sizeof (FSINFO3args),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
	    xdr_FSINFO3res, NULL_xdrproc_t, sizeof (FSINFO3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	    nullfree, RPC_IDEMPOTENT|RPC_ALLOWANON,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   967
	    rfs3_fsinfo_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	/* RFS3_PATHCONF = 20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	{rfs3_pathconf,
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   971
	    xdr_nfs_fh3_server, NULL_xdrproc_t, sizeof (PATHCONF3args),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	    xdr_PATHCONF3res, NULL_xdrproc_t, sizeof (PATHCONF3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   974
	    rfs3_pathconf_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	/* RFS3_COMMIT = 21 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	{rfs3_commit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	    xdr_COMMIT3args, NULL_xdrproc_t, sizeof (COMMIT3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	    xdr_COMMIT3res, NULL_xdrproc_t, sizeof (COMMIT3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	    nullfree, RPC_IDEMPOTENT,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
   981
	    rfs3_commit_getfh},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
static char *rfscallnames_v4[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
	"RFS4_COMPOUND",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	"RFS4_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	"RFS4_CREATE"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
static struct rpcdisp rfsdisptab_v4[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	 * NFS VERSION 4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	{rpc_null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
	    xdr_void, NULL_xdrproc_t, 0,
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1005
	    nullfree, RPC_IDEMPOTENT, 0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	/* RFS4_compound = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
	{rfs4_compound,
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 74
diff changeset
  1009
	    xdr_COMPOUND4args_srv, NULL_xdrproc_t, sizeof (COMPOUND4args),
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 74
diff changeset
  1010
	    xdr_COMPOUND4res_srv, NULL_xdrproc_t, sizeof (COMPOUND4res),
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1011
	    rfs4_compound_free, 0, 0},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
union rfs_args {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
	 * NFS VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
	/* RFS_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	fhandle_t nfs2_getattr_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	/* RFS_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	struct nfssaargs nfs2_setattr_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	/* RFS_ROOT = 3 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	/* RFS_LOOKUP = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	struct nfsdiropargs nfs2_lookup_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	/* RFS_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	fhandle_t nfs2_readlink_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	/* RFS_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	struct nfsreadargs nfs2_read_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
	/* RFS_WRITECACHE = 7 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	/* RFS_WRITE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
	struct nfswriteargs nfs2_write_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	/* RFS_CREATE = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
	struct nfscreatargs nfs2_create_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
	/* RFS_REMOVE = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	struct nfsdiropargs nfs2_remove_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	/* RFS_RENAME = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	struct nfsrnmargs nfs2_rename_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	/* RFS_LINK = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	struct nfslinkargs nfs2_link_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
	/* RFS_SYMLINK = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
	struct nfsslargs nfs2_symlink_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	/* RFS_MKDIR = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	struct nfscreatargs nfs2_mkdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	/* RFS_RMDIR = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	struct nfsdiropargs nfs2_rmdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	/* RFS_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	struct nfsrddirargs nfs2_readdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
	/* RFS_STATFS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	fhandle_t nfs2_statfs_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	 * NFS VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	/* RFS3_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
	GETATTR3args nfs3_getattr_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	/* RFS3_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	SETATTR3args nfs3_setattr_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	/* RFS3_LOOKUP = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	LOOKUP3args nfs3_lookup_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
	/* RFS3_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
	ACCESS3args nfs3_access_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	/* RFS3_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
	READLINK3args nfs3_readlink_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
	/* RFS3_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
	READ3args nfs3_read_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	/* RFS3_WRITE = 7 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
	WRITE3args nfs3_write_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
	/* RFS3_CREATE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	CREATE3args nfs3_create_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
	/* RFS3_MKDIR = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
	MKDIR3args nfs3_mkdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
	/* RFS3_SYMLINK = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
	SYMLINK3args nfs3_symlink_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	/* RFS3_MKNOD = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	MKNOD3args nfs3_mknod_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
	/* RFS3_REMOVE = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	REMOVE3args nfs3_remove_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
	/* RFS3_RMDIR = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	RMDIR3args nfs3_rmdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	/* RFS3_RENAME = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	RENAME3args nfs3_rename_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	/* RFS3_LINK = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	LINK3args nfs3_link_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	/* RFS3_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	READDIR3args nfs3_readdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
	/* RFS3_READDIRPLUS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	READDIRPLUS3args nfs3_readdirplus_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
	/* RFS3_FSSTAT = 18 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	FSSTAT3args nfs3_fsstat_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
	/* RFS3_FSINFO = 19 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	FSINFO3args nfs3_fsinfo_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	/* RFS3_PATHCONF = 20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	PATHCONF3args nfs3_pathconf_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
	/* RFS3_COMMIT = 21 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
	COMMIT3args nfs3_commit_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	 * NFS VERSION 4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	/* COMPUND = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
	COMPOUND4args nfs4_compound_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
union rfs_res {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	 * NFS VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
	/* RFS_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	struct nfsattrstat nfs2_getattr_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
	/* RFS_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	struct nfsattrstat nfs2_setattr_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	/* RFS_ROOT = 3 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	/* RFS_LOOKUP = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	struct nfsdiropres nfs2_lookup_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	/* RFS_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	struct nfsrdlnres nfs2_readlink_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	/* RFS_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	struct nfsrdresult nfs2_read_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	/* RFS_WRITECACHE = 7 *** NO LONGER SUPPORTED *** */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	/* RFS_WRITE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
	struct nfsattrstat nfs2_write_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	/* RFS_CREATE = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
	struct nfsdiropres nfs2_create_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	/* RFS_REMOVE = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	enum nfsstat nfs2_remove_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	/* RFS_RENAME = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
	enum nfsstat nfs2_rename_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	/* RFS_LINK = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	enum nfsstat nfs2_link_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	/* RFS_SYMLINK = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	enum nfsstat nfs2_symlink_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
	/* RFS_MKDIR = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	struct nfsdiropres nfs2_mkdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	/* RFS_RMDIR = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	enum nfsstat nfs2_rmdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
	/* RFS_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	struct nfsrddirres nfs2_readdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	/* RFS_STATFS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
	struct nfsstatfs nfs2_statfs_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
	 * NFS VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
	/* RFS3_GETATTR = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
	GETATTR3res nfs3_getattr_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	/* RFS3_SETATTR = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
	SETATTR3res nfs3_setattr_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
	/* RFS3_LOOKUP = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	LOOKUP3res nfs3_lookup_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
	/* RFS3_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
	ACCESS3res nfs3_access_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
	/* RFS3_READLINK = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
	READLINK3res nfs3_readlink_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
	/* RFS3_READ = 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
	READ3res nfs3_read_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
	/* RFS3_WRITE = 7 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	WRITE3res nfs3_write_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	/* RFS3_CREATE = 8 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
	CREATE3res nfs3_create_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
	/* RFS3_MKDIR = 9 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
	MKDIR3res nfs3_mkdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	/* RFS3_SYMLINK = 10 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	SYMLINK3res nfs3_symlink_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
	/* RFS3_MKNOD = 11 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
	MKNOD3res nfs3_mknod_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
	/* RFS3_REMOVE = 12 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
	REMOVE3res nfs3_remove_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
	/* RFS3_RMDIR = 13 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
	RMDIR3res nfs3_rmdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	/* RFS3_RENAME = 14 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	RENAME3res nfs3_rename_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
	/* RFS3_LINK = 15 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	LINK3res nfs3_link_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	/* RFS3_READDIR = 16 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
	READDIR3res nfs3_readdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	/* RFS3_READDIRPLUS = 17 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	READDIRPLUS3res nfs3_readdirplus_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	/* RFS3_FSSTAT = 18 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
	FSSTAT3res nfs3_fsstat_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
	/* RFS3_FSINFO = 19 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
	FSINFO3res nfs3_fsinfo_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
	/* RFS3_PATHCONF = 20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
	PATHCONF3res nfs3_pathconf_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
	/* RFS3_COMMIT = 21 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
	COMMIT3res nfs3_commit_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	 * NFS VERSION 4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
	/* RFS_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
	/* RFS4_COMPOUND = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
	COMPOUND4res nfs4_compound_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
static struct rpc_disptable rfs_disptable[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
	{sizeof (rfsdisptab_v2) / sizeof (rfsdisptab_v2[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
	    rfscallnames_v2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
	    &rfsproccnt_v2_ptr, rfsdisptab_v2},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
	{sizeof (rfsdisptab_v3) / sizeof (rfsdisptab_v3[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	    rfscallnames_v3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	    &rfsproccnt_v3_ptr, rfsdisptab_v3},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
	{sizeof (rfsdisptab_v4) / sizeof (rfsdisptab_v4[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
	    rfscallnames_v4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
	    &rfsproccnt_v4_ptr, rfsdisptab_v4},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
 * If nfs_portmon is set, then clients are required to use privileged
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
 * ports (ports < IPPORT_RESERVED) in order to get NFS services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
 * N.B.: this attempt to carry forward the already ill-conceived notion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
 * of privileged ports for TCP/UDP is really quite ineffectual.  Not only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
 * is it transport-dependent, it's laughably easy to spoof.  If you're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
 * really interested in security, you must start with secure RPC instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
static int nfs_portmon = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
static int cred_hits = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
static int cred_misses = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
 * Debug code to allow disabling of rfs_dispatch() use of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
 * fastxdrargs() and fastxdrres() calls for testing purposes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
static int rfs_no_fast_xdrargs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
static int rfs_no_fast_xdrres = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
union acl_args {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
	 * ACL VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	/* ACL2_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	/* ACL2_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
	GETACL2args acl2_getacl_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	/* ACL2_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	SETACL2args acl2_setacl_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
	/* ACL2_GETATTR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
	GETATTR2args acl2_getattr_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	/* ACL2_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	ACCESS2args acl2_access_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
	/* ACL2_GETXATTRDIR = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
	GETXATTRDIR2args acl2_getxattrdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	 * ACL VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	/* ACL3_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	/* ACL3_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
	GETACL3args acl3_getacl_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	/* ACL3_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	SETACL3args acl3_setacl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	/* ACL3_GETXATTRDIR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	GETXATTRDIR3args acl3_getxattrdir_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
union acl_res {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	 * ACL VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	/* ACL2_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	/* ACL2_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	GETACL2res acl2_getacl_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	/* ACL2_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	SETACL2res acl2_setacl_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	/* ACL2_GETATTR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	GETATTR2res acl2_getattr_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	/* ACL2_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	ACCESS2res acl2_access_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	/* ACL2_GETXATTRDIR = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	GETXATTRDIR2args acl2_getxattrdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	 * ACL VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	/* ACL3_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	/* ACL3_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	GETACL3res acl3_getacl_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
	/* ACL3_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
	SETACL3res acl3_setacl_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	/* ACL3_GETXATTRDIR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	GETXATTRDIR3res acl3_getxattrdir_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
auth_tooweak(struct svc_req *req, char *res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	if (req->rq_vers == NFS_VERSION && req->rq_proc == RFS_LOOKUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
		struct nfsdiropres *dr = (struct nfsdiropres *)res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
		if (dr->dr_status == WNFSERR_CLNT_FLAVOR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	} else if (req->rq_vers == NFS_V3 && req->rq_proc == NFSPROC3_LOOKUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
		LOOKUP3res *resp = (LOOKUP3res *)res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		if (resp->status == WNFSERR_CLNT_FLAVOR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1417
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
common_dispatch(struct svc_req *req, SVCXPRT *xprt, rpcvers_t min_vers,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
		rpcvers_t max_vers, char *pgmname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
		struct rpc_disptable *disptable)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	int which;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	rpcvers_t vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	char *args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
			union rfs_args ra;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
			union acl_args aa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
		} args_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	char *res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
			union rfs_res rr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
			union acl_res ar;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
		} res_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	struct rpcdisp *disp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	int dis_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	cred_t *cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
	int anon_ok;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	struct exportinfo *exi = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	unsigned int nfslog_rec_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
	int dupstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
	struct dupreq *dr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
	int authres;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
	bool_t publicfh_ok = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
	enum_t auth_flavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
	bool_t dupcached = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
	struct netbuf	nb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
	bool_t logging_enabled = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
	struct exportinfo *nfslog_exi = NULL;
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1451
	char **procnames;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1452
	char cbuf[INET6_ADDRSTRLEN];	/* to hold both IPv4 and IPv6 addr */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	vers = req->rq_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	if (vers < min_vers || vers > max_vers) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
		svcerr_progvers(req->rq_xprt, min_vers, max_vers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
		error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
		cmn_err(CE_NOTE, "%s: bad version number %u", pgmname, vers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	vers -= min_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	which = req->rq_proc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	if (which < 0 || which >= disptable[(int)vers].dis_nprocs) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
		svcerr_noproc(req->rq_xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
		error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	(*(disptable[(int)vers].dis_proccntp))[which].value.ui64++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	disp = &disptable[(int)vers].dis_table[which];
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1474
	procnames = disptable[(int)vers].dis_procnames;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
	auth_flavor = req->rq_cred.oa_flavor;
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1477
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
	 * Deserialize into the args struct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
	args = (char *)&args_buf;
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1482
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	if (rfs_no_fast_xdrargs || (auth_flavor == RPCSEC_GSS) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	    disp->dis_fastxdrargs == NULL_xdrproc_t ||
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1486
	    !SVC_GETARGS(xprt, disp->dis_fastxdrargs, (char *)&args))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
	if ((auth_flavor == RPCSEC_GSS) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	    disp->dis_fastxdrargs == NULL_xdrproc_t ||
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1490
	    !SVC_GETARGS(xprt, disp->dis_fastxdrargs, (char *)&args))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
#endif
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1492
	{
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
		bzero(args, disp->dis_argsz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
		if (!SVC_GETARGS(xprt, disp->dis_xdrargs, args)) {
4635
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1495
			error++;
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1496
			/*
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1497
			 * Check if we are outside our capabilities.
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1498
			 */
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1499
			if (rfs4_minorvers_mismatch(req, xprt, (void *)args))
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1500
				goto done;
5372e33d8533 6541799 nfsv4 server should be open-minded about future minorversions
maheshvs
parents: 2822
diff changeset
  1501
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
			svcerr_decode(xprt);
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1503
			cmn_err(CE_NOTE,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1504
			    "Failed to decode arguments for %s version %u "
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1505
			    "procedure %s client %s%s",
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1506
			    pgmname, vers + min_vers, procnames[which],
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1507
			    client_name(req), client_addr(req, cbuf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	/*
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1513
	 * If Version 4 use that specific dispatch function.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
	 */
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1515
	if (req->rq_vers == 4) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1516
		error += rfs4_dispatch(disp, req, xprt, args);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1517
		goto done;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1518
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1519
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1520
	dis_flags = disp->dis_flags;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	 * Find export information and check authentication,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
	 * setting the credential if everything is ok.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
	if (disp->dis_getfh != NULL) {
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1527
		void *fh;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1528
		fsid_t *fsid;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1529
		fid_t *fid, *xfid;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1530
		fhandle_t *fh2;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1531
		nfs_fh3 *fh3;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
		fh = (*disp->dis_getfh)(args);
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1534
		switch (req->rq_vers) {
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1535
		case NFS_VERSION:
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1536
			fh2 = (fhandle_t *)fh;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1537
			fsid = &fh2->fh_fsid;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1538
			fid = (fid_t *)&fh2->fh_len;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1539
			xfid = (fid_t *)&fh2->fh_xlen;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1540
			break;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1541
		case NFS_V3:
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1542
			fh3 = (nfs_fh3 *)fh;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1543
			fsid = &fh3->fh3_fsid;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1544
			fid = FH3TOFIDP(fh3);
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1545
			xfid = FH3TOXFIDP(fh3);
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1546
			break;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1547
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		 * Fix for bug 1038302 - corbin
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		 * There is a problem here if anonymous access is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
		 * disallowed.  If the current request is part of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		 * client's mount process for the requested filesystem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
		 * then it will carry root (uid 0) credentials on it, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		 * will be denied by checkauth if that client does not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
		 * have explicit root=0 permission.  This will cause the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
		 * client's mount operation to fail.  As a work-around,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
		 * we check here to see if the request is a getattr or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
		 * statfs operation on the exported vnode itself, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		 * pass a flag to checkauth with the result of this test.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
		 * The filehandle refers to the mountpoint itself if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
		 * the fh_data and fh_xdata portions of the filehandle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
		 * are equal.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
		 * Added anon_ok argument to checkauth().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1569
		if ((dis_flags & RPC_ALLOWANON) && EQFID(fid, xfid))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
			anon_ok = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
			anon_ok = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
		cr = xprt->xp_cred;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
		ASSERT(cr != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
		if (crgetref(cr) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
			crfree(cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
			cr = crget();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
			xprt->xp_cred = cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
			cred_misses++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
			cred_hits++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
		if (crgetref(cr) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
			crfree(cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
			cr = crget();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
			xprt->xp_cred = cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1592
		exi = checkexport(fsid, xfid);
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1593
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
		if (exi != NULL) {
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1595
			publicfh_ok = PUBLICFH_CHECK(disp, exi, fsid, xfid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
			 * Don't allow non-V4 clients access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
			 * to pseudo exports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
			if (PSEUDO(exi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
				svcerr_weakauth(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
				error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
			authres = checkauth(exi, req, cr, anon_ok, publicfh_ok);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
			 * authres >  0: authentication OK - proceed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
			 * authres == 0: authentication weak - return error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
			 * authres <  0: authentication timeout - drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
			if (authres <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
				if (authres == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
					svcerr_weakauth(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
					error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
			}
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: 5982
diff changeset
  1620
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: 5982
diff changeset
  1621
			/* check to see if we might need charmap */
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: 5982
diff changeset
  1622
			if (exi->exi_export.ex_flags & EX_CHARMAP) {
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: 5982
diff changeset
  1623
				struct sockaddr *ca;
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: 5982
diff changeset
  1624
				ca =  (struct sockaddr *)
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: 5982
diff changeset
  1625
				    svc_getrpccaller(req->rq_xprt)->buf;
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: 5982
diff changeset
  1626
				(void) nfscmd_charmap(exi, ca);
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: 5982
diff changeset
  1627
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
		cr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	if ((dis_flags & RPC_MAPRESP) && (auth_flavor != RPCSEC_GSS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
		res = (char *)SVC_GETRES(xprt, disp->dis_ressz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
		if (res == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
			res = (char *)&res_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
		res = (char *)&res_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
	if (!(dis_flags & RPC_IDEMPOTENT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
		dupstat = SVC_DUP_EXT(xprt, req, res, disp->dis_ressz, &dr,
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: 5982
diff changeset
  1641
		    &dupcached);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
		switch (dupstat) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
		case DUP_ERROR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
			svcerr_systemerr(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
		case DUP_INPROGRESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
			if (res != (char *)&res_buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
				SVC_FREERES(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
		case DUP_NEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
		case DUP_DROP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
			curthread->t_flag |= T_DONTPEND;
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1658
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
			(*disp->dis_proc)(args, res, exi, req, cr);
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1660
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
			curthread->t_flag &= ~T_DONTPEND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
			if (curthread->t_flag & T_WOULDBLOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
				curthread->t_flag &= ~T_WOULDBLOCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
				SVC_DUPDONE_EXT(xprt, dr, res, NULL,
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: 5982
diff changeset
  1665
				    disp->dis_ressz, DUP_DROP);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
				if (res != (char *)&res_buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
					SVC_FREERES(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
				error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
			if (dis_flags & RPC_AVOIDWORK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
				SVC_DUPDONE_EXT(xprt, dr, res, NULL,
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: 5982
diff changeset
  1673
				    disp->dis_ressz, DUP_DROP);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
				SVC_DUPDONE_EXT(xprt, dr, res,
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: 5982
diff changeset
  1676
				    disp->dis_resfree == nullfree ? NULL :
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: 5982
diff changeset
  1677
				    disp->dis_resfree,
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: 5982
diff changeset
  1678
				    disp->dis_ressz, DUP_DONE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
				dupcached = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
		case DUP_DONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
		curthread->t_flag |= T_DONTPEND;
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1688
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
		(*disp->dis_proc)(args, res, exi, req, cr);
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents: 0
diff changeset
  1690
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
		curthread->t_flag &= ~T_DONTPEND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
		if (curthread->t_flag & T_WOULDBLOCK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
			curthread->t_flag &= ~T_WOULDBLOCK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
			if (res != (char *)&res_buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
				SVC_FREERES(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
	if (auth_tooweak(req, res)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
		svcerr_weakauth(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
		error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	 * Check to see if logging has been enabled on the server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
	 * If so, then obtain the export info struct to be used for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
	 * the later writing of the log record.  This is done for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
	 * the case that a lookup is done across a non-logged public
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
	 * file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
	if (nfslog_buffer_list != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		nfslog_exi = nfslog_get_exi(exi, req, res, &nfslog_rec_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
		 * Is logging enabled?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		logging_enabled = (nfslog_exi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		 * Copy the netbuf for logging purposes, before it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
		 * freed by svc_sendreply().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		if (logging_enabled) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
			NFSLOG_COPY_NETBUF(nfslog_exi, xprt, &nb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
			 * If RPC_MAPRESP flag set (i.e. in V2 ops) the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
			 * res gets copied directly into the mbuf and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
			 * may be freed soon after the sendreply. So we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
			 * must copy it here to a safe place...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
			if (res != (char *)&res_buf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
				bcopy(res, (char *)&res_buf, disp->dis_ressz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	 * Serialize and send results struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
#ifdef DEBUG
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1743
	if (rfs_no_fast_xdrres == 0 && res != (char *)&res_buf)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
#else
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1745
	if (res != (char *)&res_buf)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
#endif
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
  1747
	{
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
		if (!svc_sendreply(xprt, disp->dis_fastxdrres, res)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
			cmn_err(CE_NOTE, "%s: bad sendreply", pgmname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
		if (!svc_sendreply(xprt, disp->dis_xdrres, res)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
			cmn_err(CE_NOTE, "%s: bad sendreply", pgmname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
	 * Log if needed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
	if (logging_enabled) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
		nfslog_write_record(nfslog_exi, req, args, (char *)&res_buf,
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: 5982
diff changeset
  1764
		    cr, &nb, nfslog_rec_id, NFSLOG_ONE_BUFFER);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
		exi_rele(nfslog_exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
		kmem_free((&nb)->buf, (&nb)->len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
	 * Free results struct. With the addition of NFS V4 we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	 * have non-idempotent procedures with functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	if (disp->dis_resfree != nullfree && dupcached == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
		(*disp->dis_resfree)(res);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
	 * Free arguments struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	if (disp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
		if (!SVC_FREEARGS(xprt, disp->dis_xdrargs, args)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
			cmn_err(CE_NOTE, "%s: bad freeargs", pgmname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
		if (!SVC_FREEARGS(xprt, (xdrproc_t)0, (caddr_t)0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
			cmn_err(CE_NOTE, "%s: bad freeargs", pgmname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
			error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
	if (exi != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
		exi_rele(exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	global_svstat_ptr[req->rq_vers][NFS_BADCALLS].value.ui64 += error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	global_svstat_ptr[req->rq_vers][NFS_CALLS].value.ui64++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
rfs_dispatch(struct svc_req *req, SVCXPRT *xprt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
	common_dispatch(req, xprt, NFS_VERSMIN, NFS_VERSMAX,
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: 5982
diff changeset
  1805
	    "NFS", rfs_disptable);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
static char *aclcallnames_v2[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	"ACL2_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	"ACL2_GETACL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	"ACL2_SETACL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	"ACL2_GETATTR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
	"ACL2_ACCESS",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
	"ACL2_GETXATTRDIR"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
static struct rpcdisp acldisptab_v2[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
	 * ACL VERSION 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
	/* ACL2_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
	{rpc_null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	    nullfree, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	    0},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	/* ACL2_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	{acl2_getacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	    xdr_GETACL2args, xdr_fastGETACL2args, sizeof (GETACL2args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
	    xdr_GETACL2res, NULL_xdrproc_t, sizeof (GETACL2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	    acl2_getacl_free, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	    acl2_getacl_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
	/* ACL2_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
	{acl2_setacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
	    xdr_SETACL2args, NULL_xdrproc_t, sizeof (SETACL2args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	    xdr_SETACL2res, xdr_fastSETACL2res, sizeof (SETACL2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	    xdr_SETACL2res, NULL_xdrproc_t, sizeof (SETACL2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
	    nullfree, RPC_MAPRESP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
	    acl2_setacl_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
	/* ACL2_GETATTR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	{acl2_getattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
	    xdr_GETATTR2args, xdr_fastGETATTR2args, sizeof (GETATTR2args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
	    xdr_GETATTR2res, xdr_fastGETATTR2res, sizeof (GETATTR2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	    xdr_GETATTR2res, NULL_xdrproc_t, sizeof (GETATTR2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
	    nullfree, RPC_IDEMPOTENT|RPC_ALLOWANON|RPC_MAPRESP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	    acl2_getattr_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	/* ACL2_ACCESS = 4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	{acl2_access,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	    xdr_ACCESS2args, xdr_fastACCESS2args, sizeof (ACCESS2args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
#ifdef _LITTLE_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	    xdr_ACCESS2res, xdr_fastACCESS2res, sizeof (ACCESS2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
	    xdr_ACCESS2res, NULL_xdrproc_t, sizeof (ACCESS2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
	    nullfree, RPC_IDEMPOTENT|RPC_MAPRESP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
	    acl2_access_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
	/* ACL2_GETXATTRDIR = 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
	{acl2_getxattrdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
	    xdr_GETXATTRDIR2args, NULL_xdrproc_t, sizeof (GETXATTRDIR2args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	    xdr_GETXATTRDIR2res, NULL_xdrproc_t, sizeof (GETXATTRDIR2res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
	    nullfree, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	    acl2_getxattrdir_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
static char *aclcallnames_v3[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
	"ACL3_NULL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	"ACL3_GETACL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	"ACL3_SETACL",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	"ACL3_GETXATTRDIR"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
static struct rpcdisp acldisptab_v3[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	 * ACL VERSION 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	/* ACL3_NULL = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
	{rpc_null,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
	    xdr_void, NULL_xdrproc_t, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
	    nullfree, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
	    0},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
	/* ACL3_GETACL = 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
	{acl3_getacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
	    xdr_GETACL3args, NULL_xdrproc_t, sizeof (GETACL3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
	    xdr_GETACL3res, NULL_xdrproc_t, sizeof (GETACL3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
	    acl3_getacl_free, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	    acl3_getacl_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	/* ACL3_SETACL = 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
	{acl3_setacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	    xdr_SETACL3args, NULL_xdrproc_t, sizeof (SETACL3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	    xdr_SETACL3res, NULL_xdrproc_t, sizeof (SETACL3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	    nullfree, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	    acl3_setacl_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	/* ACL3_GETXATTRDIR = 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	{acl3_getxattrdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	    xdr_GETXATTRDIR3args, NULL_xdrproc_t, sizeof (GETXATTRDIR3args),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	    xdr_GETXATTRDIR3res, NULL_xdrproc_t, sizeof (GETXATTRDIR3res),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	    nullfree, RPC_IDEMPOTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	    acl3_getxattrdir_getfh},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
static struct rpc_disptable acl_disptable[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	{sizeof (acldisptab_v2) / sizeof (acldisptab_v2[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
		aclcallnames_v2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
		&aclproccnt_v2_ptr, acldisptab_v2},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
	{sizeof (acldisptab_v3) / sizeof (acldisptab_v3[0]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
		aclcallnames_v3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
		&aclproccnt_v3_ptr, acldisptab_v3},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
acl_dispatch(struct svc_req *req, SVCXPRT *xprt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
	common_dispatch(req, xprt, NFS_ACL_VERSMIN, NFS_ACL_VERSMAX,
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: 5982
diff changeset
  1931
	    "ACL", acl_disptable);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
checkwin(int flavor, int window, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
	struct authdes_cred *adc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
	switch (flavor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	case AUTH_DES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
		adc = (struct authdes_cred *)req->rq_clntcred;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
		if (adc->adc_fullname.window > window)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
 * checkauth() will check the access permission against the export
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
 * information.  Then map root uid/gid to appropriate uid/gid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
 * This routine is used by NFS V3 and V2 code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
checkauth(struct exportinfo *exi, struct svc_req *req, cred_t *cr, int anon_ok,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
    bool_t publicfh_ok)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
	int i, nfsflavor, rpcflavor, stat, access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
	struct secinfo *secp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
	caddr_t principal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
	char buf[INET6_ADDRSTRLEN]; /* to hold both IPv4 and IPv6 addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
	int anon_res = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
	 *	Check for privileged port number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
	 *	N.B.:  this assumes that we know the format of a netbuf.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	if (nfs_portmon) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
		struct sockaddr *ca;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
		ca = (struct sockaddr *)svc_getrpccaller(req->rq_xprt)->buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
		if (ca == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		if ((ca->sa_family == AF_INET &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
		    ntohs(((struct sockaddr_in *)ca)->sin_port) >=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		    IPPORT_RESERVED) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
		    (ca->sa_family == AF_INET6 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
		    ntohs(((struct sockaddr_in6 *)ca)->sin6_port) >=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
		    IPPORT_RESERVED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
			cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
			    "nfs_server: client %s%ssent NFS request from "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
			    "unprivileged port",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
			    client_name(req), client_addr(req, buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
	 *  return 1 on success or 0 on failure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
	stat = sec_svc_getcred(req, cr, &principal, &nfsflavor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
	 * A failed AUTH_UNIX svc_get_cred() implies we couldn't set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	 * the credentials; below we map that to anonymous.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
	if (!stat && nfsflavor != AUTH_UNIX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
		cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
		    "nfs_server: couldn't get unix cred for %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
		    client_name(req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
	 * Short circuit checkauth() on operations that support the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
	 * public filehandle, and if the request for that operation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
	 * is using the public filehandle. Note that we must call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
	 * sec_svc_getcred() first so that xp_cookie is set to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
	 * right value. Normally xp_cookie is just the RPC flavor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
	 * of the the request, but in the case of RPCSEC_GSS it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
	 * could be a pseudo flavor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
	if (publicfh_ok)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
	rpcflavor = req->rq_cred.oa_flavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
	 * Check if the auth flavor is valid for this export
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
	access = nfsauth_access(exi, req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
	if (access & NFSAUTH_DROP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
		return (-1);	/* drop the request */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
	if (access & NFSAUTH_DENIED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
		 * If anon_ok == 1 and we got NFSAUTH_DENIED, it was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
		 * probably due to the flavor not matching during the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
		 * the mount attempt. So map the flavor to AUTH_NONE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		 * so that the credentials get mapped to the anonymous
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
		 * user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
		if (anon_ok == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
			rpcflavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
			return (0);	/* deny access */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
	} else if (access & NFSAUTH_MAPNONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
		 * Access was granted even though the flavor mismatched
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
		 * because AUTH_NONE was one of the exported flavors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
		rpcflavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
	} else if (access & NFSAUTH_WRONGSEC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
		 * NFSAUTH_WRONGSEC is used for NFSv4. Since V2/V3 already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
		 * negotiates the security flavor thru MOUNT protocol, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
		 * only way it can get NFSAUTH_WRONGSEC here is from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
		 * NFS_ACL for V4. This could be for a limited view, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
		 * map it to RO access. V4 lookup/readdir will take care
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
		 * of the limited view portion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
		access |= NFSAUTH_RO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
		access &= ~NFSAUTH_WRONGSEC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
	switch (rpcflavor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
	case AUTH_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
		anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2066
		    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
		(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
	case AUTH_UNIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
		if (!stat || crgetuid(cr) == 0 && !(access & NFSAUTH_ROOT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
			anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2073
			    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
			(void) crsetgroups(cr, 0, NULL);
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: 5982
diff changeset
  2075
		} else if (!stat || crgetuid(cr) == 0 &&
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: 5982
diff changeset
  2076
		    access & NFSAUTH_ROOT) {
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: 5982
diff changeset
  2077
			/*
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: 5982
diff changeset
  2078
			 * It is root, so apply rootid to get real UID
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: 5982
diff changeset
  2079
			 * Find the secinfo structure.  We should be able
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: 5982
diff changeset
  2080
			 * to find it by the time we reach here.
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: 5982
diff changeset
  2081
			 * nfsauth_access() has done the checking.
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: 5982
diff changeset
  2082
			 */
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: 5982
diff changeset
  2083
			secp = NULL;
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: 5982
diff changeset
  2084
			for (i = 0; i < exi->exi_export.ex_seccnt; i++) {
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: 5982
diff changeset
  2085
				struct secinfo *sptr;
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: 5982
diff changeset
  2086
				sptr = &exi->exi_export.ex_secinfo[i];
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: 5982
diff changeset
  2087
				if (sptr->s_secinfo.sc_nfsnum == nfsflavor) {
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: 5982
diff changeset
  2088
					secp = sptr;
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: 5982
diff changeset
  2089
					break;
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: 5982
diff changeset
  2090
				}
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: 5982
diff changeset
  2091
			}
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: 5982
diff changeset
  2092
			if (secp != NULL) {
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: 5982
diff changeset
  2093
				(void) crsetugid(cr, secp->s_rootid,
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: 5982
diff changeset
  2094
				    secp->s_rootid);
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: 5982
diff changeset
  2095
				(void) crsetgroups(cr, 0, NULL);
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: 5982
diff changeset
  2096
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
	case AUTH_DES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
	case RPCSEC_GSS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
		 *  Find the secinfo structure.  We should be able
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
		 *  to find it by the time we reach here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
		 *  nfsauth_access() has done the checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
		secp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
		for (i = 0; i < exi->exi_export.ex_seccnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
			if (exi->exi_export.ex_secinfo[i].s_secinfo.sc_nfsnum ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
			    nfsflavor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
				secp = &exi->exi_export.ex_secinfo[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
		if (!secp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
			cmn_err(CE_NOTE, "nfs_server: client %s%shad "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
			    "no secinfo data for flavor %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
			    client_name(req), client_addr(req, buf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
			    nfsflavor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
		if (!checkwin(rpcflavor, secp->s_window, req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
			cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
			    "nfs_server: client %s%sused invalid "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
			    "auth window value",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
			    client_name(req), client_addr(req, buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
		 * Map root principals listed in the share's root= list to root,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
		 * and map any others principals that were mapped to root by RPC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
		 * to anon.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
		if (principal && sec_svc_inrootlist(rpcflavor, principal,
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: 5982
diff changeset
  2138
		    secp->s_rootcnt, secp->s_rootnames)) {
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: 5982
diff changeset
  2139
			if (crgetuid(cr) == 0 && secp->s_rootid == 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
				return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
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: 5982
diff changeset
  2142
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: 5982
diff changeset
  2143
			(void) crsetugid(cr, secp->s_rootid, secp->s_rootid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
			 * NOTE: If and when kernel-land privilege tracing is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
			 * added this may have to be replaced with code that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
			 * retrieves root's supplementary groups (e.g., using
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
			 * kgss_get_group_info().  In the meantime principals
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
			 * mapped to uid 0 get all privileges, so setting cr's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
			 * supplementary groups for them does nothing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
		 * Not a root princ, or not in root list, map UID 0/nobody to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
		 * the anon ID for the share.  (RPC sets cr's UIDs and GIDs to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
		 * UID_NOBODY and GID_NOBODY, respectively.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
		if (crgetuid(cr) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
		    (crgetuid(cr) != UID_NOBODY || crgetgid(cr) != GID_NOBODY))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2168
		    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
		(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	} /* switch on rpcflavor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
	 * Even if anon access is disallowed via ex_anon == -1, we allow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
	 * this access if anon_ok is set.  So set creds to the default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
	 * "nobody" id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
	if (anon_res != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
		if (anon_ok == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
			cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
			    "nfs_server: client %s%ssent wrong "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
			    "authentication for %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
			    client_name(req), client_addr(req, buf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
			    exi->exi_export.ex_path ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
			    exi->exi_export.ex_path : "?");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
		if (crsetugid(cr, UID_NOBODY, GID_NOBODY) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
 * returns 0 on failure, -1 on a drop, -2 on wrong security flavor,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
 * and 1 on success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
checkauth4(struct compound_state *cs, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
	int i, rpcflavor, access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
	struct secinfo *secp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
	char buf[MAXHOST + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
	int anon_res = 0, nfsflavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
	struct exportinfo *exi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
	cred_t	*cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	caddr_t	principal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
	exi = cs->exi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
	cr = cs->cr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
	principal = cs->principal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
	nfsflavor = cs->nfsflavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
	ASSERT(cr != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	rpcflavor = req->rq_cred.oa_flavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
	cs->access &= ~CS_ACCESS_LIMITED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	 * Check the access right per auth flavor on the vnode of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
	 * this export for the given request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	access = nfsauth4_access(cs->exi, cs->vp, req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
	if (access & NFSAUTH_WRONGSEC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
		return (-2);	/* no access for this security flavor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
	if (access & NFSAUTH_DROP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
		return (-1);	/* drop the request */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
	if (access & NFSAUTH_DENIED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
		if (exi->exi_export.ex_seccnt > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
			return (0);	/* deny access */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
	} else if (access & NFSAUTH_LIMITED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
		cs->access |= CS_ACCESS_LIMITED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
	} else if (access & NFSAUTH_MAPNONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		 * Access was granted even though the flavor mismatched
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
		 * because AUTH_NONE was one of the exported flavors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
		rpcflavor = AUTH_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
	 * XXX probably need to redo some of it for nfsv4?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
	 * return 1 on success or 0 on failure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
	switch (rpcflavor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
	case AUTH_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
		anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2260
		    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
		(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
	case AUTH_UNIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
		if (crgetuid(cr) == 0 && !(access & NFSAUTH_ROOT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
			anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2267
			    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
			(void) crsetgroups(cr, 0, NULL);
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: 5982
diff changeset
  2269
		} else if (crgetuid(cr) == 0 && access & NFSAUTH_ROOT) {
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: 5982
diff changeset
  2270
			/*
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: 5982
diff changeset
  2271
			 * It is root, so apply rootid to get real UID
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: 5982
diff changeset
  2272
			 * Find the secinfo structure.  We should be able
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: 5982
diff changeset
  2273
			 * to find it by the time we reach here.
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: 5982
diff changeset
  2274
			 * nfsauth_access() has done the checking.
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: 5982
diff changeset
  2275
			 */
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: 5982
diff changeset
  2276
			secp = NULL;
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: 5982
diff changeset
  2277
			for (i = 0; i < exi->exi_export.ex_seccnt; i++) {
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: 5982
diff changeset
  2278
				struct secinfo *sptr;
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: 5982
diff changeset
  2279
				sptr = &exi->exi_export.ex_secinfo[i];
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: 5982
diff changeset
  2280
				if (sptr->s_secinfo.sc_nfsnum == nfsflavor) {
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: 5982
diff changeset
  2281
					secp = &exi->exi_export.ex_secinfo[i];
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: 5982
diff changeset
  2282
					break;
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: 5982
diff changeset
  2283
				}
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: 5982
diff changeset
  2284
			}
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: 5982
diff changeset
  2285
			if (secp != NULL) {
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: 5982
diff changeset
  2286
				(void) crsetugid(cr, secp->s_rootid,
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: 5982
diff changeset
  2287
				    secp->s_rootid);
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: 5982
diff changeset
  2288
				(void) crsetgroups(cr, 0, NULL);
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: 5982
diff changeset
  2289
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
		 *  Find the secinfo structure.  We should be able
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
		 *  to find it by the time we reach here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
		 *  nfsauth_access() has done the checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		secp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
		for (i = 0; i < exi->exi_export.ex_seccnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
			if (exi->exi_export.ex_secinfo[i].s_secinfo.sc_nfsnum ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
			    nfsflavor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
				secp = &exi->exi_export.ex_secinfo[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
		if (!secp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
			cmn_err(CE_NOTE, "nfs_server: client %s%shad "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
			    "no secinfo data for flavor %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
			    client_name(req), client_addr(req, buf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
			    nfsflavor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
		if (!checkwin(rpcflavor, secp->s_window, req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
			cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
			    "nfs_server: client %s%sused invalid "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
			    "auth window value",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
			    client_name(req), client_addr(req, buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
		 * Map root principals listed in the share's root= list to root,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
		 * and map any others principals that were mapped to root by RPC
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: 5982
diff changeset
  2327
		 * to anon. If not going to anon, set to rootid (root_mapping).
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
		if (principal && sec_svc_inrootlist(rpcflavor, principal,
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: 5982
diff changeset
  2330
		    secp->s_rootcnt, secp->s_rootnames)) {
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: 5982
diff changeset
  2331
			if (crgetuid(cr) == 0 && secp->s_rootid == 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
				return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
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: 5982
diff changeset
  2334
			(void) crsetugid(cr, secp->s_rootid, secp->s_rootid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
			 * NOTE: If and when kernel-land privilege tracing is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
			 * added this may have to be replaced with code that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
			 * retrieves root's supplementary groups (e.g., using
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
			 * kgss_get_group_info().  In the meantime principals
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
			 * mapped to uid 0 get all privileges, so setting cr's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
			 * supplementary groups for them does nothing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
			(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
		 * Not a root princ, or not in root list, map UID 0/nobody to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
		 * the anon ID for the share.  (RPC sets cr's UIDs and GIDs to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
		 * UID_NOBODY and GID_NOBODY, respectively.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
		if (crgetuid(cr) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
		    (crgetuid(cr) != UID_NOBODY || crgetgid(cr) != GID_NOBODY))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
		anon_res = crsetugid(cr, exi->exi_export.ex_anon,
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: 5982
diff changeset
  2359
		    exi->exi_export.ex_anon);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
		(void) crsetgroups(cr, 0, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
	} /* switch on rpcflavor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
	 * Even if anon access is disallowed via ex_anon == -1, we allow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	 * this access if anon_ok is set.  So set creds to the default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
	 * "nobody" id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
	if (anon_res != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
		cmn_err(CE_NOTE,
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: 5982
diff changeset
  2372
		    "nfs_server: client %s%ssent wrong "
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: 5982
diff changeset
  2373
		    "authentication for %s",
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: 5982
diff changeset
  2374
		    client_name(req), client_addr(req, buf),
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: 5982
diff changeset
  2375
		    exi->exi_export.ex_path ?
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: 5982
diff changeset
  2376
		    exi->exi_export.ex_path : "?");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
client_name(struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
	char *hostname = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
	 * If it's a Unix cred then use the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
	 * hostname from the credential.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
	if (req->rq_cred.oa_flavor == AUTH_UNIX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
		hostname = ((struct authunix_parms *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
		    req->rq_clntcred)->aup_machname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
	if (hostname == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
		hostname = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
	return (hostname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
client_addr(struct svc_req *req, char *buf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
	struct sockaddr *ca;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
	uchar_t *b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
	char *frontspace = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
	 * We assume we are called in tandem with client_name and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
	 * format string looks like "...client %s%sblah blah..."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
	 * If it's a Unix cred then client_name returned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
	 * a host name, so we need insert a space between host name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
	 * and IP address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	if (req->rq_cred.oa_flavor == AUTH_UNIX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
		frontspace = " ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
	 * Convert the caller's IP address to a dotted string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	ca = (struct sockaddr *)svc_getrpccaller(req->rq_xprt)->buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
	if (ca->sa_family == AF_INET) {
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: 5982
diff changeset
  2427
		b = (uchar_t *)&((struct sockaddr_in *)ca)->sin_addr;
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: 5982
diff changeset
  2428
		(void) sprintf(buf, "%s(%d.%d.%d.%d) ", frontspace,
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: 5982
diff changeset
  2429
		    b[0] & 0xFF, b[1] & 0xFF, b[2] & 0xFF, b[3] & 0xFF);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
	} else if (ca->sa_family == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
		struct sockaddr_in6 *sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
		sin6 = (struct sockaddr_in6 *)ca;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
		(void) kinet_ntop6((uchar_t *)&sin6->sin6_addr,
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: 5982
diff changeset
  2434
		    buf, INET6_ADDRSTRLEN);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
		 * No IP address to print. If there was a host name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
		 * printed, then we print a space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
		(void) sprintf(buf, frontspace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
 * NFS Server initialization routine.  This routine should only be called
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
 * once.  It performs the following tasks:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
 *	- Call sub-initialization routines (localize access to variables)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
 *	- Initialize all locks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
 *	- initialize the version 3 write verifier
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
nfs_srvinit(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	error = nfs_exportinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
	if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
	error = rfs4_srvrinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
		nfs_exportfini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	rfs_srvrinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	rfs3_srvrinit();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
	nfsauth_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
	/* Init the stuff to control start/stop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
	nfs_server_upordown = NFS_SERVER_STOPPED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
	mutex_init(&nfs_server_upordown_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
	cv_init(&nfs_server_upordown_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
	mutex_init(&rdma_wait_mutex, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
	cv_init(&rdma_wait_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
 * NFS Server finalization routine. This routine is called to cleanup the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
 * initialization work previously performed if the NFS server module could
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
 * not be loaded correctly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
nfs_srvfini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
	nfsauth_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	rfs3_srvrfini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	rfs_srvrfini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
	nfs_exportfini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	mutex_destroy(&nfs_server_upordown_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
	cv_destroy(&nfs_server_upordown_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
	mutex_destroy(&rdma_wait_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
	cv_destroy(&rdma_wait_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
 * Set up an iovec array of up to cnt pointers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
mblk_to_iov(mblk_t *m, int cnt, struct iovec *iovp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
	while (m != NULL && cnt-- > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
		iovp->iov_base = (caddr_t)m->b_rptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
		iovp->iov_len = (m->b_wptr - m->b_rptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
		iovp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
		m = m->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
 * Common code between NFS Version 2 and NFS Version 3 for the public
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
 * filehandle multicomponent lookups.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
 * Public filehandle evaluation of a multi-component lookup, following
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
 * symbolic links, if necessary. This may result in a vnode in another
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
 * filesystem, which is OK as long as the other filesystem is exported.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
 * Note that the exi will be set either to NULL or a new reference to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
 * exportinfo struct that corresponds to the vnode of the multi-component path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
 * It is the callers responsibility to release this reference.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
rfs_publicfh_mclookup(char *p, vnode_t *dvp, cred_t *cr, vnode_t **vpp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
    struct exportinfo **exi, struct sec_ol *sec)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
	int pathflag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
	vnode_t *mc_dvp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
	vnode_t *realvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
	*exi = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
	 * check if the given path is a url or native path. Since p is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
	 * modified by MCLpath(), it may be empty after returning from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
	 * there, and should be checked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
	if ((pathflag = MCLpath(&p)) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
	 * If pathflag is SECURITY_QUERY, turn the SEC_QUERY bit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
	 * on in sec->sec_flags. This bit will later serve as an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
	 * indication in makefh_ol() or makefh3_ol() to overload the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
	 * filehandle to contain the sec modes used by the server for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
	 * the path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
	if (pathflag == SECURITY_QUERY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
		if ((sec->sec_index = (uint_t)(*p)) > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
			sec->sec_flags |= SEC_QUERY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
			if ((pathflag = MCLpath(&p)) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
				return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
			cmn_err(CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
			    "nfs_server: invalid security index %d, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
			    "violating WebNFS SNEGO protocol.", sec->sec_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
			return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	if (p[0] == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
		error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
		goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
	error = rfs_pathname(p, &mc_dvp, vpp, dvp, cr, pathflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
	 * If name resolves to "/" we get EINVAL since we asked for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
	 * the vnode of the directory that the file is in. Try again
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	 * with NULL directory vnode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
	if (error == EINVAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
		error = rfs_pathname(p, NULL, vpp, dvp, cr, pathflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		if (!error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
			ASSERT(*vpp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
			if ((*vpp)->v_type == VDIR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
				VN_HOLD(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
				mc_dvp = *vpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
				 * This should not happen, the filesystem is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
				 * in an inconsistent state. Fail the lookup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
				 * at this point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
				VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
				error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
	if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
		goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
	if (*vpp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
		error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
		goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	ASSERT(mc_dvp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
	ASSERT(*vpp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
	if ((*vpp)->v_type == VDIR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
		do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
			 * *vpp may be an AutoFS node, so we perform
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
			 * a VOP_ACCESS() to trigger the mount of the intended
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
			 * filesystem, so we can perform the lookup in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
			 * intended filesystem.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
			 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2620
			(void) VOP_ACCESS(*vpp, 0, 0, cr, NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
			 * If vnode is covered, get the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
			 * the topmost vnode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
			if (vn_mountedvfs(*vpp) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
				error = traverse(vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
					VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
					goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2634
			if (VOP_REALVP(*vpp, &realvp, NULL) == 0 &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2635
			    realvp != *vpp) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
				 * If realvp is different from *vpp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
				 * then release our reference on *vpp, so that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
				 * the export access check be performed on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
				 * real filesystem instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
				VN_HOLD(realvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
				VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
				*vpp = realvp;
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: 5982
diff changeset
  2645
			} else {
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: 5982
diff changeset
  2646
				break;
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: 5982
diff changeset
  2647
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
		/* LINTED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
		} while (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
		 * Let nfs_vptexi() figure what the real parent is.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
		VN_RELE(mc_dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
		mc_dvp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
		 * If vnode is covered, get the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
		 * the topmost vnode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
		if (vn_mountedvfs(mc_dvp) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
			error = traverse(&mc_dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
			if (error) {
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: 5982
diff changeset
  2665
				VN_RELE(*vpp);
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: 5982
diff changeset
  2666
				goto publicfh_done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2670
		if (VOP_REALVP(mc_dvp, &realvp, NULL) == 0 &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2671
		    realvp != mc_dvp) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
			 * *vpp is a file, obtain realvp of the parent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
			 * directory vnode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
			VN_HOLD(realvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
			VN_RELE(mc_dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
			mc_dvp = realvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
	 * The pathname may take us from the public filesystem to another.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
	 * If that's the case then just set the exportinfo to the new export
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
	 * and build filehandle for it. Thanks to per-access checking there's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	 * no security issues with doing this. If the client is not allowed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
	 * access to this new export then it will get an access error when it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
	 * tries to use the filehandle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
	if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
		VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
		goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
	 * Not allowed access to pseudo exports.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
	if (PSEUDO(*exi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
		error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
		VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
		goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
	 * Do a lookup for the index file. We know the index option doesn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
	 * allow paths through handling in the share command, so mc_dvp will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	 * be the parent for the index file vnode, if its present. Use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
	 * temporary pointers to preserve and reuse the vnode pointers of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	 * original directory in case there's no index file. Note that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
	 * index file is a native path, and should not be interpreted by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
	 * the URL parser in rfs_pathname()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	if (((*exi)->exi_export.ex_flags & EX_INDEX) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
	    ((*vpp)->v_type == VDIR) && (pathflag == URLPATH)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
		vnode_t *tvp, *tmc_dvp;	/* temporary vnode pointers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
		tmc_dvp = mc_dvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
		mc_dvp = tvp = *vpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
		error = rfs_pathname((*exi)->exi_export.ex_index, NULL, vpp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
		    mc_dvp, cr, NATIVEPATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
		if (error == ENOENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
			*vpp = tvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
			mc_dvp = tmc_dvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
		} else {	/* ok or error other than ENOENT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
			if (tmc_dvp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
				VN_RELE(tmc_dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
			if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
				goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
			 * Found a valid vp for index "filename". Sanity check
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
			 * for odd case where a directory is provided as index
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
			 * option argument and leads us to another filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
			/* Release the reference on the old exi value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
			ASSERT(*exi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
			exi_rele(*exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
			if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
				VN_RELE(*vpp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
				goto publicfh_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
publicfh_done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
	if (mc_dvp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
		VN_RELE(mc_dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
 * Evaluate a multi-component path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
rfs_pathname(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
	char *path,			/* pathname to evaluate */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
	vnode_t **dirvpp,		/* ret for ptr to parent dir vnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
	vnode_t **compvpp,		/* ret for ptr to component vnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
	vnode_t *startdvp,		/* starting vnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
	cred_t *cr,			/* user's credential */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
	int pathflag)			/* flag to identify path, e.g. URL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
	char namebuf[TYPICALMAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
	struct pathname pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
	 * If pathname starts with '/', then set startdvp to root.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
	if (*path == '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
		while (*path == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
			path++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
		startdvp = rootdir;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
	error = pn_get_buf(path, UIO_SYSSPACE, &pn, namebuf, sizeof (namebuf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
	if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
		 * Call the URL parser for URL paths to modify the original
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
		 * string to handle any '%' encoded characters that exist.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
		 * Done here to avoid an extra bcopy in the lookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
		 * We need to be careful about pathlen's. We know that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
		 * rfs_pathname() is called with a non-empty path. However,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
		 * it could be emptied due to the path simply being all /'s,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
		 * which is valid to proceed with the lookup, or due to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
		 * URL parser finding an encoded null character at the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
		 * beginning of path which should not proceed with the lookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
		if (pn.pn_pathlen != 0 && pathflag == URLPATH) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
			URLparse(pn.pn_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
			if ((pn.pn_pathlen = strlen(pn.pn_path)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
				return (ENOENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
		VN_HOLD(startdvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
		error = lookuppnvp(&pn, NULL, NO_FOLLOW, dirvpp, compvpp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
		    rootdir, startdvp, cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
	if (error == ENAMETOOLONG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
		 * This thread used a pathname > TYPICALMAXPATHLEN bytes long.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
		if (error = pn_get(path, UIO_SYSSPACE, &pn))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
			return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
		if (pn.pn_pathlen != 0 && pathflag == URLPATH) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
			URLparse(pn.pn_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
			if ((pn.pn_pathlen = strlen(pn.pn_path)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
				pn_free(&pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
				return (ENOENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
		VN_HOLD(startdvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
		error = lookuppnvp(&pn, NULL, NO_FOLLOW, dirvpp, compvpp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
		    rootdir, startdvp, cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
		pn_free(&pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
 * Adapt the multicomponent lookup path depending on the pathtype
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
MCLpath(char **path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
	unsigned char c = (unsigned char)**path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
	 * If the MCL path is between 0x20 and 0x7E (graphic printable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
	 * character of the US-ASCII coded character set), its a URL path,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
	 * per RFC 1738.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
	if (c >= 0x20 && c <= 0x7E)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
		return (URLPATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
	 * If the first octet of the MCL path is not an ASCII character
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
	 * then it must be interpreted as a tag value that describes the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
	 * format of the remaining octets of the MCL path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
	 * If the first octet of the MCL path is 0x81 it is a query
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
	 * for the security info.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
	switch (c) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
	case 0x80:	/* native path, i.e. MCL via mount protocol */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
		(*path)++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
		return (NATIVEPATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
	case 0x81:	/* security query */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
		(*path)++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
		return (SECURITY_QUERY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
#define	fromhex(c)  ((c >= '0' && c <= '9') ? (c - '0') : \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
			((c >= 'A' && c <= 'F') ? (c - 'A' + 10) :\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
			((c >= 'a' && c <= 'f') ? (c - 'a' + 10) : 0)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 4635
diff changeset
  2868
 * The implementation of URLparse guarantees that the final string will
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
 * fit in the original one. Replaces '%' occurrences followed by 2 characters
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
 * with its corresponding hexadecimal character.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
URLparse(char *str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
	char *p, *q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
	p = q = str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
		*q = *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
		if (*p++ == '%') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
			if (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
				*q = fromhex(*p) * 16;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
				p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
				if (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
					*q += fromhex(*p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
					p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
		q++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
	*q = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
 * Get the export information for the lookup vnode, and verify its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
 * useable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
nfs_check_vpexi(vnode_t *mc_dvp, vnode_t *vp, cred_t *cr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
    struct exportinfo **exi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
	int walk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
	*exi = nfs_vptoexi(mc_dvp, vp, cr, &walk, NULL, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
	if (*exi == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
		 * If nosub is set for this export then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
		 * a lookup relative to the public fh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
		 * must not terminate below the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
		 * exported directory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
		if ((*exi)->exi_export.ex_flags & EX_NOSUB && walk > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
			error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
}
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2923
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2924
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2925
 * Do the main work of handling HA-NFSv4 Resource Group failover on
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2926
 * Sun Cluster.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2927
 * We need to detect whether any RG admin paths have been added or removed,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2928
 * and adjust resources accordingly.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2929
 * Currently we're using a very inefficient algorithm, ~ 2 * O(n**2). In
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2930
 * order to scale, the list and array of paths need to be held in more
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2931
 * suitable data structures.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2932
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2933
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2934
hanfsv4_failover(void)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2935
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2936
	int i, start_grace, numadded_paths = 0;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2937
	char **added_paths = NULL;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2938
	rfs4_dss_path_t *dss_path;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2939
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2940
	/*
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2941
	 * Note: currently, rfs4_dss_pathlist cannot be NULL, since
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2942
	 * it will always include an entry for NFS4_DSS_VAR_DIR. If we
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2943
	 * make the latter dynamically specified too, the following will
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2944
	 * need to be adjusted.
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2945
	 */
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2946
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2947
	/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2948
	 * First, look for removed paths: RGs that have been failed-over
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2949
	 * away from this node.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2950
	 * Walk the "currently-serving" rfs4_dss_pathlist and, for each
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2951
	 * path, check if it is on the "passed-in" rfs4_dss_newpaths array
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2952
	 * from nfsd. If not, that RG path has been removed.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2953
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2954
	 * Note that nfsd has sorted rfs4_dss_newpaths for us, and removed
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2955
	 * any duplicates.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2956
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2957
	dss_path = rfs4_dss_pathlist;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2958
	do {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2959
		int found = 0;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2960
		char *path = dss_path->path;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2961
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2962
		/* used only for non-HA so may not be removed */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2963
		if (strcmp(path, NFS4_DSS_VAR_DIR) == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2964
			dss_path = dss_path->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2965
			continue;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2966
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2967
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2968
		for (i = 0; i < rfs4_dss_numnewpaths; i++) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2969
			int cmpret;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2970
			char *newpath = rfs4_dss_newpaths[i];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2971
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2972
			/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2973
			 * Since nfsd has sorted rfs4_dss_newpaths for us,
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2974
			 * once the return from strcmp is negative we know
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2975
			 * we've passed the point where "path" should be,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2976
			 * and can stop searching: "path" has been removed.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2977
			 */
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  2978
			cmpret = strcmp(path, newpath);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2979
			if (cmpret < 0)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2980
				break;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2981
			if (cmpret == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2982
				found = 1;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2983
				break;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2984
			}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2985
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2986
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2987
		if (found == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2988
			unsigned index = dss_path->index;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2989
			rfs4_servinst_t *sip = dss_path->sip;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2990
			rfs4_dss_path_t *path_next = dss_path->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2991
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2992
			/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2993
			 * This path has been removed.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2994
			 * We must clear out the servinst reference to
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2995
			 * it, since it's now owned by another
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2996
			 * node: we should not attempt to touch it.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2997
			 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2998
			ASSERT(dss_path == sip->dss_paths[index]);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  2999
			sip->dss_paths[index] = NULL;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3000
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3001
			/* remove from "currently-serving" list, and destroy */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3002
			remque(dss_path);
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  3003
			/* allow for NUL */
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2140
diff changeset
  3004
			kmem_free(dss_path->path, strlen(dss_path->path) + 1);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3005
			kmem_free(dss_path, sizeof (rfs4_dss_path_t));
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3006
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3007
			dss_path = path_next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3008
		} else {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3009
			/* path was found; not removed */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3010
			dss_path = dss_path->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3011
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3012
	} while (dss_path != rfs4_dss_pathlist);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3013
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3014
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3015
	 * Now, look for added paths: RGs that have been failed-over
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3016
	 * to this node.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3017
	 * Walk the "passed-in" rfs4_dss_newpaths array from nfsd and,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3018
	 * for each path, check if it is on the "currently-serving"
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3019
	 * rfs4_dss_pathlist. If not, that RG path has been added.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3020
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3021
	 * Note: we don't do duplicate detection here; nfsd does that for us.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3022
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3023
	 * Note: numadded_paths <= rfs4_dss_numnewpaths, which gives us
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3024
	 * an upper bound for the size needed for added_paths[numadded_paths].
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3025
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3026
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3027
	/* probably more space than we need, but guaranteed to be enough */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3028
	if (rfs4_dss_numnewpaths > 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3029
		size_t sz = rfs4_dss_numnewpaths * sizeof (char *);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3030
		added_paths = kmem_zalloc(sz, KM_SLEEP);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3031
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3032
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3033
	/* walk the "passed-in" rfs4_dss_newpaths array from nfsd */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3034
	for (i = 0; i < rfs4_dss_numnewpaths; i++) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3035
		int found = 0;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3036
		char *newpath = rfs4_dss_newpaths[i];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3037
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3038
		dss_path = rfs4_dss_pathlist;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3039
		do {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3040
			char *path = dss_path->path;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3041
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3042
			/* used only for non-HA */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3043
			if (strcmp(path, NFS4_DSS_VAR_DIR) == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3044
				dss_path = dss_path->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3045
				continue;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3046
			}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3047
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3048
			if (strncmp(path, newpath, strlen(path)) == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3049
				found = 1;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3050
				break;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3051
			}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3052
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3053
			dss_path = dss_path->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3054
		} while (dss_path != rfs4_dss_pathlist);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3055
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3056
		if (found == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3057
			added_paths[numadded_paths] = newpath;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3058
			numadded_paths++;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3059
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3060
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3061
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3062
	/* did we find any added paths? */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3063
	if (numadded_paths > 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3064
		/* create a new server instance, and start its grace period */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3065
		start_grace = 1;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3066
		rfs4_servinst_create(start_grace, numadded_paths, added_paths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3067
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3068
		/* read in the stable storage state from these paths */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3069
		rfs4_dss_readstate(numadded_paths, added_paths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3070
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3071
		/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3072
		 * Multiple failovers during a grace period will cause
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3073
		 * clients of the same resource group to be partitioned
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3074
		 * into different server instances, with different
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3075
		 * grace periods.  Since clients of the same resource
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3076
		 * group must be subject to the same grace period,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3077
		 * we need to reset all currently active grace periods.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3078
		 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3079
		rfs4_grace_reset_all();
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3080
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3081
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3082
	if (rfs4_dss_numnewpaths > 0)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3083
		kmem_free(added_paths, rfs4_dss_numnewpaths * sizeof (char *));
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 1610
diff changeset
  3084
}