nfs_nfsdsocket.c revision 1.1.1.1.10.3 1 1.1.1.1.10.2 tls /* $NetBSD: nfs_nfsdsocket.c,v 1.1.1.1.10.3 2017/12/03 11:38:42 jdolecek Exp $ */
2 1.1.1.1.10.2 tls /*-
3 1.1.1.1.10.2 tls * Copyright (c) 1989, 1993
4 1.1.1.1.10.2 tls * The Regents of the University of California. All rights reserved.
5 1.1.1.1.10.2 tls *
6 1.1.1.1.10.2 tls * This code is derived from software contributed to Berkeley by
7 1.1.1.1.10.2 tls * Rick Macklem at The University of Guelph.
8 1.1.1.1.10.2 tls *
9 1.1.1.1.10.2 tls * Redistribution and use in source and binary forms, with or without
10 1.1.1.1.10.2 tls * modification, are permitted provided that the following conditions
11 1.1.1.1.10.2 tls * are met:
12 1.1.1.1.10.2 tls * 1. Redistributions of source code must retain the above copyright
13 1.1.1.1.10.2 tls * notice, this list of conditions and the following disclaimer.
14 1.1.1.1.10.2 tls * 2. Redistributions in binary form must reproduce the above copyright
15 1.1.1.1.10.2 tls * notice, this list of conditions and the following disclaimer in the
16 1.1.1.1.10.2 tls * documentation and/or other materials provided with the distribution.
17 1.1.1.1.10.2 tls * 4. Neither the name of the University nor the names of its contributors
18 1.1.1.1.10.2 tls * may be used to endorse or promote products derived from this software
19 1.1.1.1.10.2 tls * without specific prior written permission.
20 1.1.1.1.10.2 tls *
21 1.1.1.1.10.2 tls * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 1.1.1.1.10.2 tls * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 1.1.1.1.10.2 tls * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 1.1.1.1.10.2 tls * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 1.1.1.1.10.2 tls * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.1.1.1.10.2 tls * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 1.1.1.1.10.2 tls * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 1.1.1.1.10.2 tls * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 1.1.1.1.10.2 tls * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 1.1.1.1.10.2 tls * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 1.1.1.1.10.2 tls * SUCH DAMAGE.
32 1.1.1.1.10.2 tls *
33 1.1.1.1.10.2 tls */
34 1.1.1.1.10.2 tls
35 1.1.1.1.10.2 tls #include <sys/cdefs.h>
36 1.1.1.1.10.3 jdolecek /* __FBSDID("FreeBSD: head/sys/fs/nfsserver/nfs_nfsdsocket.c 304026 2016-08-12 22:44:59Z rmacklem "); */
37 1.1.1.1.10.2 tls __RCSID("$NetBSD: nfs_nfsdsocket.c,v 1.1.1.1.10.3 2017/12/03 11:38:42 jdolecek Exp $");
38 1.1.1.1.10.2 tls
39 1.1.1.1.10.2 tls /*
40 1.1.1.1.10.2 tls * Socket operations for use by the nfs server.
41 1.1.1.1.10.2 tls */
42 1.1.1.1.10.2 tls
43 1.1.1.1.10.2 tls #ifndef APPLEKEXT
44 1.1.1.1.10.3 jdolecek #include <fs/nfs/common/nfsport.h>
45 1.1.1.1.10.2 tls
46 1.1.1.1.10.3 jdolecek extern struct nfsstatsv1 nfsstatsv1;
47 1.1.1.1.10.2 tls extern struct nfsrvfh nfs_pubfh, nfs_rootfh;
48 1.1.1.1.10.2 tls extern int nfs_pubfhset, nfs_rootfhset;
49 1.1.1.1.10.2 tls extern struct nfsv4lock nfsv4rootfs_lock;
50 1.1.1.1.10.2 tls extern struct nfsrv_stablefirst nfsrv_stablefirst;
51 1.1.1.1.10.3 jdolecek extern struct nfsclienthashhead *nfsclienthash;
52 1.1.1.1.10.3 jdolecek extern int nfsrv_clienthashsize;
53 1.1.1.1.10.2 tls extern int nfsrc_floodlevel, nfsrc_tcpsavedreplies;
54 1.1.1.1.10.3 jdolecek extern int nfsd_debuglevel;
55 1.1.1.1.10.2 tls NFSV4ROOTLOCKMUTEX;
56 1.1.1.1.10.2 tls NFSSTATESPINLOCK;
57 1.1.1.1.10.2 tls
58 1.1.1.1.10.2 tls int (*nfsrv3_procs0[NFS_V3NPROCS])(struct nfsrv_descript *,
59 1.1.1.1.10.2 tls int, vnode_t , NFSPROC_T *, struct nfsexstuff *) = {
60 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
61 1.1.1.1.10.2 tls nfsrvd_getattr,
62 1.1.1.1.10.2 tls nfsrvd_setattr,
63 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
64 1.1.1.1.10.2 tls nfsrvd_access,
65 1.1.1.1.10.2 tls nfsrvd_readlink,
66 1.1.1.1.10.2 tls nfsrvd_read,
67 1.1.1.1.10.2 tls nfsrvd_write,
68 1.1.1.1.10.2 tls nfsrvd_create,
69 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
70 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
71 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
72 1.1.1.1.10.2 tls nfsrvd_remove,
73 1.1.1.1.10.2 tls nfsrvd_remove,
74 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
75 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
76 1.1.1.1.10.2 tls nfsrvd_readdir,
77 1.1.1.1.10.2 tls nfsrvd_readdirplus,
78 1.1.1.1.10.2 tls nfsrvd_statfs,
79 1.1.1.1.10.2 tls nfsrvd_fsinfo,
80 1.1.1.1.10.2 tls nfsrvd_pathconf,
81 1.1.1.1.10.2 tls nfsrvd_commit,
82 1.1.1.1.10.2 tls };
83 1.1.1.1.10.2 tls
84 1.1.1.1.10.2 tls int (*nfsrv3_procs1[NFS_V3NPROCS])(struct nfsrv_descript *,
85 1.1.1.1.10.2 tls int, vnode_t , vnode_t *, fhandle_t *,
86 1.1.1.1.10.2 tls NFSPROC_T *, struct nfsexstuff *) = {
87 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
88 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
89 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
90 1.1.1.1.10.2 tls nfsrvd_lookup,
91 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
92 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
93 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
94 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
95 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
96 1.1.1.1.10.2 tls nfsrvd_mkdir,
97 1.1.1.1.10.2 tls nfsrvd_symlink,
98 1.1.1.1.10.2 tls nfsrvd_mknod,
99 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
100 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
101 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
102 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
103 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
104 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
105 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
106 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
107 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
108 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
109 1.1.1.1.10.2 tls };
110 1.1.1.1.10.2 tls
111 1.1.1.1.10.2 tls int (*nfsrv3_procs2[NFS_V3NPROCS])(struct nfsrv_descript *,
112 1.1.1.1.10.2 tls int, vnode_t , vnode_t , NFSPROC_T *,
113 1.1.1.1.10.2 tls struct nfsexstuff *, struct nfsexstuff *) = {
114 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
115 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
116 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
117 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
118 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
119 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
120 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
121 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
122 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
123 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
124 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
125 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
126 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
127 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
128 1.1.1.1.10.2 tls nfsrvd_rename,
129 1.1.1.1.10.2 tls nfsrvd_link,
130 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
131 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
132 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
133 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
134 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
135 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
136 1.1.1.1.10.2 tls };
137 1.1.1.1.10.2 tls
138 1.1.1.1.10.3 jdolecek int (*nfsrv4_ops0[NFSV41_NOPS])(struct nfsrv_descript *,
139 1.1.1.1.10.2 tls int, vnode_t , NFSPROC_T *, struct nfsexstuff *) = {
140 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
141 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
142 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
143 1.1.1.1.10.2 tls nfsrvd_access,
144 1.1.1.1.10.2 tls nfsrvd_close,
145 1.1.1.1.10.2 tls nfsrvd_commit,
146 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
147 1.1.1.1.10.2 tls nfsrvd_delegpurge,
148 1.1.1.1.10.2 tls nfsrvd_delegreturn,
149 1.1.1.1.10.2 tls nfsrvd_getattr,
150 1.1.1.1.10.2 tls nfsrvd_getfh,
151 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
152 1.1.1.1.10.2 tls nfsrvd_lock,
153 1.1.1.1.10.2 tls nfsrvd_lockt,
154 1.1.1.1.10.2 tls nfsrvd_locku,
155 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
156 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
157 1.1.1.1.10.2 tls nfsrvd_verify,
158 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
159 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
160 1.1.1.1.10.2 tls nfsrvd_openconfirm,
161 1.1.1.1.10.2 tls nfsrvd_opendowngrade,
162 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
163 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
164 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
165 1.1.1.1.10.2 tls nfsrvd_read,
166 1.1.1.1.10.2 tls nfsrvd_readdirplus,
167 1.1.1.1.10.2 tls nfsrvd_readlink,
168 1.1.1.1.10.2 tls nfsrvd_remove,
169 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
170 1.1.1.1.10.2 tls nfsrvd_renew,
171 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
172 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
173 1.1.1.1.10.2 tls nfsrvd_secinfo,
174 1.1.1.1.10.2 tls nfsrvd_setattr,
175 1.1.1.1.10.2 tls nfsrvd_setclientid,
176 1.1.1.1.10.2 tls nfsrvd_setclientidcfrm,
177 1.1.1.1.10.2 tls nfsrvd_verify,
178 1.1.1.1.10.2 tls nfsrvd_write,
179 1.1.1.1.10.2 tls nfsrvd_releaselckown,
180 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
181 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
182 1.1.1.1.10.3 jdolecek nfsrvd_exchangeid,
183 1.1.1.1.10.3 jdolecek nfsrvd_createsession,
184 1.1.1.1.10.3 jdolecek nfsrvd_destroysession,
185 1.1.1.1.10.3 jdolecek nfsrvd_freestateid,
186 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
187 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
188 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
189 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
190 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
191 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
192 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
193 1.1.1.1.10.3 jdolecek nfsrvd_sequence,
194 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
195 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
196 1.1.1.1.10.3 jdolecek nfsrvd_notsupp,
197 1.1.1.1.10.3 jdolecek nfsrvd_destroyclientid,
198 1.1.1.1.10.3 jdolecek nfsrvd_reclaimcomplete,
199 1.1.1.1.10.2 tls };
200 1.1.1.1.10.2 tls
201 1.1.1.1.10.3 jdolecek int (*nfsrv4_ops1[NFSV41_NOPS])(struct nfsrv_descript *,
202 1.1.1.1.10.2 tls int, vnode_t , vnode_t *, fhandle_t *,
203 1.1.1.1.10.2 tls NFSPROC_T *, struct nfsexstuff *) = {
204 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
205 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
206 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
207 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
208 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
209 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
210 1.1.1.1.10.2 tls nfsrvd_mknod,
211 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
212 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
213 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
214 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
215 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
216 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
217 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
218 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
219 1.1.1.1.10.2 tls nfsrvd_lookup,
220 1.1.1.1.10.2 tls nfsrvd_lookup,
221 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
222 1.1.1.1.10.2 tls nfsrvd_open,
223 1.1.1.1.10.2 tls nfsrvd_openattr,
224 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
225 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
226 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
227 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
228 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
229 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
230 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
231 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
232 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
233 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
234 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
235 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
236 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
237 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
238 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
239 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
240 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
241 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
242 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
243 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
244 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
245 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
246 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
247 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
248 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
249 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
250 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
251 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
252 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
253 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
254 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
255 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
256 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
257 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
258 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
259 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
260 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
261 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
262 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
263 1.1.1.1.10.2 tls };
264 1.1.1.1.10.2 tls
265 1.1.1.1.10.3 jdolecek int (*nfsrv4_ops2[NFSV41_NOPS])(struct nfsrv_descript *,
266 1.1.1.1.10.2 tls int, vnode_t , vnode_t , NFSPROC_T *,
267 1.1.1.1.10.2 tls struct nfsexstuff *, struct nfsexstuff *) = {
268 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
269 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
270 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
271 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
272 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
273 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
274 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
275 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
276 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
277 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
278 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
279 1.1.1.1.10.2 tls nfsrvd_link,
280 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
281 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
282 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
283 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
284 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
285 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
286 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
287 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
288 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
289 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
290 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
291 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
292 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
293 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
294 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
295 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
296 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
297 1.1.1.1.10.2 tls nfsrvd_rename,
298 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
299 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
300 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
301 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
302 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
303 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
304 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
305 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
306 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
307 1.1.1.1.10.2 tls (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
308 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
309 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
310 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
311 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
312 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
313 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
314 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
315 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
316 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
317 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
318 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
319 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
320 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
321 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
322 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
323 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
324 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
325 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
326 1.1.1.1.10.3 jdolecek (int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
327 1.1.1.1.10.2 tls };
328 1.1.1.1.10.2 tls #endif /* !APPLEKEXT */
329 1.1.1.1.10.2 tls
330 1.1.1.1.10.2 tls /*
331 1.1.1.1.10.2 tls * Static array that defines which nfs rpc's are nonidempotent
332 1.1.1.1.10.2 tls */
333 1.1.1.1.10.2 tls static int nfsrv_nonidempotent[NFS_V3NPROCS] = {
334 1.1.1.1.10.2 tls FALSE,
335 1.1.1.1.10.2 tls FALSE,
336 1.1.1.1.10.2 tls TRUE,
337 1.1.1.1.10.2 tls FALSE,
338 1.1.1.1.10.2 tls FALSE,
339 1.1.1.1.10.2 tls FALSE,
340 1.1.1.1.10.2 tls FALSE,
341 1.1.1.1.10.2 tls TRUE,
342 1.1.1.1.10.2 tls TRUE,
343 1.1.1.1.10.2 tls TRUE,
344 1.1.1.1.10.2 tls TRUE,
345 1.1.1.1.10.2 tls TRUE,
346 1.1.1.1.10.2 tls TRUE,
347 1.1.1.1.10.2 tls TRUE,
348 1.1.1.1.10.2 tls TRUE,
349 1.1.1.1.10.2 tls TRUE,
350 1.1.1.1.10.2 tls FALSE,
351 1.1.1.1.10.2 tls FALSE,
352 1.1.1.1.10.2 tls FALSE,
353 1.1.1.1.10.2 tls FALSE,
354 1.1.1.1.10.2 tls FALSE,
355 1.1.1.1.10.2 tls FALSE,
356 1.1.1.1.10.2 tls };
357 1.1.1.1.10.2 tls
358 1.1.1.1.10.2 tls /*
359 1.1.1.1.10.2 tls * This static array indicates whether or not the RPC modifies the
360 1.1.1.1.10.2 tls * file system.
361 1.1.1.1.10.2 tls */
362 1.1.1.1.10.2 tls static int nfs_writerpc[NFS_NPROCS] = { 0, 0, 1, 0, 0, 0, 0,
363 1.1.1.1.10.2 tls 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
364 1.1.1.1.10.2 tls 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
365 1.1.1.1.10.2 tls
366 1.1.1.1.10.2 tls /* local functions */
367 1.1.1.1.10.2 tls static void nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
368 1.1.1.1.10.3 jdolecek u_char *tag, int taglen, u_int32_t minorvers, NFSPROC_T *p);
369 1.1.1.1.10.2 tls
370 1.1.1.1.10.2 tls
371 1.1.1.1.10.2 tls /*
372 1.1.1.1.10.2 tls * This static array indicates which server procedures require the extra
373 1.1.1.1.10.2 tls * arguments to return the current file handle for V2, 3.
374 1.1.1.1.10.2 tls */
375 1.1.1.1.10.2 tls static int nfs_retfh[NFS_V3NPROCS] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
376 1.1.1.1.10.2 tls 1, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0 };
377 1.1.1.1.10.2 tls
378 1.1.1.1.10.3 jdolecek extern struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS];
379 1.1.1.1.10.2 tls
380 1.1.1.1.10.2 tls static int nfsv3to4op[NFS_V3NPROCS] = {
381 1.1.1.1.10.2 tls NFSPROC_NULL,
382 1.1.1.1.10.2 tls NFSV4OP_GETATTR,
383 1.1.1.1.10.2 tls NFSV4OP_SETATTR,
384 1.1.1.1.10.2 tls NFSV4OP_LOOKUP,
385 1.1.1.1.10.2 tls NFSV4OP_ACCESS,
386 1.1.1.1.10.2 tls NFSV4OP_READLINK,
387 1.1.1.1.10.2 tls NFSV4OP_READ,
388 1.1.1.1.10.2 tls NFSV4OP_WRITE,
389 1.1.1.1.10.2 tls NFSV4OP_V3CREATE,
390 1.1.1.1.10.2 tls NFSV4OP_MKDIR,
391 1.1.1.1.10.2 tls NFSV4OP_SYMLINK,
392 1.1.1.1.10.2 tls NFSV4OP_MKNOD,
393 1.1.1.1.10.2 tls NFSV4OP_REMOVE,
394 1.1.1.1.10.2 tls NFSV4OP_RMDIR,
395 1.1.1.1.10.2 tls NFSV4OP_RENAME,
396 1.1.1.1.10.2 tls NFSV4OP_LINK,
397 1.1.1.1.10.2 tls NFSV4OP_READDIR,
398 1.1.1.1.10.2 tls NFSV4OP_READDIRPLUS,
399 1.1.1.1.10.2 tls NFSV4OP_FSSTAT,
400 1.1.1.1.10.2 tls NFSV4OP_FSINFO,
401 1.1.1.1.10.2 tls NFSV4OP_PATHCONF,
402 1.1.1.1.10.2 tls NFSV4OP_COMMIT,
403 1.1.1.1.10.2 tls };
404 1.1.1.1.10.2 tls
405 1.1.1.1.10.3 jdolecek static struct mtx nfsrvd_statmtx;
406 1.1.1.1.10.3 jdolecek MTX_SYSINIT(nfsst, &nfsrvd_statmtx, "NFSstat", MTX_DEF);
407 1.1.1.1.10.3 jdolecek
408 1.1.1.1.10.3 jdolecek static void
409 1.1.1.1.10.3 jdolecek nfsrvd_statstart(int op, struct bintime *now)
410 1.1.1.1.10.3 jdolecek {
411 1.1.1.1.10.3 jdolecek if (op > (NFSV42_NOPS + NFSV4OP_FAKENOPS)) {
412 1.1.1.1.10.3 jdolecek printf("%s: op %d invalid\n", __func__, op);
413 1.1.1.1.10.3 jdolecek return;
414 1.1.1.1.10.3 jdolecek }
415 1.1.1.1.10.3 jdolecek
416 1.1.1.1.10.3 jdolecek mtx_lock(&nfsrvd_statmtx);
417 1.1.1.1.10.3 jdolecek if (nfsstatsv1.srvstartcnt == nfsstatsv1.srvdonecnt) {
418 1.1.1.1.10.3 jdolecek if (now != NULL)
419 1.1.1.1.10.3 jdolecek nfsstatsv1.busyfrom = *now;
420 1.1.1.1.10.3 jdolecek else
421 1.1.1.1.10.3 jdolecek binuptime(&nfsstatsv1.busyfrom);
422 1.1.1.1.10.3 jdolecek
423 1.1.1.1.10.3 jdolecek }
424 1.1.1.1.10.3 jdolecek nfsstatsv1.srvrpccnt[op]++;
425 1.1.1.1.10.3 jdolecek nfsstatsv1.srvstartcnt++;
426 1.1.1.1.10.3 jdolecek mtx_unlock(&nfsrvd_statmtx);
427 1.1.1.1.10.3 jdolecek
428 1.1.1.1.10.3 jdolecek }
429 1.1.1.1.10.3 jdolecek
430 1.1.1.1.10.3 jdolecek static void
431 1.1.1.1.10.3 jdolecek nfsrvd_statend(int op, uint64_t bytes, struct bintime *now,
432 1.1.1.1.10.3 jdolecek struct bintime *then)
433 1.1.1.1.10.3 jdolecek {
434 1.1.1.1.10.3 jdolecek struct bintime dt, lnow;
435 1.1.1.1.10.3 jdolecek
436 1.1.1.1.10.3 jdolecek if (op > (NFSV42_NOPS + NFSV4OP_FAKENOPS)) {
437 1.1.1.1.10.3 jdolecek printf("%s: op %d invalid\n", __func__, op);
438 1.1.1.1.10.3 jdolecek return;
439 1.1.1.1.10.3 jdolecek }
440 1.1.1.1.10.3 jdolecek
441 1.1.1.1.10.3 jdolecek if (now == NULL) {
442 1.1.1.1.10.3 jdolecek now = &lnow;
443 1.1.1.1.10.3 jdolecek binuptime(now);
444 1.1.1.1.10.3 jdolecek }
445 1.1.1.1.10.3 jdolecek
446 1.1.1.1.10.3 jdolecek mtx_lock(&nfsrvd_statmtx);
447 1.1.1.1.10.3 jdolecek
448 1.1.1.1.10.3 jdolecek nfsstatsv1.srvbytes[op] += bytes;
449 1.1.1.1.10.3 jdolecek nfsstatsv1.srvops[op]++;
450 1.1.1.1.10.3 jdolecek
451 1.1.1.1.10.3 jdolecek if (then != NULL) {
452 1.1.1.1.10.3 jdolecek dt = *now;
453 1.1.1.1.10.3 jdolecek bintime_sub(&dt, then);
454 1.1.1.1.10.3 jdolecek bintime_add(&nfsstatsv1.srvduration[op], &dt);
455 1.1.1.1.10.3 jdolecek }
456 1.1.1.1.10.3 jdolecek
457 1.1.1.1.10.3 jdolecek dt = *now;
458 1.1.1.1.10.3 jdolecek bintime_sub(&dt, &nfsstatsv1.busyfrom);
459 1.1.1.1.10.3 jdolecek bintime_add(&nfsstatsv1.busytime, &dt);
460 1.1.1.1.10.3 jdolecek nfsstatsv1.busyfrom = *now;
461 1.1.1.1.10.3 jdolecek
462 1.1.1.1.10.3 jdolecek nfsstatsv1.srvdonecnt++;
463 1.1.1.1.10.3 jdolecek
464 1.1.1.1.10.3 jdolecek mtx_unlock(&nfsrvd_statmtx);
465 1.1.1.1.10.3 jdolecek }
466 1.1.1.1.10.3 jdolecek
467 1.1.1.1.10.2 tls /*
468 1.1.1.1.10.2 tls * Do an RPC. Basically, get the file handles translated to vnode pointers
469 1.1.1.1.10.2 tls * and then call the appropriate server routine. The server routines are
470 1.1.1.1.10.2 tls * split into groups, based on whether they use a file handle or file
471 1.1.1.1.10.2 tls * handle plus name or ...
472 1.1.1.1.10.2 tls * The NFS V4 Compound RPC is performed separately by nfsrvd_compound().
473 1.1.1.1.10.2 tls */
474 1.1.1.1.10.2 tls APPLESTATIC void
475 1.1.1.1.10.3 jdolecek nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram, u_char *tag, int taglen,
476 1.1.1.1.10.3 jdolecek u_int32_t minorvers, NFSPROC_T *p)
477 1.1.1.1.10.2 tls {
478 1.1.1.1.10.2 tls int error = 0, lktype;
479 1.1.1.1.10.2 tls vnode_t vp;
480 1.1.1.1.10.2 tls mount_t mp = NULL;
481 1.1.1.1.10.2 tls struct nfsrvfh fh;
482 1.1.1.1.10.2 tls struct nfsexstuff nes;
483 1.1.1.1.10.2 tls
484 1.1.1.1.10.2 tls /*
485 1.1.1.1.10.2 tls * Get a locked vnode for the first file handle
486 1.1.1.1.10.2 tls */
487 1.1.1.1.10.2 tls if (!(nd->nd_flag & ND_NFSV4)) {
488 1.1.1.1.10.2 tls KASSERT(nd->nd_repstat == 0, ("nfsrvd_dorpc"));
489 1.1.1.1.10.2 tls /*
490 1.1.1.1.10.2 tls * For NFSv3, if the malloc/mget allocation is near limits,
491 1.1.1.1.10.2 tls * return NFSERR_DELAY.
492 1.1.1.1.10.2 tls */
493 1.1.1.1.10.2 tls if ((nd->nd_flag & ND_NFSV3) && nfsrv_mallocmget_limit()) {
494 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_DELAY;
495 1.1.1.1.10.2 tls vp = NULL;
496 1.1.1.1.10.2 tls } else {
497 1.1.1.1.10.2 tls error = nfsrv_mtofh(nd, &fh);
498 1.1.1.1.10.2 tls if (error) {
499 1.1.1.1.10.2 tls if (error != EBADRPC)
500 1.1.1.1.10.2 tls printf("nfs dorpc err1=%d\n", error);
501 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_GARBAGE;
502 1.1.1.1.10.2 tls goto out;
503 1.1.1.1.10.2 tls }
504 1.1.1.1.10.2 tls if (nd->nd_procnum == NFSPROC_READ ||
505 1.1.1.1.10.2 tls nd->nd_procnum == NFSPROC_WRITE ||
506 1.1.1.1.10.2 tls nd->nd_procnum == NFSPROC_READDIR ||
507 1.1.1.1.10.3 jdolecek nd->nd_procnum == NFSPROC_READDIRPLUS ||
508 1.1.1.1.10.2 tls nd->nd_procnum == NFSPROC_READLINK ||
509 1.1.1.1.10.2 tls nd->nd_procnum == NFSPROC_GETATTR ||
510 1.1.1.1.10.3 jdolecek nd->nd_procnum == NFSPROC_ACCESS ||
511 1.1.1.1.10.3 jdolecek nd->nd_procnum == NFSPROC_FSSTAT ||
512 1.1.1.1.10.3 jdolecek nd->nd_procnum == NFSPROC_FSINFO)
513 1.1.1.1.10.2 tls lktype = LK_SHARED;
514 1.1.1.1.10.2 tls else
515 1.1.1.1.10.2 tls lktype = LK_EXCLUSIVE;
516 1.1.1.1.10.2 tls if (nd->nd_flag & ND_PUBLOOKUP)
517 1.1.1.1.10.2 tls nfsd_fhtovp(nd, &nfs_pubfh, lktype, &vp, &nes,
518 1.1.1.1.10.2 tls &mp, nfs_writerpc[nd->nd_procnum], p);
519 1.1.1.1.10.2 tls else
520 1.1.1.1.10.2 tls nfsd_fhtovp(nd, &fh, lktype, &vp, &nes,
521 1.1.1.1.10.2 tls &mp, nfs_writerpc[nd->nd_procnum], p);
522 1.1.1.1.10.2 tls if (nd->nd_repstat == NFSERR_PROGNOTV4)
523 1.1.1.1.10.2 tls goto out;
524 1.1.1.1.10.2 tls }
525 1.1.1.1.10.2 tls }
526 1.1.1.1.10.2 tls
527 1.1.1.1.10.2 tls /*
528 1.1.1.1.10.2 tls * For V2 and 3, set the ND_SAVEREPLY flag for the recent request
529 1.1.1.1.10.2 tls * cache, as required.
530 1.1.1.1.10.2 tls * For V4, nfsrvd_compound() does this.
531 1.1.1.1.10.2 tls */
532 1.1.1.1.10.2 tls if (!(nd->nd_flag & ND_NFSV4) && nfsrv_nonidempotent[nd->nd_procnum])
533 1.1.1.1.10.2 tls nd->nd_flag |= ND_SAVEREPLY;
534 1.1.1.1.10.2 tls
535 1.1.1.1.10.2 tls nfsrvd_rephead(nd);
536 1.1.1.1.10.2 tls /*
537 1.1.1.1.10.2 tls * If nd_repstat is non-zero, just fill in the reply status
538 1.1.1.1.10.2 tls * to complete the RPC reply for V2. Otherwise, you must do
539 1.1.1.1.10.2 tls * the RPC.
540 1.1.1.1.10.2 tls */
541 1.1.1.1.10.2 tls if (nd->nd_repstat && (nd->nd_flag & ND_NFSV2)) {
542 1.1.1.1.10.2 tls *nd->nd_errp = nfsd_errmap(nd);
543 1.1.1.1.10.3 jdolecek nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], /*now*/ NULL);
544 1.1.1.1.10.3 jdolecek nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
545 1.1.1.1.10.3 jdolecek /*now*/ NULL, /*then*/ NULL);
546 1.1.1.1.10.2 tls if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
547 1.1.1.1.10.2 tls vn_finished_write(mp);
548 1.1.1.1.10.2 tls goto out;
549 1.1.1.1.10.2 tls }
550 1.1.1.1.10.2 tls
551 1.1.1.1.10.2 tls /*
552 1.1.1.1.10.2 tls * Now the procedure can be performed. For V4, nfsrvd_compound()
553 1.1.1.1.10.2 tls * works through the sub-rpcs, otherwise just call the procedure.
554 1.1.1.1.10.2 tls * The procedures are in three groups with different arguments.
555 1.1.1.1.10.2 tls * The group is indicated by the value in nfs_retfh[].
556 1.1.1.1.10.2 tls */
557 1.1.1.1.10.2 tls if (nd->nd_flag & ND_NFSV4) {
558 1.1.1.1.10.3 jdolecek nfsrvd_compound(nd, isdgram, tag, taglen, minorvers, p);
559 1.1.1.1.10.2 tls } else {
560 1.1.1.1.10.3 jdolecek struct bintime start_time;
561 1.1.1.1.10.3 jdolecek
562 1.1.1.1.10.3 jdolecek binuptime(&start_time);
563 1.1.1.1.10.3 jdolecek nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], &start_time);
564 1.1.1.1.10.3 jdolecek
565 1.1.1.1.10.2 tls if (nfs_retfh[nd->nd_procnum] == 1) {
566 1.1.1.1.10.2 tls if (vp)
567 1.1.1.1.10.2 tls NFSVOPUNLOCK(vp, 0);
568 1.1.1.1.10.2 tls error = (*(nfsrv3_procs1[nd->nd_procnum]))(nd, isdgram,
569 1.1.1.1.10.2 tls vp, NULL, (fhandle_t *)fh.nfsrvfh_data, p, &nes);
570 1.1.1.1.10.2 tls } else if (nfs_retfh[nd->nd_procnum] == 2) {
571 1.1.1.1.10.2 tls error = (*(nfsrv3_procs2[nd->nd_procnum]))(nd, isdgram,
572 1.1.1.1.10.2 tls vp, NULL, p, &nes, NULL);
573 1.1.1.1.10.2 tls } else {
574 1.1.1.1.10.2 tls error = (*(nfsrv3_procs0[nd->nd_procnum]))(nd, isdgram,
575 1.1.1.1.10.2 tls vp, p, &nes);
576 1.1.1.1.10.2 tls }
577 1.1.1.1.10.2 tls if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
578 1.1.1.1.10.2 tls vn_finished_write(mp);
579 1.1.1.1.10.3 jdolecek
580 1.1.1.1.10.3 jdolecek nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
581 1.1.1.1.10.3 jdolecek /*now*/ NULL, /*then*/ &start_time);
582 1.1.1.1.10.2 tls }
583 1.1.1.1.10.2 tls if (error) {
584 1.1.1.1.10.2 tls if (error != EBADRPC)
585 1.1.1.1.10.2 tls printf("nfs dorpc err2=%d\n", error);
586 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_GARBAGE;
587 1.1.1.1.10.2 tls }
588 1.1.1.1.10.2 tls *nd->nd_errp = nfsd_errmap(nd);
589 1.1.1.1.10.2 tls
590 1.1.1.1.10.2 tls /*
591 1.1.1.1.10.2 tls * Don't cache certain reply status values.
592 1.1.1.1.10.2 tls */
593 1.1.1.1.10.2 tls if (nd->nd_repstat && (nd->nd_flag & ND_SAVEREPLY) &&
594 1.1.1.1.10.2 tls (nd->nd_repstat == NFSERR_GARBAGE ||
595 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_BADXDR ||
596 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_MOVED ||
597 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_DELAY ||
598 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_BADSEQID ||
599 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_RESOURCE ||
600 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_SERVERFAULT ||
601 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_STALECLIENTID ||
602 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_STALESTATEID ||
603 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_OLDSTATEID ||
604 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_BADSTATEID ||
605 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_GRACE ||
606 1.1.1.1.10.2 tls nd->nd_repstat == NFSERR_NOGRACE))
607 1.1.1.1.10.2 tls nd->nd_flag &= ~ND_SAVEREPLY;
608 1.1.1.1.10.2 tls
609 1.1.1.1.10.2 tls out:
610 1.1.1.1.10.2 tls NFSEXITCODE2(0, nd);
611 1.1.1.1.10.2 tls }
612 1.1.1.1.10.2 tls
613 1.1.1.1.10.2 tls /*
614 1.1.1.1.10.2 tls * Breaks down a compound RPC request and calls the server routines for
615 1.1.1.1.10.2 tls * the subprocedures.
616 1.1.1.1.10.2 tls * Some suboperations are performed directly here to simplify file handle<-->
617 1.1.1.1.10.2 tls * vnode pointer handling.
618 1.1.1.1.10.2 tls */
619 1.1.1.1.10.2 tls static void
620 1.1.1.1.10.3 jdolecek nfsrvd_compound(struct nfsrv_descript *nd, int isdgram, u_char *tag,
621 1.1.1.1.10.3 jdolecek int taglen, u_int32_t minorvers, NFSPROC_T *p)
622 1.1.1.1.10.2 tls {
623 1.1.1.1.10.3 jdolecek int i, lktype, op, op0 = 0, statsinprog = 0;
624 1.1.1.1.10.2 tls u_int32_t *tl;
625 1.1.1.1.10.2 tls struct nfsclient *clp, *nclp;
626 1.1.1.1.10.3 jdolecek int numops, error = 0, igotlock;
627 1.1.1.1.10.3 jdolecek u_int32_t retops = 0, *retopsp = NULL, *repp;
628 1.1.1.1.10.2 tls vnode_t vp, nvp, savevp;
629 1.1.1.1.10.2 tls struct nfsrvfh fh;
630 1.1.1.1.10.2 tls mount_t new_mp, temp_mp = NULL;
631 1.1.1.1.10.2 tls struct ucred *credanon;
632 1.1.1.1.10.2 tls struct nfsexstuff nes, vpnes, savevpnes;
633 1.1.1.1.10.2 tls fsid_t cur_fsid, save_fsid;
634 1.1.1.1.10.2 tls static u_int64_t compref = 0;
635 1.1.1.1.10.3 jdolecek struct bintime start_time;
636 1.1.1.1.10.2 tls
637 1.1.1.1.10.2 tls NFSVNO_EXINIT(&vpnes);
638 1.1.1.1.10.2 tls NFSVNO_EXINIT(&savevpnes);
639 1.1.1.1.10.2 tls /*
640 1.1.1.1.10.2 tls * Put the seq# of the current compound RPC in nfsrv_descript.
641 1.1.1.1.10.2 tls * (This is used by nfsrv_checkgetattr(), to see if the write
642 1.1.1.1.10.2 tls * delegation was created by the same compound RPC as the one
643 1.1.1.1.10.2 tls * with that Getattr in it.)
644 1.1.1.1.10.2 tls * Don't worry about the 64bit number wrapping around. It ain't
645 1.1.1.1.10.2 tls * gonna happen before this server gets shut down/rebooted.
646 1.1.1.1.10.2 tls */
647 1.1.1.1.10.2 tls nd->nd_compref = compref++;
648 1.1.1.1.10.2 tls
649 1.1.1.1.10.2 tls /*
650 1.1.1.1.10.2 tls * Check for and optionally get a lock on the root. This lock means that
651 1.1.1.1.10.2 tls * no nfsd will be fiddling with the V4 file system and state stuff. It
652 1.1.1.1.10.2 tls * is required when the V4 root is being changed, the stable storage
653 1.1.1.1.10.2 tls * restart file is being updated, or callbacks are being done.
654 1.1.1.1.10.2 tls * When any of the nfsd are processing an NFSv4 compound RPC, they must
655 1.1.1.1.10.2 tls * either hold a reference count (nfs_usecnt) or the lock. When
656 1.1.1.1.10.2 tls * nfsrv_unlock() is called to release the lock, it can optionally
657 1.1.1.1.10.2 tls * also get a reference count, which saves the need for a call to
658 1.1.1.1.10.2 tls * nfsrv_getref() after nfsrv_unlock().
659 1.1.1.1.10.2 tls */
660 1.1.1.1.10.2 tls /*
661 1.1.1.1.10.2 tls * First, check to see if we need to wait for an update lock.
662 1.1.1.1.10.2 tls */
663 1.1.1.1.10.2 tls igotlock = 0;
664 1.1.1.1.10.2 tls NFSLOCKV4ROOTMUTEX();
665 1.1.1.1.10.2 tls if (nfsrv_stablefirst.nsf_flags & NFSNSF_NEEDLOCK)
666 1.1.1.1.10.2 tls igotlock = nfsv4_lock(&nfsv4rootfs_lock, 1, NULL,
667 1.1.1.1.10.2 tls NFSV4ROOTLOCKMUTEXPTR, NULL);
668 1.1.1.1.10.2 tls else
669 1.1.1.1.10.2 tls igotlock = nfsv4_lock(&nfsv4rootfs_lock, 0, NULL,
670 1.1.1.1.10.2 tls NFSV4ROOTLOCKMUTEXPTR, NULL);
671 1.1.1.1.10.2 tls NFSUNLOCKV4ROOTMUTEX();
672 1.1.1.1.10.2 tls if (igotlock) {
673 1.1.1.1.10.2 tls /*
674 1.1.1.1.10.2 tls * If I got the lock, I can update the stable storage file.
675 1.1.1.1.10.2 tls * Done when the grace period is over or a client has long
676 1.1.1.1.10.2 tls * since expired.
677 1.1.1.1.10.2 tls */
678 1.1.1.1.10.2 tls nfsrv_stablefirst.nsf_flags &= ~NFSNSF_NEEDLOCK;
679 1.1.1.1.10.2 tls if ((nfsrv_stablefirst.nsf_flags &
680 1.1.1.1.10.2 tls (NFSNSF_GRACEOVER | NFSNSF_UPDATEDONE)) == NFSNSF_GRACEOVER)
681 1.1.1.1.10.2 tls nfsrv_updatestable(p);
682 1.1.1.1.10.2 tls
683 1.1.1.1.10.2 tls /*
684 1.1.1.1.10.2 tls * If at least one client has long since expired, search
685 1.1.1.1.10.2 tls * the client list for them, write a REVOKE record on the
686 1.1.1.1.10.2 tls * stable storage file and then remove them from the client
687 1.1.1.1.10.2 tls * list.
688 1.1.1.1.10.2 tls */
689 1.1.1.1.10.2 tls if (nfsrv_stablefirst.nsf_flags & NFSNSF_EXPIREDCLIENT) {
690 1.1.1.1.10.2 tls nfsrv_stablefirst.nsf_flags &= ~NFSNSF_EXPIREDCLIENT;
691 1.1.1.1.10.3 jdolecek for (i = 0; i < nfsrv_clienthashsize; i++) {
692 1.1.1.1.10.2 tls LIST_FOREACH_SAFE(clp, &nfsclienthash[i], lc_hash,
693 1.1.1.1.10.2 tls nclp) {
694 1.1.1.1.10.2 tls if (clp->lc_flags & LCL_EXPIREIT) {
695 1.1.1.1.10.2 tls if (!LIST_EMPTY(&clp->lc_open) ||
696 1.1.1.1.10.2 tls !LIST_EMPTY(&clp->lc_deleg))
697 1.1.1.1.10.2 tls nfsrv_writestable(clp->lc_id,
698 1.1.1.1.10.2 tls clp->lc_idlen, NFSNST_REVOKE, p);
699 1.1.1.1.10.2 tls nfsrv_cleanclient(clp, p);
700 1.1.1.1.10.2 tls nfsrv_freedeleglist(&clp->lc_deleg);
701 1.1.1.1.10.2 tls nfsrv_freedeleglist(&clp->lc_olddeleg);
702 1.1.1.1.10.2 tls LIST_REMOVE(clp, lc_hash);
703 1.1.1.1.10.2 tls nfsrv_zapclient(clp, p);
704 1.1.1.1.10.2 tls }
705 1.1.1.1.10.2 tls }
706 1.1.1.1.10.2 tls }
707 1.1.1.1.10.2 tls }
708 1.1.1.1.10.2 tls NFSLOCKV4ROOTMUTEX();
709 1.1.1.1.10.2 tls nfsv4_unlock(&nfsv4rootfs_lock, 1);
710 1.1.1.1.10.2 tls NFSUNLOCKV4ROOTMUTEX();
711 1.1.1.1.10.2 tls } else {
712 1.1.1.1.10.2 tls /*
713 1.1.1.1.10.2 tls * If we didn't get the lock, we need to get a refcnt,
714 1.1.1.1.10.2 tls * which also checks for and waits for the lock.
715 1.1.1.1.10.2 tls */
716 1.1.1.1.10.2 tls NFSLOCKV4ROOTMUTEX();
717 1.1.1.1.10.2 tls nfsv4_getref(&nfsv4rootfs_lock, NULL,
718 1.1.1.1.10.2 tls NFSV4ROOTLOCKMUTEXPTR, NULL);
719 1.1.1.1.10.2 tls NFSUNLOCKV4ROOTMUTEX();
720 1.1.1.1.10.2 tls }
721 1.1.1.1.10.2 tls
722 1.1.1.1.10.2 tls /*
723 1.1.1.1.10.2 tls * If flagged, search for open owners that haven't had any opens
724 1.1.1.1.10.2 tls * for a long time.
725 1.1.1.1.10.2 tls */
726 1.1.1.1.10.2 tls if (nfsrv_stablefirst.nsf_flags & NFSNSF_NOOPENS) {
727 1.1.1.1.10.2 tls nfsrv_throwawayopens(p);
728 1.1.1.1.10.2 tls }
729 1.1.1.1.10.2 tls
730 1.1.1.1.10.2 tls savevp = vp = NULL;
731 1.1.1.1.10.2 tls save_fsid.val[0] = save_fsid.val[1] = 0;
732 1.1.1.1.10.2 tls cur_fsid.val[0] = cur_fsid.val[1] = 0;
733 1.1.1.1.10.3 jdolecek
734 1.1.1.1.10.3 jdolecek /* If taglen < 0, there was a parsing error in nfsd_getminorvers(). */
735 1.1.1.1.10.2 tls if (taglen < 0) {
736 1.1.1.1.10.2 tls error = EBADRPC;
737 1.1.1.1.10.2 tls goto nfsmout;
738 1.1.1.1.10.2 tls }
739 1.1.1.1.10.3 jdolecek
740 1.1.1.1.10.2 tls (void) nfsm_strtom(nd, tag, taglen);
741 1.1.1.1.10.2 tls NFSM_BUILD(retopsp, u_int32_t *, NFSX_UNSIGNED);
742 1.1.1.1.10.3 jdolecek NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
743 1.1.1.1.10.3 jdolecek if (minorvers != NFSV4_MINORVERSION && minorvers != NFSV41_MINORVERSION)
744 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_MINORVERMISMATCH;
745 1.1.1.1.10.2 tls if (nd->nd_repstat)
746 1.1.1.1.10.2 tls numops = 0;
747 1.1.1.1.10.2 tls else
748 1.1.1.1.10.2 tls numops = fxdr_unsigned(int, *tl);
749 1.1.1.1.10.2 tls /*
750 1.1.1.1.10.2 tls * Loop around doing the sub ops.
751 1.1.1.1.10.2 tls * vp - is an unlocked vnode pointer for the CFH
752 1.1.1.1.10.2 tls * savevp - is an unlocked vnode pointer for the SAVEDFH
753 1.1.1.1.10.2 tls * (at some future date, it might turn out to be more appropriate
754 1.1.1.1.10.2 tls * to keep the file handles instead of vnode pointers?)
755 1.1.1.1.10.2 tls * savevpnes and vpnes - are the export flags for the above.
756 1.1.1.1.10.2 tls */
757 1.1.1.1.10.2 tls for (i = 0; i < numops; i++) {
758 1.1.1.1.10.2 tls NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
759 1.1.1.1.10.2 tls NFSM_BUILD(repp, u_int32_t *, 2 * NFSX_UNSIGNED);
760 1.1.1.1.10.2 tls *repp = *tl;
761 1.1.1.1.10.2 tls op = fxdr_unsigned(int, *tl);
762 1.1.1.1.10.3 jdolecek NFSD_DEBUG(4, "op=%d\n", op);
763 1.1.1.1.10.3 jdolecek
764 1.1.1.1.10.3 jdolecek binuptime(&start_time);
765 1.1.1.1.10.3 jdolecek nfsrvd_statstart(op, &start_time);
766 1.1.1.1.10.3 jdolecek statsinprog = 1;
767 1.1.1.1.10.3 jdolecek
768 1.1.1.1.10.3 jdolecek if (op < NFSV4OP_ACCESS ||
769 1.1.1.1.10.3 jdolecek (op >= NFSV4OP_NOPS && (nd->nd_flag & ND_NFSV41) == 0) ||
770 1.1.1.1.10.3 jdolecek (op >= NFSV41_NOPS && (nd->nd_flag & ND_NFSV41) != 0)) {
771 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_OPILLEGAL;
772 1.1.1.1.10.2 tls *repp++ = txdr_unsigned(NFSV4OP_OPILLEGAL);
773 1.1.1.1.10.2 tls *repp = nfsd_errmap(nd);
774 1.1.1.1.10.2 tls retops++;
775 1.1.1.1.10.2 tls break;
776 1.1.1.1.10.2 tls } else {
777 1.1.1.1.10.2 tls repp++;
778 1.1.1.1.10.2 tls }
779 1.1.1.1.10.3 jdolecek if (i == 0)
780 1.1.1.1.10.3 jdolecek op0 = op;
781 1.1.1.1.10.3 jdolecek if (i == numops - 1)
782 1.1.1.1.10.3 jdolecek nd->nd_flag |= ND_LASTOP;
783 1.1.1.1.10.2 tls
784 1.1.1.1.10.2 tls /*
785 1.1.1.1.10.2 tls * Check for a referral on the current FH and, if so, return
786 1.1.1.1.10.2 tls * NFSERR_MOVED for all ops that allow it, except Getattr.
787 1.1.1.1.10.2 tls */
788 1.1.1.1.10.2 tls if (vp != NULL && op != NFSV4OP_GETATTR &&
789 1.1.1.1.10.2 tls nfsv4root_getreferral(vp, NULL, 0) != NULL &&
790 1.1.1.1.10.2 tls nfsrv_errmoved(op)) {
791 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_MOVED;
792 1.1.1.1.10.2 tls *repp = nfsd_errmap(nd);
793 1.1.1.1.10.2 tls retops++;
794 1.1.1.1.10.2 tls break;
795 1.1.1.1.10.2 tls }
796 1.1.1.1.10.2 tls
797 1.1.1.1.10.3 jdolecek /*
798 1.1.1.1.10.3 jdolecek * For NFSv4.1, check for a Sequence Operation being first
799 1.1.1.1.10.3 jdolecek * or one of the other allowed operations by itself.
800 1.1.1.1.10.3 jdolecek */
801 1.1.1.1.10.3 jdolecek if ((nd->nd_flag & ND_NFSV41) != 0) {
802 1.1.1.1.10.3 jdolecek if (i != 0 && op == NFSV4OP_SEQUENCE)
803 1.1.1.1.10.3 jdolecek nd->nd_repstat = NFSERR_SEQUENCEPOS;
804 1.1.1.1.10.3 jdolecek else if (i == 0 && op != NFSV4OP_SEQUENCE &&
805 1.1.1.1.10.3 jdolecek op != NFSV4OP_EXCHANGEID &&
806 1.1.1.1.10.3 jdolecek op != NFSV4OP_CREATESESSION &&
807 1.1.1.1.10.3 jdolecek op != NFSV4OP_BINDCONNTOSESS &&
808 1.1.1.1.10.3 jdolecek op != NFSV4OP_DESTROYCLIENTID &&
809 1.1.1.1.10.3 jdolecek op != NFSV4OP_DESTROYSESSION)
810 1.1.1.1.10.3 jdolecek nd->nd_repstat = NFSERR_OPNOTINSESS;
811 1.1.1.1.10.3 jdolecek else if (i != 0 && op0 != NFSV4OP_SEQUENCE)
812 1.1.1.1.10.3 jdolecek nd->nd_repstat = NFSERR_NOTONLYOP;
813 1.1.1.1.10.3 jdolecek if (nd->nd_repstat != 0) {
814 1.1.1.1.10.3 jdolecek *repp = nfsd_errmap(nd);
815 1.1.1.1.10.3 jdolecek retops++;
816 1.1.1.1.10.3 jdolecek break;
817 1.1.1.1.10.3 jdolecek }
818 1.1.1.1.10.3 jdolecek }
819 1.1.1.1.10.3 jdolecek
820 1.1.1.1.10.2 tls nd->nd_procnum = op;
821 1.1.1.1.10.2 tls /*
822 1.1.1.1.10.2 tls * If over flood level, reply NFSERR_RESOURCE, if at the first
823 1.1.1.1.10.2 tls * Op. (Since a client recovery from NFSERR_RESOURCE can get
824 1.1.1.1.10.2 tls * really nasty for certain Op sequences, I'll play it safe
825 1.1.1.1.10.2 tls * and only return the error at the beginning.) The cache
826 1.1.1.1.10.2 tls * will still function over flood level, but uses lots of
827 1.1.1.1.10.2 tls * mbufs.)
828 1.1.1.1.10.2 tls * If nfsrv_mallocmget_limit() returns True, the system is near
829 1.1.1.1.10.2 tls * to its limit for memory that malloc()/mget() can allocate.
830 1.1.1.1.10.2 tls */
831 1.1.1.1.10.3 jdolecek if (i == 0 && (nd->nd_rp == NULL ||
832 1.1.1.1.10.3 jdolecek nd->nd_rp->rc_refcnt == 0) &&
833 1.1.1.1.10.2 tls (nfsrv_mallocmget_limit() ||
834 1.1.1.1.10.2 tls nfsrc_tcpsavedreplies > nfsrc_floodlevel)) {
835 1.1.1.1.10.3 jdolecek if (nfsrc_tcpsavedreplies > nfsrc_floodlevel)
836 1.1.1.1.10.3 jdolecek printf("nfsd server cache flooded, try "
837 1.1.1.1.10.3 jdolecek "increasing vfs.nfsd.tcphighwater\n");
838 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_RESOURCE;
839 1.1.1.1.10.2 tls *repp = nfsd_errmap(nd);
840 1.1.1.1.10.2 tls if (op == NFSV4OP_SETATTR) {
841 1.1.1.1.10.2 tls /*
842 1.1.1.1.10.2 tls * Setattr replies require a bitmap.
843 1.1.1.1.10.2 tls * even for errors like these.
844 1.1.1.1.10.2 tls */
845 1.1.1.1.10.2 tls NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
846 1.1.1.1.10.2 tls *tl = 0;
847 1.1.1.1.10.2 tls }
848 1.1.1.1.10.2 tls retops++;
849 1.1.1.1.10.2 tls break;
850 1.1.1.1.10.2 tls }
851 1.1.1.1.10.2 tls if (nfsv4_opflag[op].savereply)
852 1.1.1.1.10.2 tls nd->nd_flag |= ND_SAVEREPLY;
853 1.1.1.1.10.2 tls switch (op) {
854 1.1.1.1.10.2 tls case NFSV4OP_PUTFH:
855 1.1.1.1.10.2 tls error = nfsrv_mtofh(nd, &fh);
856 1.1.1.1.10.2 tls if (error)
857 1.1.1.1.10.2 tls goto nfsmout;
858 1.1.1.1.10.2 tls if (!nd->nd_repstat)
859 1.1.1.1.10.2 tls nfsd_fhtovp(nd, &fh, LK_SHARED, &nvp, &nes,
860 1.1.1.1.10.2 tls NULL, 0, p);
861 1.1.1.1.10.2 tls /* For now, allow this for non-export FHs */
862 1.1.1.1.10.2 tls if (!nd->nd_repstat) {
863 1.1.1.1.10.2 tls if (vp)
864 1.1.1.1.10.2 tls vrele(vp);
865 1.1.1.1.10.2 tls vp = nvp;
866 1.1.1.1.10.2 tls cur_fsid = vp->v_mount->mnt_stat.f_fsid;
867 1.1.1.1.10.2 tls NFSVOPUNLOCK(vp, 0);
868 1.1.1.1.10.2 tls vpnes = nes;
869 1.1.1.1.10.2 tls }
870 1.1.1.1.10.2 tls break;
871 1.1.1.1.10.2 tls case NFSV4OP_PUTPUBFH:
872 1.1.1.1.10.2 tls if (nfs_pubfhset)
873 1.1.1.1.10.2 tls nfsd_fhtovp(nd, &nfs_pubfh, LK_SHARED, &nvp,
874 1.1.1.1.10.2 tls &nes, NULL, 0, p);
875 1.1.1.1.10.2 tls else
876 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
877 1.1.1.1.10.2 tls if (!nd->nd_repstat) {
878 1.1.1.1.10.2 tls if (vp)
879 1.1.1.1.10.2 tls vrele(vp);
880 1.1.1.1.10.2 tls vp = nvp;
881 1.1.1.1.10.2 tls cur_fsid = vp->v_mount->mnt_stat.f_fsid;
882 1.1.1.1.10.2 tls NFSVOPUNLOCK(vp, 0);
883 1.1.1.1.10.2 tls vpnes = nes;
884 1.1.1.1.10.2 tls }
885 1.1.1.1.10.2 tls break;
886 1.1.1.1.10.2 tls case NFSV4OP_PUTROOTFH:
887 1.1.1.1.10.2 tls if (nfs_rootfhset) {
888 1.1.1.1.10.2 tls nfsd_fhtovp(nd, &nfs_rootfh, LK_SHARED, &nvp,
889 1.1.1.1.10.2 tls &nes, NULL, 0, p);
890 1.1.1.1.10.2 tls if (!nd->nd_repstat) {
891 1.1.1.1.10.2 tls if (vp)
892 1.1.1.1.10.2 tls vrele(vp);
893 1.1.1.1.10.2 tls vp = nvp;
894 1.1.1.1.10.2 tls cur_fsid = vp->v_mount->mnt_stat.f_fsid;
895 1.1.1.1.10.2 tls NFSVOPUNLOCK(vp, 0);
896 1.1.1.1.10.2 tls vpnes = nes;
897 1.1.1.1.10.2 tls }
898 1.1.1.1.10.2 tls } else
899 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
900 1.1.1.1.10.2 tls break;
901 1.1.1.1.10.2 tls case NFSV4OP_SAVEFH:
902 1.1.1.1.10.2 tls if (vp && NFSVNO_EXPORTED(&vpnes)) {
903 1.1.1.1.10.2 tls nd->nd_repstat = 0;
904 1.1.1.1.10.2 tls /* If vp == savevp, a no-op */
905 1.1.1.1.10.2 tls if (vp != savevp) {
906 1.1.1.1.10.2 tls if (savevp)
907 1.1.1.1.10.2 tls vrele(savevp);
908 1.1.1.1.10.2 tls VREF(vp);
909 1.1.1.1.10.2 tls savevp = vp;
910 1.1.1.1.10.2 tls savevpnes = vpnes;
911 1.1.1.1.10.2 tls save_fsid = cur_fsid;
912 1.1.1.1.10.2 tls }
913 1.1.1.1.10.2 tls } else {
914 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
915 1.1.1.1.10.2 tls }
916 1.1.1.1.10.2 tls break;
917 1.1.1.1.10.2 tls case NFSV4OP_RESTOREFH:
918 1.1.1.1.10.2 tls if (savevp) {
919 1.1.1.1.10.2 tls nd->nd_repstat = 0;
920 1.1.1.1.10.2 tls /* If vp == savevp, a no-op */
921 1.1.1.1.10.2 tls if (vp != savevp) {
922 1.1.1.1.10.2 tls VREF(savevp);
923 1.1.1.1.10.2 tls vrele(vp);
924 1.1.1.1.10.2 tls vp = savevp;
925 1.1.1.1.10.2 tls vpnes = savevpnes;
926 1.1.1.1.10.2 tls cur_fsid = save_fsid;
927 1.1.1.1.10.2 tls }
928 1.1.1.1.10.2 tls } else {
929 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_RESTOREFH;
930 1.1.1.1.10.2 tls }
931 1.1.1.1.10.2 tls break;
932 1.1.1.1.10.2 tls default:
933 1.1.1.1.10.2 tls /*
934 1.1.1.1.10.2 tls * Allow a Lookup, Getattr, GetFH, Secinfo on an
935 1.1.1.1.10.2 tls * non-exported directory if
936 1.1.1.1.10.2 tls * nfs_rootfhset. Do I need to allow any other Ops?
937 1.1.1.1.10.2 tls * (You can only have a non-exported vpnes if
938 1.1.1.1.10.2 tls * nfs_rootfhset is true. See nfsd_fhtovp())
939 1.1.1.1.10.2 tls * Allow AUTH_SYS to be used for file systems
940 1.1.1.1.10.2 tls * exported GSS only for certain Ops, to allow
941 1.1.1.1.10.2 tls * clients to do mounts more easily.
942 1.1.1.1.10.2 tls */
943 1.1.1.1.10.2 tls if (nfsv4_opflag[op].needscfh && vp) {
944 1.1.1.1.10.2 tls if (!NFSVNO_EXPORTED(&vpnes) &&
945 1.1.1.1.10.2 tls op != NFSV4OP_LOOKUP &&
946 1.1.1.1.10.2 tls op != NFSV4OP_GETATTR &&
947 1.1.1.1.10.2 tls op != NFSV4OP_GETFH &&
948 1.1.1.1.10.2 tls op != NFSV4OP_ACCESS &&
949 1.1.1.1.10.2 tls op != NFSV4OP_READLINK &&
950 1.1.1.1.10.2 tls op != NFSV4OP_SECINFO)
951 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
952 1.1.1.1.10.2 tls else if (nfsvno_testexp(nd, &vpnes) &&
953 1.1.1.1.10.2 tls op != NFSV4OP_LOOKUP &&
954 1.1.1.1.10.2 tls op != NFSV4OP_GETFH &&
955 1.1.1.1.10.2 tls op != NFSV4OP_GETATTR &&
956 1.1.1.1.10.2 tls op != NFSV4OP_SECINFO)
957 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_WRONGSEC;
958 1.1.1.1.10.2 tls if (nd->nd_repstat) {
959 1.1.1.1.10.2 tls if (op == NFSV4OP_SETATTR) {
960 1.1.1.1.10.2 tls /*
961 1.1.1.1.10.2 tls * Setattr reply requires a bitmap
962 1.1.1.1.10.2 tls * even for errors like these.
963 1.1.1.1.10.2 tls */
964 1.1.1.1.10.2 tls NFSM_BUILD(tl, u_int32_t *,
965 1.1.1.1.10.2 tls NFSX_UNSIGNED);
966 1.1.1.1.10.2 tls *tl = 0;
967 1.1.1.1.10.2 tls }
968 1.1.1.1.10.2 tls break;
969 1.1.1.1.10.2 tls }
970 1.1.1.1.10.2 tls }
971 1.1.1.1.10.2 tls if (nfsv4_opflag[op].retfh == 1) {
972 1.1.1.1.10.2 tls if (!vp) {
973 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
974 1.1.1.1.10.2 tls break;
975 1.1.1.1.10.2 tls }
976 1.1.1.1.10.2 tls VREF(vp);
977 1.1.1.1.10.2 tls if (nfsv4_opflag[op].modifyfs)
978 1.1.1.1.10.2 tls vn_start_write(vp, &temp_mp, V_WAIT);
979 1.1.1.1.10.2 tls error = (*(nfsrv4_ops1[op]))(nd, isdgram, vp,
980 1.1.1.1.10.2 tls &nvp, (fhandle_t *)fh.nfsrvfh_data, p, &vpnes);
981 1.1.1.1.10.2 tls if (!error && !nd->nd_repstat) {
982 1.1.1.1.10.2 tls if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP) {
983 1.1.1.1.10.2 tls new_mp = nvp->v_mount;
984 1.1.1.1.10.2 tls if (cur_fsid.val[0] !=
985 1.1.1.1.10.2 tls new_mp->mnt_stat.f_fsid.val[0] ||
986 1.1.1.1.10.2 tls cur_fsid.val[1] !=
987 1.1.1.1.10.2 tls new_mp->mnt_stat.f_fsid.val[1]) {
988 1.1.1.1.10.2 tls /* crossed a server mount point */
989 1.1.1.1.10.2 tls nd->nd_repstat = nfsvno_checkexp(new_mp,
990 1.1.1.1.10.2 tls nd->nd_nam, &nes, &credanon);
991 1.1.1.1.10.2 tls if (!nd->nd_repstat)
992 1.1.1.1.10.2 tls nd->nd_repstat = nfsd_excred(nd,
993 1.1.1.1.10.2 tls &nes, credanon);
994 1.1.1.1.10.2 tls if (credanon != NULL)
995 1.1.1.1.10.2 tls crfree(credanon);
996 1.1.1.1.10.2 tls if (!nd->nd_repstat) {
997 1.1.1.1.10.2 tls vpnes = nes;
998 1.1.1.1.10.2 tls cur_fsid = new_mp->mnt_stat.f_fsid;
999 1.1.1.1.10.2 tls }
1000 1.1.1.1.10.2 tls }
1001 1.1.1.1.10.2 tls /* Lookup ops return a locked vnode */
1002 1.1.1.1.10.2 tls NFSVOPUNLOCK(nvp, 0);
1003 1.1.1.1.10.2 tls }
1004 1.1.1.1.10.2 tls if (!nd->nd_repstat) {
1005 1.1.1.1.10.2 tls vrele(vp);
1006 1.1.1.1.10.2 tls vp = nvp;
1007 1.1.1.1.10.2 tls } else
1008 1.1.1.1.10.2 tls vrele(nvp);
1009 1.1.1.1.10.2 tls }
1010 1.1.1.1.10.2 tls if (nfsv4_opflag[op].modifyfs)
1011 1.1.1.1.10.2 tls vn_finished_write(temp_mp);
1012 1.1.1.1.10.2 tls } else if (nfsv4_opflag[op].retfh == 2) {
1013 1.1.1.1.10.2 tls if (vp == NULL || savevp == NULL) {
1014 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
1015 1.1.1.1.10.2 tls break;
1016 1.1.1.1.10.2 tls } else if (cur_fsid.val[0] != save_fsid.val[0] ||
1017 1.1.1.1.10.2 tls cur_fsid.val[1] != save_fsid.val[1]) {
1018 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_XDEV;
1019 1.1.1.1.10.2 tls break;
1020 1.1.1.1.10.2 tls }
1021 1.1.1.1.10.2 tls if (nfsv4_opflag[op].modifyfs)
1022 1.1.1.1.10.2 tls vn_start_write(savevp, &temp_mp, V_WAIT);
1023 1.1.1.1.10.2 tls if (NFSVOPLOCK(savevp, LK_EXCLUSIVE) == 0) {
1024 1.1.1.1.10.2 tls VREF(vp);
1025 1.1.1.1.10.2 tls VREF(savevp);
1026 1.1.1.1.10.2 tls error = (*(nfsrv4_ops2[op]))(nd, isdgram,
1027 1.1.1.1.10.2 tls savevp, vp, p, &savevpnes, &vpnes);
1028 1.1.1.1.10.2 tls } else
1029 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_PERM;
1030 1.1.1.1.10.2 tls if (nfsv4_opflag[op].modifyfs)
1031 1.1.1.1.10.2 tls vn_finished_write(temp_mp);
1032 1.1.1.1.10.2 tls } else {
1033 1.1.1.1.10.2 tls if (nfsv4_opflag[op].retfh != 0)
1034 1.1.1.1.10.2 tls panic("nfsrvd_compound");
1035 1.1.1.1.10.2 tls if (nfsv4_opflag[op].needscfh) {
1036 1.1.1.1.10.2 tls if (vp != NULL) {
1037 1.1.1.1.10.3 jdolecek lktype = nfsv4_opflag[op].lktype;
1038 1.1.1.1.10.3 jdolecek if (nfsv4_opflag[op].modifyfs) {
1039 1.1.1.1.10.2 tls vn_start_write(vp, &temp_mp,
1040 1.1.1.1.10.2 tls V_WAIT);
1041 1.1.1.1.10.3 jdolecek if (op == NFSV4OP_WRITE &&
1042 1.1.1.1.10.3 jdolecek MNT_SHARED_WRITES(temp_mp))
1043 1.1.1.1.10.3 jdolecek lktype = LK_SHARED;
1044 1.1.1.1.10.3 jdolecek }
1045 1.1.1.1.10.3 jdolecek if (NFSVOPLOCK(vp, lktype) == 0)
1046 1.1.1.1.10.2 tls VREF(vp);
1047 1.1.1.1.10.2 tls else
1048 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_PERM;
1049 1.1.1.1.10.2 tls } else {
1050 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_NOFILEHANDLE;
1051 1.1.1.1.10.2 tls if (op == NFSV4OP_SETATTR) {
1052 1.1.1.1.10.2 tls /*
1053 1.1.1.1.10.2 tls * Setattr reply requires a
1054 1.1.1.1.10.2 tls * bitmap even for errors like
1055 1.1.1.1.10.2 tls * these.
1056 1.1.1.1.10.2 tls */
1057 1.1.1.1.10.2 tls NFSM_BUILD(tl, u_int32_t *,
1058 1.1.1.1.10.2 tls NFSX_UNSIGNED);
1059 1.1.1.1.10.2 tls *tl = 0;
1060 1.1.1.1.10.2 tls }
1061 1.1.1.1.10.2 tls break;
1062 1.1.1.1.10.2 tls }
1063 1.1.1.1.10.2 tls if (nd->nd_repstat == 0)
1064 1.1.1.1.10.2 tls error = (*(nfsrv4_ops0[op]))(nd,
1065 1.1.1.1.10.2 tls isdgram, vp, p, &vpnes);
1066 1.1.1.1.10.2 tls if (nfsv4_opflag[op].modifyfs)
1067 1.1.1.1.10.2 tls vn_finished_write(temp_mp);
1068 1.1.1.1.10.2 tls } else {
1069 1.1.1.1.10.2 tls error = (*(nfsrv4_ops0[op]))(nd, isdgram,
1070 1.1.1.1.10.2 tls NULL, p, &vpnes);
1071 1.1.1.1.10.2 tls }
1072 1.1.1.1.10.2 tls }
1073 1.1.1.1.10.3 jdolecek }
1074 1.1.1.1.10.2 tls if (error) {
1075 1.1.1.1.10.2 tls if (error == EBADRPC || error == NFSERR_BADXDR) {
1076 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_BADXDR;
1077 1.1.1.1.10.2 tls } else {
1078 1.1.1.1.10.2 tls nd->nd_repstat = error;
1079 1.1.1.1.10.2 tls printf("nfsv4 comperr0=%d\n", error);
1080 1.1.1.1.10.2 tls }
1081 1.1.1.1.10.2 tls error = 0;
1082 1.1.1.1.10.2 tls }
1083 1.1.1.1.10.3 jdolecek
1084 1.1.1.1.10.3 jdolecek if (statsinprog != 0) {
1085 1.1.1.1.10.3 jdolecek nfsrvd_statend(op, /*bytes*/ 0, /*now*/ NULL,
1086 1.1.1.1.10.3 jdolecek /*then*/ &start_time);
1087 1.1.1.1.10.3 jdolecek statsinprog = 0;
1088 1.1.1.1.10.3 jdolecek }
1089 1.1.1.1.10.3 jdolecek
1090 1.1.1.1.10.2 tls retops++;
1091 1.1.1.1.10.2 tls if (nd->nd_repstat) {
1092 1.1.1.1.10.2 tls *repp = nfsd_errmap(nd);
1093 1.1.1.1.10.2 tls break;
1094 1.1.1.1.10.2 tls } else {
1095 1.1.1.1.10.2 tls *repp = 0; /* NFS4_OK */
1096 1.1.1.1.10.2 tls }
1097 1.1.1.1.10.2 tls }
1098 1.1.1.1.10.2 tls nfsmout:
1099 1.1.1.1.10.3 jdolecek if (statsinprog != 0) {
1100 1.1.1.1.10.3 jdolecek nfsrvd_statend(op, /*bytes*/ 0, /*now*/ NULL,
1101 1.1.1.1.10.3 jdolecek /*then*/ &start_time);
1102 1.1.1.1.10.3 jdolecek statsinprog = 0;
1103 1.1.1.1.10.3 jdolecek }
1104 1.1.1.1.10.2 tls if (error) {
1105 1.1.1.1.10.2 tls if (error == EBADRPC || error == NFSERR_BADXDR)
1106 1.1.1.1.10.2 tls nd->nd_repstat = NFSERR_BADXDR;
1107 1.1.1.1.10.2 tls else
1108 1.1.1.1.10.2 tls printf("nfsv4 comperr1=%d\n", error);
1109 1.1.1.1.10.2 tls }
1110 1.1.1.1.10.2 tls if (taglen == -1) {
1111 1.1.1.1.10.2 tls NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
1112 1.1.1.1.10.2 tls *tl++ = 0;
1113 1.1.1.1.10.2 tls *tl = 0;
1114 1.1.1.1.10.2 tls } else {
1115 1.1.1.1.10.2 tls *retopsp = txdr_unsigned(retops);
1116 1.1.1.1.10.2 tls }
1117 1.1.1.1.10.2 tls if (vp)
1118 1.1.1.1.10.2 tls vrele(vp);
1119 1.1.1.1.10.2 tls if (savevp)
1120 1.1.1.1.10.2 tls vrele(savevp);
1121 1.1.1.1.10.2 tls NFSLOCKV4ROOTMUTEX();
1122 1.1.1.1.10.2 tls nfsv4_relref(&nfsv4rootfs_lock);
1123 1.1.1.1.10.2 tls NFSUNLOCKV4ROOTMUTEX();
1124 1.1.1.1.10.2 tls
1125 1.1.1.1.10.2 tls NFSEXITCODE2(0, nd);
1126 1.1.1.1.10.2 tls }
1127