| 1 | /* |
| 2 | * Copyright (c) 2000-2016 Apple Inc. All rights reserved. |
| 3 | * |
| 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
| 5 | * |
| 6 | * This file contains Original Code and/or Modifications of Original Code |
| 7 | * as defined in and that are subject to the Apple Public Source License |
| 8 | * Version 2.0 (the 'License'). You may not use this file except in |
| 9 | * compliance with the License. The rights granted to you under the License |
| 10 | * may not be used to create, or enable the creation or redistribution of, |
| 11 | * unlawful or unlicensed copies of an Apple operating system, or to |
| 12 | * circumvent, violate, or enable the circumvention or violation of, any |
| 13 | * terms of an Apple operating system software license agreement. |
| 14 | * |
| 15 | * Please obtain a copy of the License at |
| 16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. |
| 17 | * |
| 18 | * The Original Code and all software distributed under the License are |
| 19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
| 20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
| 21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
| 22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
| 23 | * Please see the License for the specific language governing rights and |
| 24 | * limitations under the License. |
| 25 | * |
| 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
| 27 | */ |
| 28 | /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ |
| 29 | /* |
| 30 | * Copyright (c) 1989, 1993, 1995 |
| 31 | * The Regents of the University of California. All rights reserved. |
| 32 | * |
| 33 | * This code is derived from software contributed to Berkeley by |
| 34 | * Rick Macklem at The University of Guelph. |
| 35 | * |
| 36 | * Redistribution and use in source and binary forms, with or without |
| 37 | * modification, are permitted provided that the following conditions |
| 38 | * are met: |
| 39 | * 1. Redistributions of source code must retain the above copyright |
| 40 | * notice, this list of conditions and the following disclaimer. |
| 41 | * 2. Redistributions in binary form must reproduce the above copyright |
| 42 | * notice, this list of conditions and the following disclaimer in the |
| 43 | * documentation and/or other materials provided with the distribution. |
| 44 | * 3. All advertising materials mentioning features or use of this software |
| 45 | * must display the following acknowledgement: |
| 46 | * This product includes software developed by the University of |
| 47 | * California, Berkeley and its contributors. |
| 48 | * 4. Neither the name of the University nor the names of its contributors |
| 49 | * may be used to endorse or promote products derived from this software |
| 50 | * without specific prior written permission. |
| 51 | * |
| 52 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| 53 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 54 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 55 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| 56 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 57 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 58 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 59 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 60 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 61 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 62 | * SUCH DAMAGE. |
| 63 | * |
| 64 | * @(#)nfs.h 8.4 (Berkeley) 5/1/95 |
| 65 | * FreeBSD-Id: nfs.h,v 1.32 1997/10/12 20:25:38 phk Exp $ |
| 66 | */ |
| 67 | |
| 68 | #ifndef _NFS_NFS_H_ |
| 69 | #define _NFS_NFS_H_ |
| 70 | |
| 71 | #include <sys/appleapiopts.h> |
| 72 | #include <sys/cdefs.h> |
| 73 | |
| 74 | #ifdef __APPLE_API_PRIVATE |
| 75 | /* |
| 76 | * Tunable constants for nfs |
| 77 | */ |
| 78 | |
| 79 | #define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */ |
| 80 | #define NFS_HZ (hz / nfs_ticks) /* Ticks/sec */ |
| 81 | extern int nfs_ticks; |
| 82 | #define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */ |
| 83 | #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ |
| 84 | #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ |
| 85 | #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/ |
| 86 | #define NFS_MAXREXMIT 100 /* Stop counting after this many */ |
| 87 | #define NFS_RETRANS 10 /* Num of retrans for soft mounts */ |
| 88 | #define NFS_TRYLATERDEL 4 /* Initial try later delay (sec) */ |
| 89 | #define NFS_MAXGRPS 16U /* Max. size of groups list */ |
| 90 | #define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ |
| 91 | #define NFS_MAXATTRTIMO 60 |
| 92 | #define NFS_MINDIRATTRTIMO 5 /* directory attribute cache timeout in sec */ |
| 93 | #define NFS_MAXDIRATTRTIMO 60 |
| 94 | #define NFS_IOSIZE (1024 * 1024) /* suggested I/O size */ |
| 95 | #define NFS_RWSIZE 32768 /* Def. read/write data size <= 32K */ |
| 96 | #define NFS_WSIZE NFS_RWSIZE /* Def. write data size <= 32K */ |
| 97 | #define NFS_RSIZE NFS_RWSIZE /* Def. read data size <= 32K */ |
| 98 | #define NFS_DGRAM_WSIZE 8192 /* UDP Def. write data size <= 8K */ |
| 99 | #define NFS_DGRAM_RSIZE 8192 /* UDP Def. read data size <= 8K */ |
| 100 | #define NFS_READDIRSIZE 32768 /* Def. readdir size */ |
| 101 | #define NFS_DEFRAHEAD 16 /* Def. read ahead # blocks */ |
| 102 | #define NFS_MAXRAHEAD 128 /* Max. read ahead # blocks */ |
| 103 | #define NFS_DEFMAXASYNCWRITES 128 /* Def. max # concurrent async write RPCs */ |
| 104 | #define NFS_DEFASYNCTHREAD 16 /* Def. # nfsiod threads */ |
| 105 | #define NFS_MAXASYNCTHREAD 64 /* max # nfsiod threads */ |
| 106 | #define NFS_ASYNCTHREADMAXIDLE 60 /* Seconds before idle nfsiods are reaped */ |
| 107 | #define NFS_DEFSTATFSRATELIMIT 10 /* Def. max # statfs RPCs per second */ |
| 108 | #define NFS_REQUESTDELAY 10 /* ms interval to check request queue */ |
| 109 | #define NFSRV_MAXWGATHERDELAY 100 /* Max. write gather delay (msec) */ |
| 110 | #ifndef NFSRV_WGATHERDELAY |
| 111 | #define NFSRV_WGATHERDELAY 1 /* Default write gather delay (msec) */ |
| 112 | #endif |
| 113 | #define NFS_DIRBLKSIZ 4096 /* size of NFS directory buffers */ |
| 114 | #if defined(KERNEL) && !defined(DIRBLKSIZ) |
| 115 | #define DIRBLKSIZ 512 /* XXX we used to use ufs's DIRBLKSIZ */ |
| 116 | /* can't be larger than NFS_FABLKSIZE */ |
| 117 | #endif |
| 118 | |
| 119 | /* default values for unresponsive mount timeouts */ |
| 120 | #define NFS_TPRINTF_INITIAL_DELAY 12 |
| 121 | #define NFS_TPRINTF_DELAY 30 |
| 122 | |
| 123 | /* |
| 124 | * Oddballs |
| 125 | */ |
| 126 | #define NFS_CMPFH(n, f, s) \ |
| 127 | ((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s))) |
| 128 | #define NFSRV_NDMAXDATA(n) \ |
| 129 | (((n)->nd_vers == NFS_VER3) ? (((n)->nd_nam2) ? \ |
| 130 | NFS_MAXDGRAMDATA : NFSRV_MAXDATA) : NFS_V2MAXDATA) |
| 131 | |
| 132 | /* |
| 133 | * The IO_METASYNC flag should be implemented for local file systems. |
| 134 | * (Until then, it is nothin at all.) |
| 135 | */ |
| 136 | #ifndef IO_METASYNC |
| 137 | #define IO_METASYNC 0 |
| 138 | #endif |
| 139 | |
| 140 | /* |
| 141 | * Expected allocation sizes for major data structures. If the actual size |
| 142 | * of the structure exceeds these sizes, then malloc() will be allocating |
| 143 | * almost twice the memory required. This is used in nfs_init() to warn |
| 144 | * the sysadmin that the size of a structure should be reduced. |
| 145 | * (These sizes are always a power of 2. If the kernel malloc() changes |
| 146 | * to one that does not allocate space in powers of 2 size, then this all |
| 147 | * becomes bunk!). |
| 148 | * Note that some of these structures come out of their own nfs zones. |
| 149 | */ |
| 150 | #define NFS_NODEALLOC 1024 |
| 151 | #define NFS_MNTALLOC 1024 |
| 152 | #define NFS_SVCALLOC 512 |
| 153 | |
| 154 | #define NFS_ARGSVERSION_XDR 88 /* NFS mount args are in XDR format */ |
| 155 | |
| 156 | #define NFS_XDRARGS_VERSION_0 0 |
| 157 | #define NFS_MATTR_BITMAP_LEN 1 /* length of mount attributes bitmap */ |
| 158 | #define NFS_MFLAG_BITMAP_LEN 1 /* length of mount flags bitmap */ |
| 159 | |
| 160 | /* NFS mount attributes */ |
| 161 | #define NFS_MATTR_FLAGS 0 /* mount flags (NFS_MATTR_*) */ |
| 162 | #define NFS_MATTR_NFS_VERSION 1 /* NFS protocol version */ |
| 163 | #define NFS_MATTR_NFS_MINOR_VERSION 2 /* NFS protocol minor version */ |
| 164 | #define NFS_MATTR_READ_SIZE 3 /* READ RPC size */ |
| 165 | #define NFS_MATTR_WRITE_SIZE 4 /* WRITE RPC size */ |
| 166 | #define NFS_MATTR_READDIR_SIZE 5 /* READDIR RPC size */ |
| 167 | #define NFS_MATTR_READAHEAD 6 /* block readahead count */ |
| 168 | #define NFS_MATTR_ATTRCACHE_REG_MIN 7 /* minimum attribute cache time */ |
| 169 | #define NFS_MATTR_ATTRCACHE_REG_MAX 8 /* maximum attribute cache time */ |
| 170 | #define NFS_MATTR_ATTRCACHE_DIR_MIN 9 /* minimum attribute cache time for dirs */ |
| 171 | #define NFS_MATTR_ATTRCACHE_DIR_MAX 10 /* maximum attribute cache time for dirs */ |
| 172 | #define NFS_MATTR_LOCK_MODE 11 /* advisory file locking mode (NFS_LOCK_MODE_*) */ |
| 173 | #define NFS_MATTR_SECURITY 12 /* RPC security flavors to use */ |
| 174 | #define NFS_MATTR_MAX_GROUP_LIST 13 /* max # of RPC AUTH_SYS groups */ |
| 175 | #define NFS_MATTR_SOCKET_TYPE 14 /* socket transport type as a netid-like string */ |
| 176 | #define NFS_MATTR_NFS_PORT 15 /* port # to use for NFS protocol */ |
| 177 | #define NFS_MATTR_MOUNT_PORT 16 /* port # to use for MOUNT protocol */ |
| 178 | #define NFS_MATTR_REQUEST_TIMEOUT 17 /* initial RPC request timeout value */ |
| 179 | #define NFS_MATTR_SOFT_RETRY_COUNT 18 /* max RPC retransmissions for soft mounts */ |
| 180 | #define NFS_MATTR_DEAD_TIMEOUT 19 /* how long until unresponsive mount is considered dead */ |
| 181 | #define NFS_MATTR_FH 20 /* file handle for mount directory */ |
| 182 | #define NFS_MATTR_FS_LOCATIONS 21 /* list of locations for the file system */ |
| 183 | #define NFS_MATTR_MNTFLAGS 22 /* VFS mount flags (MNT_*) */ |
| 184 | #define NFS_MATTR_MNTFROM 23 /* fixed string to use for "f_mntfromname" */ |
| 185 | #define NFS_MATTR_REALM 24 /* Realm to authenticate with */ |
| 186 | #define NFS_MATTR_PRINCIPAL 25 /* GSS principal to authenticate with */ |
| 187 | #define NFS_MATTR_SVCPRINCIPAL 26 /* GSS principal to authenticate to, the server principal */ |
| 188 | #define NFS_MATTR_NFS_VERSION_RANGE 27 /* Packed version range to try */ |
| 189 | #define NFS_MATTR_KERB_ETYPE 28 /* Enctype to use for kerberos mounts */ |
| 190 | |
| 191 | /* NFS mount flags */ |
| 192 | #define NFS_MFLAG_SOFT 0 /* soft mount (requests fail if unresponsive) */ |
| 193 | #define NFS_MFLAG_INTR 1 /* allow operations to be interrupted */ |
| 194 | #define NFS_MFLAG_RESVPORT 2 /* use a reserved port */ |
| 195 | #define NFS_MFLAG_NOCONNECT 3 /* don't connect the socket (UDP) */ |
| 196 | #define NFS_MFLAG_DUMBTIMER 4 /* don't estimate RTT dynamically */ |
| 197 | #define NFS_MFLAG_CALLUMNT 5 /* call MOUNTPROC_UMNT on unmount */ |
| 198 | #define NFS_MFLAG_RDIRPLUS 6 /* request additional info when reading directories */ |
| 199 | #define NFS_MFLAG_NONEGNAMECACHE 7 /* don't do negative name caching */ |
| 200 | #define NFS_MFLAG_MUTEJUKEBOX 8 /* don't treat jukebox errors as unresponsive */ |
| 201 | #define NFS_MFLAG_EPHEMERAL 9 /* ephemeral (mirror) mount */ |
| 202 | #define NFS_MFLAG_NOCALLBACK 10 /* don't provide callback RPC service */ |
| 203 | #define NFS_MFLAG_NAMEDATTR 11 /* don't use named attributes */ |
| 204 | #define NFS_MFLAG_NOACL 12 /* don't support ACLs */ |
| 205 | #define NFS_MFLAG_ACLONLY 13 /* only support ACLs - not mode */ |
| 206 | #define NFS_MFLAG_NFC 14 /* send NFC strings */ |
| 207 | #define NFS_MFLAG_NOQUOTA 15 /* don't support QUOTA requests */ |
| 208 | #define NFS_MFLAG_MNTUDP 16 /* MOUNT protocol should use UDP */ |
| 209 | #define NFS_MFLAG_MNTQUICK 17 /* use short timeouts while mounting */ |
| 210 | |
| 211 | /* Macros for packing and unpacking packed versions */ |
| 212 | #define PVER2MAJOR(M) ((uint32_t)(((M) >> 16) & 0xffff)) |
| 213 | #define PVER2MINOR(m) ((uint32_t)((m) & 0xffff)) |
| 214 | #define VER2PVER(M, m) ((uint32_t)((M) << 16) | ((m) & 0xffff)) |
| 215 | |
| 216 | /* NFS advisory file locking modes */ |
| 217 | #define NFS_LOCK_MODE_ENABLED 0 /* advisory file locking enabled */ |
| 218 | #define NFS_LOCK_MODE_DISABLED 1 /* do not support advisory file locking */ |
| 219 | #define NFS_LOCK_MODE_LOCAL 2 /* perform advisory file locking locally */ |
| 220 | |
| 221 | |
| 222 | /* Supported encryption types for kerberos session keys */ |
| 223 | typedef enum nfs_supported_kerberos_etypes { |
| 224 | NFS_DES3_CBC_SHA1_KD = 16, |
| 225 | NFS_AES128_CTS_HMAC_SHA1_96 = 17, |
| 226 | NFS_AES256_CTS_HMAC_SHA1_96 = 18 |
| 227 | } nfs_supported_kerberos_etypes; |
| 228 | |
| 229 | /* Structure to hold an array of kerberos enctypes to allow on a mount */ |
| 230 | #define NFS_MAX_ETYPES 3 |
| 231 | struct nfs_etype { |
| 232 | uint32_t count; |
| 233 | uint32_t selected; /* index in etypes that is being used. Set to count if nothing has been selected */ |
| 234 | nfs_supported_kerberos_etypes etypes[NFS_MAX_ETYPES]; |
| 235 | }; |
| 236 | |
| 237 | /* |
| 238 | * Old-style arguments to mount NFS |
| 239 | */ |
| 240 | #define NFS_ARGSVERSION 6 /* change when nfs_args changes */ |
| 241 | struct nfs_args { |
| 242 | int version; /* args structure version number */ |
| 243 | #ifdef KERNEL |
| 244 | user32_addr_t addr; /* file server address */ |
| 245 | #else |
| 246 | struct sockaddr *addr; /* file server address */ |
| 247 | #endif |
| 248 | int addrlen; /* length of address */ |
| 249 | int sotype; /* Socket type */ |
| 250 | int proto; /* and Protocol */ |
| 251 | #ifdef KERNEL |
| 252 | user32_addr_t fh; /* File handle to be mounted */ |
| 253 | #else |
| 254 | u_char *fh; /* File handle to be mounted */ |
| 255 | #endif |
| 256 | int fhsize; /* Size, in bytes, of fh */ |
| 257 | int flags; /* flags */ |
| 258 | int wsize; /* write size in bytes */ |
| 259 | int rsize; /* read size in bytes */ |
| 260 | int readdirsize; /* readdir size in bytes */ |
| 261 | int timeo; /* initial timeout in .1 secs */ |
| 262 | int retrans; /* times to retry send */ |
| 263 | int maxgrouplist; /* Max. size of group list */ |
| 264 | int readahead; /* # of blocks to readahead */ |
| 265 | int leaseterm; /* obsolete: Term (sec) of lease */ |
| 266 | int deadthresh; /* obsolete: Retrans threshold */ |
| 267 | #ifdef KERNEL |
| 268 | user32_addr_t hostname; /* server's name */ |
| 269 | #else |
| 270 | char *hostname; /* server's name */ |
| 271 | #endif |
| 272 | /* NFS_ARGSVERSION 3 ends here */ |
| 273 | int acregmin; /* reg file min attr cache timeout */ |
| 274 | int acregmax; /* reg file max attr cache timeout */ |
| 275 | int acdirmin; /* dir min attr cache timeout */ |
| 276 | int acdirmax; /* dir max attr cache timeout */ |
| 277 | /* NFS_ARGSVERSION 4 ends here */ |
| 278 | uint32_t auth; /* security mechanism flavor */ |
| 279 | /* NFS_ARGSVERSION 5 ends here */ |
| 280 | uint32_t deadtimeout; /* secs until unresponsive mount considered dead */ |
| 281 | }; |
| 282 | |
| 283 | /* incremental size additions in each version of nfs_args */ |
| 284 | #define NFS_ARGSVERSION4_INCSIZE (4 * sizeof(int)) |
| 285 | #define NFS_ARGSVERSION5_INCSIZE (sizeof(uint32_t)) |
| 286 | #define NFS_ARGSVERSION6_INCSIZE (sizeof(uint32_t)) |
| 287 | |
| 288 | #ifdef KERNEL |
| 289 | /* LP64 version of nfs_args. all pointers and longs |
| 290 | * grow when we're dealing with a 64-bit process. |
| 291 | * WARNING - keep in sync with nfs_args |
| 292 | */ |
| 293 | struct user_nfs_args { |
| 294 | int version; /* args structure version number */ |
| 295 | user_addr_t addr __attribute((aligned(8))); /* file server address */ |
| 296 | int addrlen; /* length of address */ |
| 297 | int sotype; /* Socket type */ |
| 298 | int proto; /* and Protocol */ |
| 299 | user_addr_t fh __attribute((aligned(8))); /* File handle to be mounted */ |
| 300 | int fhsize; /* Size, in bytes, of fh */ |
| 301 | int flags; /* flags */ |
| 302 | int wsize; /* write size in bytes */ |
| 303 | int rsize; /* read size in bytes */ |
| 304 | int readdirsize; /* readdir size in bytes */ |
| 305 | int timeo; /* initial timeout in .1 secs */ |
| 306 | int retrans; /* times to retry send */ |
| 307 | int maxgrouplist; /* Max. size of group list */ |
| 308 | int readahead; /* # of blocks to readahead */ |
| 309 | int leaseterm; /* obsolete: Term (sec) of lease */ |
| 310 | int deadthresh; /* obsolete: Retrans threshold */ |
| 311 | user_addr_t hostname __attribute((aligned(8))); /* server's name */ |
| 312 | /* NFS_ARGSVERSION 3 ends here */ |
| 313 | int acregmin; /* reg file min attr cache timeout */ |
| 314 | int acregmax; /* reg file max attr cache timeout */ |
| 315 | int acdirmin; /* dir min attr cache timeout */ |
| 316 | int acdirmax; /* dir max attr cache timeout */ |
| 317 | /* NFS_ARGSVERSION 4 ends here */ |
| 318 | uint32_t auth; /* security mechanism flavor */ |
| 319 | /* NFS_ARGSVERSION 5 ends here */ |
| 320 | uint32_t deadtimeout; /* secs until unresponsive mount considered dead */ |
| 321 | }; |
| 322 | #endif // KERNEL |
| 323 | |
| 324 | /* |
| 325 | * Old-style NFS mount option flags |
| 326 | */ |
| 327 | #define NFSMNT_SOFT 0x00000001 /* soft mount (hard is default) */ |
| 328 | #define NFSMNT_WSIZE 0x00000002 /* set write size */ |
| 329 | #define NFSMNT_RSIZE 0x00000004 /* set read size */ |
| 330 | #define NFSMNT_TIMEO 0x00000008 /* set initial timeout */ |
| 331 | #define NFSMNT_RETRANS 0x00000010 /* set number of request retries */ |
| 332 | #define NFSMNT_MAXGRPS 0x00000020 /* set maximum grouplist size */ |
| 333 | #define NFSMNT_INT 0x00000040 /* allow interrupts on hard mount */ |
| 334 | #define NFSMNT_NOCONN 0x00000080 /* Don't Connect the socket */ |
| 335 | #define NFSMNT_NONEGNAMECACHE 0x00000100 /* Don't do negative name caching */ |
| 336 | #define NFSMNT_NFSV3 0x00000200 /* Use NFS Version 3 protocol */ |
| 337 | #define NFSMNT_NFSV4 0x00000400 /* Use NFS Version 4 protocol */ |
| 338 | #define NFSMNT_DUMBTIMR 0x00000800 /* Don't estimate rtt dynamically */ |
| 339 | #define NFSMNT_DEADTIMEOUT 0x00001000 /* unmount after a period of unresponsiveness */ |
| 340 | #define NFSMNT_READAHEAD 0x00002000 /* set read ahead */ |
| 341 | #define NFSMNT_CALLUMNT 0x00004000 /* call MOUNTPROC_UMNT on unmount */ |
| 342 | #define NFSMNT_RESVPORT 0x00008000 /* Allocate a reserved port */ |
| 343 | #define NFSMNT_RDIRPLUS 0x00010000 /* Use Readdirplus for V3 */ |
| 344 | #define NFSMNT_READDIRSIZE 0x00020000 /* Set readdir size */ |
| 345 | #define NFSMNT_NOLOCKS 0x00040000 /* don't support file locking */ |
| 346 | #define NFSMNT_LOCALLOCKS 0x00080000 /* do file locking locally on client */ |
| 347 | #define NFSMNT_ACREGMIN 0x00100000 /* reg min attr cache timeout */ |
| 348 | #define NFSMNT_ACREGMAX 0x00200000 /* reg max attr cache timeout */ |
| 349 | #define NFSMNT_ACDIRMIN 0x00400000 /* dir min attr cache timeout */ |
| 350 | #define NFSMNT_ACDIRMAX 0x00800000 /* dir max attr cache timeout */ |
| 351 | #define NFSMNT_SECFLAVOR 0x01000000 /* Use security flavor */ |
| 352 | #define NFSMNT_SECSYSOK 0x02000000 /* Server can support auth sys */ |
| 353 | #define NFSMNT_MUTEJUKEBOX 0x04000000 /* don't treat jukebox errors as unresponsive */ |
| 354 | #define NFSMNT_NOQUOTA 0x08000000 /* don't support QUOTA requests */ |
| 355 | |
| 356 | |
| 357 | /* |
| 358 | * fs.nfs sysctl(3) NFS_MOUNTINFO defines |
| 359 | */ |
| 360 | #define NFS_MOUNT_INFO_VERSION 0 /* nfsstat mount information version */ |
| 361 | #define NFS_MIATTR_BITMAP_LEN 1 /* length of mount info attributes bitmap */ |
| 362 | #define NFS_MIFLAG_BITMAP_LEN 1 /* length of mount info flags bitmap */ |
| 363 | |
| 364 | /* NFS mount info attributes */ |
| 365 | #define NFS_MIATTR_FLAGS 0 /* mount info flags bitmap (MIFLAG_*) */ |
| 366 | #define NFS_MIATTR_ORIG_ARGS 1 /* original mount args passed into mount call */ |
| 367 | #define NFS_MIATTR_CUR_ARGS 2 /* current mount args values */ |
| 368 | #define NFS_MIATTR_CUR_LOC_INDEX 3 /* current fs location index */ |
| 369 | |
| 370 | /* NFS mount info flags */ |
| 371 | #define NFS_MIFLAG_DEAD 0 /* mount is dead */ |
| 372 | #define NFS_MIFLAG_NOTRESP 1 /* server is unresponsive */ |
| 373 | #define NFS_MIFLAG_RECOVERY 2 /* mount in recovery */ |
| 374 | |
| 375 | |
| 376 | /* |
| 377 | * Structures for the nfssvc(2) syscall. Not that anyone but nfsd |
| 378 | * should ever try and use it. |
| 379 | */ |
| 380 | struct nfsd_args { |
| 381 | int sock; /* Socket to serve */ |
| 382 | #ifdef KERNEL |
| 383 | user32_addr_t name; /* Client addr for connection based sockets */ |
| 384 | #else |
| 385 | caddr_t name; /* Client addr for connection based sockets */ |
| 386 | #endif |
| 387 | int namelen; /* Length of name */ |
| 388 | }; |
| 389 | |
| 390 | #ifdef KERNEL |
| 391 | /* LP64 version of nfsd_args. all pointers and longs |
| 392 | * grow when we're dealing with a 64-bit process. |
| 393 | * WARNING - keep in sync with nfsd_args |
| 394 | */ |
| 395 | struct user_nfsd_args { |
| 396 | int sock; /* Socket to serve */ |
| 397 | user_addr_t name __attribute((aligned(8))); /* Client addr for connection based sockets */ |
| 398 | int namelen; /* Length of name */ |
| 399 | }; |
| 400 | |
| 401 | #endif // KERNEL |
| 402 | |
| 403 | /* |
| 404 | * NFS Server File Handle structures |
| 405 | */ |
| 406 | |
| 407 | /* NFS export handle identifies which NFS export */ |
| 408 | #define NFS_FH_VERSION 0x4e580000 /* 'NX00' */ |
| 409 | struct nfs_exphandle { |
| 410 | uint32_t nxh_version; /* data structure version */ |
| 411 | uint32_t nxh_fsid; /* File System Export ID */ |
| 412 | uint32_t nxh_expid; /* Export ID */ |
| 413 | uint16_t nxh_flags; /* export handle flags */ |
| 414 | uint8_t nxh_reserved; /* future use */ |
| 415 | uint8_t nxh_fidlen; /* length of File ID */ |
| 416 | }; |
| 417 | |
| 418 | /* nxh_flags */ |
| 419 | #define NXHF_INVALIDFH 0x0001 /* file handle is invalid */ |
| 420 | |
| 421 | #define NFS_MAX_FID_SIZE (NFS_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) |
| 422 | #define NFSV4_MAX_FID_SIZE (NFSV4_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) |
| 423 | #define NFSV3_MAX_FID_SIZE (NFSV3_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) |
| 424 | #define NFSV2_MAX_FID_SIZE (NFSV2_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) |
| 425 | |
| 426 | /* NFS server internal view of fhandle_t */ |
| 427 | /* The first sizeof(fhandle_t) bytes must match what goes into fhandle_t. */ |
| 428 | /* (fhp is used to allow use of an external buffer) */ |
| 429 | struct nfs_filehandle { |
| 430 | uint32_t nfh_len; /* total length of file handle */ |
| 431 | struct nfs_exphandle nfh_xh; /* export handle */ |
| 432 | unsigned char nfh_fid[NFS_MAX_FID_SIZE]; /* File ID */ |
| 433 | unsigned char *nfh_fhp; /* pointer to file handle */ |
| 434 | }; |
| 435 | |
| 436 | /* |
| 437 | * NFS export data structures |
| 438 | */ |
| 439 | |
| 440 | /* Structure to hold an array of security flavors */ |
| 441 | #define NX_MAX_SEC_FLAVORS 5 |
| 442 | struct nfs_sec { |
| 443 | int count; |
| 444 | uint32_t flavors[NX_MAX_SEC_FLAVORS]; |
| 445 | }; |
| 446 | |
| 447 | struct nfs_export_net_args { |
| 448 | uint32_t nxna_flags; /* export flags */ |
| 449 | struct xucred nxna_cred; /* mapped credential for root/all user */ |
| 450 | struct sockaddr_storage nxna_addr; /* net address to which exported */ |
| 451 | struct sockaddr_storage nxna_mask; /* mask for net address */ |
| 452 | struct nfs_sec nxna_sec; /* security mechanism flavors */ |
| 453 | }; |
| 454 | |
| 455 | struct nfs_export_args { |
| 456 | uint32_t nxa_fsid; /* export FS ID */ |
| 457 | uint32_t nxa_expid; /* export ID */ |
| 458 | #ifdef KERNEL |
| 459 | user32_addr_t nxa_fspath; /* export FS path */ |
| 460 | user32_addr_t nxa_exppath; /* export sub-path */ |
| 461 | #else |
| 462 | char *nxa_fspath; /* export FS path */ |
| 463 | char *nxa_exppath; /* export sub-path */ |
| 464 | #endif |
| 465 | uint32_t nxa_flags; /* export arg flags */ |
| 466 | uint32_t nxa_netcount; /* #entries in ex_nets array */ |
| 467 | #ifdef KERNEL |
| 468 | user32_addr_t nxa_nets; /* array of net args */ |
| 469 | #else |
| 470 | struct nfs_export_net_args *nxa_nets; /* array of net args */ |
| 471 | #endif |
| 472 | }; |
| 473 | |
| 474 | #ifdef KERNEL |
| 475 | /* LP64 version of export_args */ |
| 476 | |
| 477 | struct user_nfs_export_args { |
| 478 | uint32_t nxa_fsid; /* export FS ID */ |
| 479 | uint32_t nxa_expid; /* export ID */ |
| 480 | user_addr_t nxa_fspath; /* export FS path */ |
| 481 | user_addr_t nxa_exppath; /* export sub-path */ |
| 482 | uint32_t nxa_flags; /* export arg flags */ |
| 483 | uint32_t nxa_netcount; /* #entries in ex_nets array */ |
| 484 | user_addr_t nxa_nets; /* array of net args */ |
| 485 | }; |
| 486 | |
| 487 | #endif /* KERNEL */ |
| 488 | |
| 489 | /* nfs export arg flags */ |
| 490 | #define NXA_DELETE 0x0001 /* delete the specified export(s) */ |
| 491 | #define NXA_ADD 0x0002 /* add the specified export(s) */ |
| 492 | #define NXA_REPLACE 0x0003 /* delete and add the specified export(s) */ |
| 493 | #define NXA_DELETE_ALL 0x0004 /* delete all exports */ |
| 494 | #define NXA_OFFLINE 0x0008 /* export is offline */ |
| 495 | #define NXA_CHECK 0x0010 /* check if exportable */ |
| 496 | |
| 497 | /* export option flags */ |
| 498 | #define NX_READONLY 0x0001 /* exported read-only */ |
| 499 | #define NX_DEFAULTEXPORT 0x0002 /* exported to the world */ |
| 500 | #define NX_MAPROOT 0x0004 /* map root access to anon credential */ |
| 501 | #define NX_MAPALL 0x0008 /* map all access to anon credential */ |
| 502 | #define NX_32BITCLIENTS 0x0020 /* restrict directory cookies to 32 bits */ |
| 503 | #define NX_OFFLINE 0x0040 /* export is offline */ |
| 504 | #define NX_MANGLEDNAMES 0x0080 /* export will return mangled names for names > 255 bytes */ |
| 505 | |
| 506 | /* |
| 507 | * fs.nfs sysctl(3) export stats record structures |
| 508 | */ |
| 509 | #define NFS_EXPORT_STAT_REC_VERSION 1 /* export stat record version */ |
| 510 | #define NFS_USER_STAT_REC_VERSION 1 /* active user list record version */ |
| 511 | |
| 512 | /* descriptor describing following records */ |
| 513 | struct nfs_export_stat_desc |
| 514 | { |
| 515 | uint32_t rec_vers; /* version of export stat records */ |
| 516 | uint32_t rec_count; /* total record count */ |
| 517 | }__attribute__((__packed__)); |
| 518 | |
| 519 | /* export stat record containing path and stat counters */ |
| 520 | struct nfs_export_stat_rec { |
| 521 | char path[RPCMNT_PATHLEN + 1]; |
| 522 | uint64_t ops; /* Count of NFS Requests received for this export */ |
| 523 | uint64_t bytes_read; /* Count of bytes read from this export */ |
| 524 | uint64_t bytes_written; /* Count of bytes written to this export */ |
| 525 | }__attribute__((__packed__)); |
| 526 | |
| 527 | /* Active user list stat buffer descriptor */ |
| 528 | struct nfs_user_stat_desc |
| 529 | { |
| 530 | uint32_t rec_vers; /* version of active user stat records */ |
| 531 | uint32_t rec_count; /* total record count */ |
| 532 | }__attribute__((__packed__)); |
| 533 | |
| 534 | /* Active user list user stat record format */ |
| 535 | struct nfs_user_stat_user_rec { |
| 536 | u_char rec_type; |
| 537 | uid_t uid; |
| 538 | struct sockaddr_storage sock; |
| 539 | uint64_t ops; |
| 540 | uint64_t bytes_read; |
| 541 | uint64_t bytes_written; |
| 542 | uint32_t tm_start; |
| 543 | uint32_t tm_last; |
| 544 | }__attribute__((__packed__)); |
| 545 | |
| 546 | /* Active user list path record format */ |
| 547 | struct nfs_user_stat_path_rec { |
| 548 | u_char rec_type; |
| 549 | char path[RPCMNT_PATHLEN + 1]; |
| 550 | }__attribute__((__packed__)); |
| 551 | |
| 552 | /* Defines for rec_type field of |
| 553 | * nfs_user_stat_rec & nfs_user_stat_rec |
| 554 | * data structures |
| 555 | */ |
| 556 | #define NFS_USER_STAT_USER_REC 0 |
| 557 | #define NFS_USER_STAT_PATH_REC 1 |
| 558 | |
| 559 | |
| 560 | #ifdef KERNEL |
| 561 | struct nfs_exportfs; |
| 562 | |
| 563 | struct nfs_export_options { |
| 564 | uint32_t nxo_flags; /* export options */ |
| 565 | kauth_cred_t nxo_cred; /* mapped credential */ |
| 566 | struct nfs_sec nxo_sec; /* security mechanism flavors */ |
| 567 | }; |
| 568 | |
| 569 | /* Network address lookup element and individual export options */ |
| 570 | struct nfs_netopt { |
| 571 | struct radix_node no_rnodes[2]; /* radix tree glue */ |
| 572 | struct nfs_export_options no_opt; /* export options */ |
| 573 | }; |
| 574 | |
| 575 | /* statistic counters for each exported directory |
| 576 | * |
| 577 | * Since 64-bit atomic operations are not available on 32-bit platforms, |
| 578 | * 64-bit counters are implemented using 32-bit integers and 32-bit |
| 579 | * atomic operations |
| 580 | */ |
| 581 | typedef struct nfsstatcount64 { |
| 582 | uint32_t hi; |
| 583 | uint32_t lo; |
| 584 | } nfsstatcount64; |
| 585 | |
| 586 | struct nfs_export_stat_counters { |
| 587 | struct nfsstatcount64 ops; /* Count of NFS Requests received for this export */ |
| 588 | struct nfsstatcount64 bytes_read; /* Count of bytes read from this export */ |
| 589 | struct nfsstatcount64 bytes_written; /* Count of bytes written to his export */ |
| 590 | }; |
| 591 | |
| 592 | /* Macro for updating nfs export stat counters */ |
| 593 | #define NFSStatAdd64(PTR, VAL) \ |
| 594 | do { \ |
| 595 | uint32_t NFSSA_OldValue = \ |
| 596 | OSAddAtomic((VAL), &(PTR)->lo); \ |
| 597 | if ((NFSSA_OldValue + (VAL)) < NFSSA_OldValue) \ |
| 598 | OSAddAtomic(1, &(PTR)->hi); \ |
| 599 | } while (0) |
| 600 | |
| 601 | /* Some defines for dealing with active user list stats */ |
| 602 | #define NFSRV_USER_STAT_DEF_MAX_NODES 1024 /* default active user list size limit */ |
| 603 | #define NFSRV_USER_STAT_DEF_IDLE_SEC 7200 /* default idle seconds (node no longer considered active) */ |
| 604 | |
| 605 | /* active user list globals */ |
| 606 | extern uint32_t nfsrv_user_stat_enabled; /* enable/disable active user list */ |
| 607 | extern uint32_t nfsrv_user_stat_node_count; /* current count of user stat nodes */ |
| 608 | extern uint32_t nfsrv_user_stat_max_idle_sec; /* idle seconds (node no longer considered active) */ |
| 609 | extern uint32_t nfsrv_user_stat_max_nodes; /* active user list size limit */ |
| 610 | extern lck_grp_t *nfsrv_active_user_mutex_group; |
| 611 | |
| 612 | /* An active user node represented in the kernel */ |
| 613 | struct nfs_user_stat_node { |
| 614 | TAILQ_ENTRY(nfs_user_stat_node) lru_link; |
| 615 | LIST_ENTRY(nfs_user_stat_node) hash_link; |
| 616 | uid_t uid; |
| 617 | struct sockaddr_storage sock; |
| 618 | uint64_t ops; |
| 619 | uint64_t bytes_read; |
| 620 | uint64_t bytes_written; |
| 621 | uint32_t tm_start; |
| 622 | uint32_t tm_last; |
| 623 | }; |
| 624 | |
| 625 | /* Hash table for active user nodes */ |
| 626 | #define NFS_USER_STAT_HASH_SIZE 16 /* MUST be a power of 2 */ |
| 627 | #define NFS_USER_STAT_HASH(userhashtbl, uid) \ |
| 628 | &((userhashtbl)[(uid) & (NFS_USER_STAT_HASH_SIZE - 1)]) |
| 629 | |
| 630 | TAILQ_HEAD(nfs_user_stat_lru_head, nfs_user_stat_node); |
| 631 | LIST_HEAD(nfs_user_stat_hashtbl_head, nfs_user_stat_node); |
| 632 | |
| 633 | /* Active user list data structure */ |
| 634 | /* One per exported directory */ |
| 635 | struct nfs_active_user_list { |
| 636 | struct nfs_user_stat_lru_head user_lru; |
| 637 | struct nfs_user_stat_hashtbl_head user_hashtbl[NFS_USER_STAT_HASH_SIZE]; |
| 638 | uint32_t node_count; |
| 639 | lck_mtx_t user_mutex; |
| 640 | }; |
| 641 | |
| 642 | |
| 643 | /* Network export information */ |
| 644 | /* one of these for each exported directory */ |
| 645 | struct nfs_export { |
| 646 | LIST_ENTRY(nfs_export) nx_next; /* FS export list */ |
| 647 | LIST_ENTRY(nfs_export) nx_hash; /* export hash chain */ |
| 648 | struct nfs_export *nx_parent; /* parent export */ |
| 649 | uint32_t nx_id; /* export ID */ |
| 650 | uint32_t nx_flags; /* export flags */ |
| 651 | struct nfs_exportfs *nx_fs; /* exported file system */ |
| 652 | char *nx_path; /* exported file system sub-path */ |
| 653 | struct nfs_filehandle nx_fh; /* export root file handle */ |
| 654 | struct nfs_export_options nx_defopt; /* default options */ |
| 655 | uint32_t nx_expcnt; /* # exports in table */ |
| 656 | struct radix_node_head *nx_rtable[AF_MAX+1]; /* table of exports (netopts) */ |
| 657 | struct nfs_export_stat_counters nx_stats; /* statistic counters for this exported directory */ |
| 658 | struct nfs_active_user_list nx_user_list; /* Active User List for this exported directory */ |
| 659 | struct timeval nx_exptime; /* time of export for write verifier */ |
| 660 | }; |
| 661 | |
| 662 | /* NFS exported file system info */ |
| 663 | /* one of these for each exported file system */ |
| 664 | struct nfs_exportfs { |
| 665 | LIST_ENTRY(nfs_exportfs) nxfs_next; /* exported file system list */ |
| 666 | uint32_t nxfs_id; /* exported file system ID */ |
| 667 | char *nxfs_path; /* exported file system path */ |
| 668 | LIST_HEAD(,nfs_export) nxfs_exports; /* list of exports for this file system */ |
| 669 | }; |
| 670 | |
| 671 | extern LIST_HEAD(nfsrv_expfs_list, nfs_exportfs) nfsrv_exports; |
| 672 | extern lck_rw_t nfsrv_export_rwlock; // lock for export data structures |
| 673 | #define NFSRVEXPHASHSZ 64 |
| 674 | #define NFSRVEXPHASHVAL(FSID, EXPID) \ |
| 675 | (((FSID) >> 24) ^ ((FSID) >> 16) ^ ((FSID) >> 8) ^ (EXPID)) |
| 676 | #define NFSRVEXPHASH(FSID, EXPID) \ |
| 677 | (&nfsrv_export_hashtbl[NFSRVEXPHASHVAL((FSID),(EXPID)) & nfsrv_export_hash]) |
| 678 | extern LIST_HEAD(nfsrv_export_hashhead, nfs_export) *nfsrv_export_hashtbl; |
| 679 | extern u_long nfsrv_export_hash; |
| 680 | |
| 681 | #if CONFIG_FSE |
| 682 | /* |
| 683 | * NFS server file mod fsevents |
| 684 | */ |
| 685 | struct nfsrv_fmod { |
| 686 | LIST_ENTRY(nfsrv_fmod) fm_link; |
| 687 | vnode_t fm_vp; |
| 688 | struct vfs_context fm_context; |
| 689 | uint64_t fm_deadline; |
| 690 | }; |
| 691 | |
| 692 | #define NFSRVFMODHASHSZ 128 |
| 693 | #define NFSRVFMODHASH(vp) (((uintptr_t) vp) & nfsrv_fmod_hash) |
| 694 | extern LIST_HEAD(nfsrv_fmod_hashhead, nfsrv_fmod) *nfsrv_fmod_hashtbl; |
| 695 | extern u_long nfsrv_fmod_hash; |
| 696 | extern lck_mtx_t *nfsrv_fmod_mutex; |
| 697 | extern int nfsrv_fmod_pending, nfsrv_fsevents_enabled; |
| 698 | #endif |
| 699 | |
| 700 | extern int nfsrv_async, nfsrv_export_hash_size, |
| 701 | nfsrv_reqcache_size, nfsrv_sock_max_rec_queue_length; |
| 702 | extern uint32_t nfsrv_gss_context_ttl; |
| 703 | extern struct nfsstats nfsstats; |
| 704 | #define NFS_UC_Q_DEBUG |
| 705 | #ifdef NFS_UC_Q_DEBUG |
| 706 | extern int nfsrv_uc_use_proxy; |
| 707 | extern uint32_t nfsrv_uc_queue_limit; |
| 708 | extern uint32_t nfsrv_uc_queue_max_seen; |
| 709 | extern volatile uint32_t nfsrv_uc_queue_count; |
| 710 | #endif |
| 711 | |
| 712 | #endif // KERNEL |
| 713 | |
| 714 | /* |
| 715 | * XXX to allow amd to include nfs.h without nfsproto.h |
| 716 | */ |
| 717 | #ifdef NFS_NPROCS |
| 718 | /* |
| 719 | * Stats structure |
| 720 | */ |
| 721 | struct nfsstats { |
| 722 | uint64_t attrcache_hits; |
| 723 | uint64_t attrcache_misses; |
| 724 | uint64_t lookupcache_hits; |
| 725 | uint64_t lookupcache_misses; |
| 726 | uint64_t direofcache_hits; |
| 727 | uint64_t direofcache_misses; |
| 728 | uint64_t biocache_reads; |
| 729 | uint64_t read_bios; |
| 730 | uint64_t read_physios; |
| 731 | uint64_t biocache_writes; |
| 732 | uint64_t write_bios; |
| 733 | uint64_t write_physios; |
| 734 | uint64_t biocache_readlinks; |
| 735 | uint64_t readlink_bios; |
| 736 | uint64_t biocache_readdirs; |
| 737 | uint64_t readdir_bios; |
| 738 | uint64_t rpccnt[NFS_NPROCS]; |
| 739 | uint64_t rpcretries; |
| 740 | uint64_t srvrpccnt[NFS_NPROCS]; |
| 741 | uint64_t srvrpc_errs; |
| 742 | uint64_t srv_errs; |
| 743 | uint64_t rpcrequests; |
| 744 | uint64_t rpctimeouts; |
| 745 | uint64_t rpcunexpected; |
| 746 | uint64_t rpcinvalid; |
| 747 | uint64_t srvcache_inproghits; |
| 748 | uint64_t srvcache_idemdonehits; |
| 749 | uint64_t srvcache_nonidemdonehits; |
| 750 | uint64_t srvcache_misses; |
| 751 | uint64_t srvvop_writes; |
| 752 | uint64_t pageins; |
| 753 | uint64_t pageouts; |
| 754 | }; |
| 755 | #endif |
| 756 | |
| 757 | /* |
| 758 | * Flags for nfssvc() system call. |
| 759 | */ |
| 760 | #define NFSSVC_NFSD 0x004 |
| 761 | #define NFSSVC_ADDSOCK 0x008 |
| 762 | #define NFSSVC_EXPORT 0x200 |
| 763 | |
| 764 | /* |
| 765 | * Flags for nfsclnt() system call. |
| 766 | */ |
| 767 | #define NFSCLNT_LOCKDANS 0x200 |
| 768 | #define NFSCLNT_LOCKDNOTIFY 0x400 |
| 769 | #define NFSCLNT_TESTIDMAP 0x001 |
| 770 | |
| 771 | #include <sys/_types/_guid_t.h> /* for guid_t below */ |
| 772 | #define MAXIDNAMELEN 1024 |
| 773 | struct nfs_testmapid { |
| 774 | uint32_t ntm_lookup; /* lookup name 2 id or id 2 name */ |
| 775 | uint32_t ntm_grpflag; /* Is this a group or user maping */ |
| 776 | uint32_t ntm_id; /* id to map or return */ |
| 777 | uint32_t pad; |
| 778 | guid_t ntm_guid; /* intermidiate guid used in conversion */ |
| 779 | char ntm_name[MAXIDNAMELEN]; /* name to map or return */ |
| 780 | }; |
| 781 | |
| 782 | #define NTM_ID2NAME 0 |
| 783 | #define NTM_NAME2ID 1 |
| 784 | #define NTM_NAME2GUID 2 |
| 785 | #define NTM_GUID2NAME 3 |
| 786 | |
| 787 | /* |
| 788 | * fs.nfs sysctl(3) identifiers |
| 789 | */ |
| 790 | #define NFS_NFSSTATS 1 /* struct: struct nfsstats */ |
| 791 | #define NFS_EXPORTSTATS 3 /* gets exported directory stats */ |
| 792 | #define NFS_USERSTATS 4 /* gets exported directory active user stats */ |
| 793 | #define NFS_USERCOUNT 5 /* gets current count of active nfs users */ |
| 794 | #define NFS_MOUNTINFO 6 /* gets information about an NFS mount */ |
| 795 | |
| 796 | #ifndef NFS_WDELAYHASHSIZ |
| 797 | #define NFS_WDELAYHASHSIZ 16 /* and with this */ |
| 798 | #endif |
| 799 | |
| 800 | #ifdef KERNEL |
| 801 | #include <sys/kernel_types.h> |
| 802 | #include <kern/thread_call.h> |
| 803 | #include <sys/kdebug.h> |
| 804 | |
| 805 | #define NFS_KERNEL_DEBUG KERNEL_DEBUG |
| 806 | |
| 807 | /* kernel debug trace macros */ |
| 808 | #define FSDBG(A, B, C, D, E) \ |
| 809 | NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_NONE, \ |
| 810 | (int)(B), (int)(C), (int)(D), (int)(E), 0) |
| 811 | #define FSDBG_TOP(A, B, C, D, E) \ |
| 812 | NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_START, \ |
| 813 | (int)(B), (int)(C), (int)(D), (int)(E), 0) |
| 814 | #define FSDBG_BOT(A, B, C, D, E) \ |
| 815 | NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_END, \ |
| 816 | (int)(B), (int)(C), (int)(D), (int)(E), 0) |
| 817 | |
| 818 | #ifdef MALLOC_DECLARE |
| 819 | MALLOC_DECLARE(M_NFSREQ); |
| 820 | MALLOC_DECLARE(M_NFSMNT); |
| 821 | MALLOC_DECLARE(M_NFSDIROFF); |
| 822 | MALLOC_DECLARE(M_NFSRVDESC); |
| 823 | MALLOC_DECLARE(M_NFSD); |
| 824 | MALLOC_DECLARE(M_NFSBIGFH); |
| 825 | #endif |
| 826 | |
| 827 | struct vnode_attr; struct nameidata; struct dqblk; struct sockaddr_in; /* XXX */ |
| 828 | struct nfsbuf; |
| 829 | struct nfs_vattr; |
| 830 | struct nfs_fsattr; |
| 831 | struct nfsnode; |
| 832 | typedef struct nfsnode * nfsnode_t; |
| 833 | struct nfs_open_owner; |
| 834 | struct nfs_open_file; |
| 835 | struct nfs_lock_owner; |
| 836 | struct nfs_file_lock; |
| 837 | struct nfsreq; |
| 838 | struct nfs_rpc_record_state; |
| 839 | struct nfs_fs_locations; |
| 840 | struct nfs_location_index; |
| 841 | struct nfs_socket; |
| 842 | struct nfs_socket_search; |
| 843 | struct nfsrv_uc_arg; |
| 844 | |
| 845 | /* |
| 846 | * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. |
| 847 | * What should be in this set is open to debate, but I believe that since |
| 848 | * I/O system calls on ufs are never interrupted by signals the set should |
| 849 | * be minimal. My reasoning is that many current programs that use signals |
| 850 | * such as SIGALRM will not expect file I/O system calls to be interrupted |
| 851 | * by them and break. |
| 852 | */ |
| 853 | #define NFSINT_SIGMASK (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \ |
| 854 | sigmask(SIGHUP)|sigmask(SIGQUIT)) |
| 855 | |
| 856 | extern size_t nfs_mbuf_mhlen, nfs_mbuf_minclsize; |
| 857 | |
| 858 | /* |
| 859 | * NFS mbuf chain structure used for managing the building/dissection of RPCs |
| 860 | */ |
| 861 | struct nfsm_chain { |
| 862 | mbuf_t nmc_mhead; /* mbuf chain head */ |
| 863 | mbuf_t nmc_mcur; /* current mbuf */ |
| 864 | caddr_t nmc_ptr; /* pointer into current mbuf */ |
| 865 | uint32_t nmc_left; /* bytes remaining in current mbuf */ |
| 866 | uint32_t nmc_flags; /* flags for this nfsm_chain */ |
| 867 | }; |
| 868 | #define NFSM_CHAIN_FLAG_ADD_CLUSTERS 0x1 /* always add mbuf clusters */ |
| 869 | |
| 870 | /* |
| 871 | * Each retransmission of an RPCSEC_GSS request |
| 872 | * has an additional sequence number. |
| 873 | */ |
| 874 | struct gss_seq { |
| 875 | SLIST_ENTRY(gss_seq) gss_seqnext; |
| 876 | uint32_t gss_seqnum; |
| 877 | }; |
| 878 | |
| 879 | /* |
| 880 | * async NFS request callback info |
| 881 | */ |
| 882 | struct nfsreq_cbinfo { |
| 883 | void (*rcb_func)(struct nfsreq *); /* async request callback function */ |
| 884 | struct nfsbuf *rcb_bp; /* buffer I/O RPC is for */ |
| 885 | uint32_t rcb_args[3]; /* additional callback args */ |
| 886 | }; |
| 887 | |
| 888 | /* |
| 889 | * Arguments to use if a request needs to call SECINFO to handle a WRONGSEC error |
| 890 | * |
| 891 | * If only node is set, use the parent file handle and this node's name; otherwise, |
| 892 | * use any file handle and name provided. |
| 893 | */ |
| 894 | struct nfsreq_secinfo_args { |
| 895 | nfsnode_t rsia_np; /* the node */ |
| 896 | const char *rsia_name; /* alternate name string */ |
| 897 | u_char *rsia_fh; /* alternate file handle */ |
| 898 | uint32_t rsia_namelen; /* length of string */ |
| 899 | uint32_t rsia_fhsize; /* length of fh */ |
| 900 | }; |
| 901 | #define NFSREQ_SECINFO_SET(SI, NP, FH, FHSIZE, NAME, NAMELEN) \ |
| 902 | do { \ |
| 903 | (SI)->rsia_np = (NP); \ |
| 904 | (SI)->rsia_fh = (FH); \ |
| 905 | (SI)->rsia_fhsize = (FHSIZE); \ |
| 906 | (SI)->rsia_name = (NAME); \ |
| 907 | (SI)->rsia_namelen = (NAMELEN); \ |
| 908 | } while (0) |
| 909 | |
| 910 | /* |
| 911 | * NFS outstanding request list element |
| 912 | */ |
| 913 | struct nfsreq { |
| 914 | lck_mtx_t r_mtx; /* NFS request mutex */ |
| 915 | TAILQ_ENTRY(nfsreq) r_chain; /* request queue chain */ |
| 916 | TAILQ_ENTRY(nfsreq) r_achain; /* mount's async I/O request queue chain */ |
| 917 | TAILQ_ENTRY(nfsreq) r_rchain; /* mount's async I/O resend queue chain */ |
| 918 | TAILQ_ENTRY(nfsreq) r_cchain; /* mount's cwnd queue chain */ |
| 919 | mbuf_t r_mrest; /* request body mbufs */ |
| 920 | mbuf_t r_mhead; /* request header mbufs */ |
| 921 | struct nfsm_chain r_nmrep; /* reply mbufs */ |
| 922 | nfsnode_t r_np; /* NFS node */ |
| 923 | struct nfsmount *r_nmp; /* NFS mount point */ |
| 924 | uint64_t r_xid; /* RPC transaction ID */ |
| 925 | uint32_t r_procnum; /* NFS procedure number */ |
| 926 | uint32_t r_mreqlen; /* request length */ |
| 927 | int r_flags; /* flags on request, see below */ |
| 928 | int r_lflags; /* flags protected by list mutex, see below */ |
| 929 | int r_refs; /* # outstanding references */ |
| 930 | uint8_t r_delay; /* delay to use for jukebox error */ |
| 931 | uint8_t r_retry; /* max retransmission count */ |
| 932 | uint8_t r_rexmit; /* current retrans count */ |
| 933 | int r_rtt; /* RTT for rpc */ |
| 934 | thread_t r_thread; /* thread that did I/O system call */ |
| 935 | kauth_cred_t r_cred; /* credential used for request */ |
| 936 | time_t r_start; /* request start time */ |
| 937 | time_t r_lastmsg; /* time of last tprintf */ |
| 938 | time_t r_resendtime; /* time of next jukebox error resend */ |
| 939 | struct nfs_gss_clnt_ctx *r_gss_ctx; /* RPCSEC_GSS context */ |
| 940 | SLIST_HEAD(, gss_seq) r_gss_seqlist; /* RPCSEC_GSS sequence numbers */ |
| 941 | uint32_t r_gss_argoff; /* RPCSEC_GSS offset to args */ |
| 942 | uint32_t r_gss_arglen; /* RPCSEC_GSS arg length */ |
| 943 | uint32_t r_auth; /* security flavor request sent with */ |
| 944 | uint32_t *r_wrongsec; /* wrongsec: other flavors to try */ |
| 945 | int r_error; /* request error */ |
| 946 | struct nfsreq_cbinfo r_callback; /* callback info */ |
| 947 | struct nfsreq_secinfo_args r_secinfo; /* secinfo args */ |
| 948 | }; |
| 949 | |
| 950 | /* |
| 951 | * Queue head for nfsreq's |
| 952 | */ |
| 953 | TAILQ_HEAD(nfs_reqqhead, nfsreq); |
| 954 | extern struct nfs_reqqhead nfs_reqq; |
| 955 | extern lck_grp_t *nfs_request_grp; |
| 956 | |
| 957 | #define R_XID32(x) ((x) & 0xffffffff) |
| 958 | |
| 959 | #define NFSNOLIST ((void *)0x0badcafe) /* sentinel value for nfs lists */ |
| 960 | #define NFSREQNOLIST NFSNOLIST /* sentinel value for nfsreq lists */ |
| 961 | |
| 962 | /* Flag values for r_flags */ |
| 963 | #define R_TIMING 0x00000001 /* timing request (in mntp) */ |
| 964 | #define R_CWND 0x00000002 /* request accounted for in congestion window */ |
| 965 | #define R_SOFTTERM 0x00000004 /* request terminated (e.g. soft mnt) */ |
| 966 | #define R_RESTART 0x00000008 /* RPC should be restarted. */ |
| 967 | #define R_INITTED 0x00000010 /* request has been initialized */ |
| 968 | #define R_TPRINTFMSG 0x00000020 /* Did a tprintf msg. */ |
| 969 | #define R_MUSTRESEND 0x00000040 /* Must resend request */ |
| 970 | #define R_ALLOCATED 0x00000080 /* request was allocated */ |
| 971 | #define R_SENT 0x00000100 /* request has been sent */ |
| 972 | #define R_WAITSENT 0x00000200 /* someone is waiting for request to be sent */ |
| 973 | #define R_RESENDERR 0x00000400 /* resend failed */ |
| 974 | #define R_JBTPRINTFMSG 0x00000800 /* Did a tprintf msg for jukebox error */ |
| 975 | #define R_ASYNC 0x00001000 /* async request */ |
| 976 | #define R_ASYNCWAIT 0x00002000 /* async request now being waited on */ |
| 977 | #define R_RESENDQ 0x00004000 /* async request currently on resendq */ |
| 978 | #define R_SENDING 0x00008000 /* request currently being sent */ |
| 979 | #define R_SOFT 0x00010000 /* request is soft - don't retry or reconnect */ |
| 980 | #define R_IOD 0x00020000 /* request is being managed by an IOD */ |
| 981 | |
| 982 | #define R_NOINTR 0x20000000 /* request should not be interupted by a signal */ |
| 983 | #define R_RECOVER 0x40000000 /* a state recovery RPC - during NFSSTA_RECOVER */ |
| 984 | #define R_SETUP 0x80000000 /* a setup RPC - during (re)connection */ |
| 985 | #define R_OPTMASK 0xe0000000 /* mask of all RPC option flags */ |
| 986 | |
| 987 | /* Flag values for r_lflags */ |
| 988 | #define RL_BUSY 0x0001 /* Locked. */ |
| 989 | #define RL_WAITING 0x0002 /* Someone waiting for lock. */ |
| 990 | #define RL_QUEUED 0x0004 /* request is on the queue */ |
| 991 | |
| 992 | extern u_int32_t nfs_xid, nfs_xidwrap; |
| 993 | extern int nfs_iosize, nfs_allow_async, nfs_statfs_rate_limit; |
| 994 | extern int nfs_access_cache_timeout, nfs_access_delete, nfs_access_dotzfs, nfs_access_for_getattr; |
| 995 | extern int nfs_lockd_mounts, nfs_lockd_request_sent; |
| 996 | extern int nfs_tprintf_initial_delay, nfs_tprintf_delay; |
| 997 | extern int nfsiod_thread_count, nfsiod_thread_max, nfs_max_async_writes; |
| 998 | extern int nfs_idmap_ctrl, nfs_callback_port; |
| 999 | extern int nfs_is_mobile, nfs_readlink_nocache, nfs_root_steals_ctx; |
| 1000 | extern uint32_t nfs_squishy_flags; |
| 1001 | extern uint32_t nfs_debug_ctl; |
| 1002 | |
| 1003 | /* bits for nfs_idmap_ctrl: */ |
| 1004 | #define NFS_IDMAP_CTRL_USE_IDMAP_SERVICE 0x00000001 /* use the ID mapping service */ |
| 1005 | #define NFS_IDMAP_CTRL_FALLBACK_NO_COMMON_IDS 0x00000002 /* fallback should NOT handle common IDs like "root" and "nobody" */ |
| 1006 | #define NFS_IDMAP_CTRL_LOG_FAILED_MAPPINGS 0x00000020 /* log failed ID mapping attempts */ |
| 1007 | #define NFS_IDMAP_CTRL_LOG_SUCCESSFUL_MAPPINGS 0x00000040 /* log successful ID mapping attempts */ |
| 1008 | |
| 1009 | #define NFSIOD_MAX (MIN(nfsiod_thread_max, NFS_MAXASYNCTHREAD)) |
| 1010 | |
| 1011 | struct nfs_dulookup { |
| 1012 | int du_flags; /* state of ._ lookup */ |
| 1013 | #define NFS_DULOOKUP_DOIT 0x1 |
| 1014 | #define NFS_DULOOKUP_INPROG 0x2 |
| 1015 | struct componentname du_cn; /* ._ name being looked up */ |
| 1016 | struct nfsreq du_req; /* NFS request for lookup */ |
| 1017 | char du_smallname[48]; /* buffer for small names */ |
| 1018 | }; |
| 1019 | |
| 1020 | /* |
| 1021 | * One nfsrv_sock structure is maintained for each socket the |
| 1022 | * server is servicing requests on. |
| 1023 | */ |
| 1024 | struct nfsrv_sock { |
| 1025 | TAILQ_ENTRY(nfsrv_sock) ns_chain; /* List of all nfsrv_sock's */ |
| 1026 | TAILQ_ENTRY(nfsrv_sock) ns_svcq; /* List of sockets needing servicing */ |
| 1027 | TAILQ_ENTRY(nfsrv_sock) ns_wgq; /* List of sockets with a pending write gather */ |
| 1028 | struct nfsrv_uc_arg *ns_ua; /* Opaque pointer to upcall */ |
| 1029 | lck_rw_t ns_rwlock; /* lock for most fields */ |
| 1030 | socket_t ns_so; |
| 1031 | mbuf_t ns_nam; |
| 1032 | mbuf_t ns_raw; |
| 1033 | mbuf_t ns_rawend; |
| 1034 | mbuf_t ns_rec; |
| 1035 | mbuf_t ns_recend; |
| 1036 | mbuf_t ns_frag; |
| 1037 | int ns_flag; |
| 1038 | int ns_sotype; |
| 1039 | int ns_cc; |
| 1040 | int ns_reclen; |
| 1041 | int ns_reccnt; |
| 1042 | u_int32_t ns_sref; |
| 1043 | time_t ns_timestamp; /* socket timestamp */ |
| 1044 | lck_mtx_t ns_wgmutex; /* mutex for write gather fields */ |
| 1045 | u_quad_t ns_wgtime; /* next Write deadline (usec) */ |
| 1046 | LIST_HEAD(, nfsrv_descript) ns_tq; /* Write gather lists */ |
| 1047 | LIST_HEAD(nfsrv_wg_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ]; |
| 1048 | }; |
| 1049 | |
| 1050 | /* Bits for "ns_flag" */ |
| 1051 | #define SLP_VALID 0x0001 /* nfs sock valid */ |
| 1052 | #define SLP_DOREC 0x0002 /* nfs sock has received data to process */ |
| 1053 | #define SLP_NEEDQ 0x0004 /* network socket has data to receive */ |
| 1054 | #define SLP_DISCONN 0x0008 /* socket needs to be zapped */ |
| 1055 | #define SLP_GETSTREAM 0x0010 /* currently in nfsrv_getstream() */ |
| 1056 | #define SLP_LASTFRAG 0x0020 /* on last fragment of RPC record */ |
| 1057 | #define SLP_DOWRITES 0x0040 /* nfs sock has gathered writes to service */ |
| 1058 | #define SLP_WORKTODO 0x004e /* mask of all "work to do" flags */ |
| 1059 | #define SLP_ALLFLAGS 0x007f |
| 1060 | #define SLP_WAITQ 0x4000 /* nfs sock is on the wait queue */ |
| 1061 | #define SLP_WORKQ 0x8000 /* nfs sock is on the work queue */ |
| 1062 | #define SLP_QUEUED 0xc000 /* nfs sock is on a queue */ |
| 1063 | |
| 1064 | #define SLPNOLIST ((struct nfsrv_sock *)0xdeadbeef) /* sentinel value for sockets not in the nfsrv_sockwg list */ |
| 1065 | |
| 1066 | extern struct nfsrv_sock *nfsrv_udpsock, *nfsrv_udp6sock; |
| 1067 | |
| 1068 | /* |
| 1069 | * global NFS server socket lists: |
| 1070 | * |
| 1071 | * nfsrv_socklist - list of all sockets (ns_chain) |
| 1072 | * nfsrv_sockwait - sockets w/new data waiting to be worked on (ns_svcq) |
| 1073 | * nfsrv_sockwork - sockets being worked on which may have more work to do (ns_svcq) |
| 1074 | * nfsrv_sockwg - sockets with pending write gather input (ns_wgq) |
| 1075 | */ |
| 1076 | extern TAILQ_HEAD(nfsrv_sockhead, nfsrv_sock) nfsrv_socklist, nfsrv_sockwg, |
| 1077 | nfsrv_sockwait, nfsrv_sockwork; |
| 1078 | |
| 1079 | /* lock groups for nfsrv_sock's */ |
| 1080 | extern lck_grp_t *nfsrv_slp_rwlock_group; |
| 1081 | extern lck_grp_t *nfsrv_slp_mutex_group; |
| 1082 | |
| 1083 | /* |
| 1084 | * One of these structures is allocated for each nfsd. |
| 1085 | */ |
| 1086 | struct nfsd { |
| 1087 | TAILQ_ENTRY(nfsd) nfsd_chain; /* List of all nfsd's */ |
| 1088 | TAILQ_ENTRY(nfsd) nfsd_queue; /* List of waiting nfsd's */ |
| 1089 | int nfsd_flag; /* NFSD_ flags */ |
| 1090 | struct nfsrv_sock *nfsd_slp; /* Current socket */ |
| 1091 | struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */ |
| 1092 | }; |
| 1093 | |
| 1094 | /* Bits for "nfsd_flag" */ |
| 1095 | #define NFSD_WAITING 0x01 |
| 1096 | #define NFSD_REQINPROG 0x02 |
| 1097 | |
| 1098 | /* |
| 1099 | * This structure is used by the server for describing each request. |
| 1100 | * Some fields are used only when write request gathering is performed. |
| 1101 | */ |
| 1102 | struct nfsrv_descript { |
| 1103 | u_quad_t nd_time; /* Write deadline (usec) */ |
| 1104 | off_t nd_off; /* Start byte offset */ |
| 1105 | off_t nd_eoff; /* and end byte offset */ |
| 1106 | LIST_ENTRY(nfsrv_descript) nd_hash; /* Hash list */ |
| 1107 | LIST_ENTRY(nfsrv_descript) nd_tq; /* and timer list */ |
| 1108 | LIST_HEAD(,nfsrv_descript) nd_coalesce; /* coalesced writes */ |
| 1109 | struct nfsm_chain nd_nmreq; /* Request mbuf chain */ |
| 1110 | mbuf_t nd_mrep; /* Reply mbuf list (WG) */ |
| 1111 | mbuf_t nd_nam; /* and socket addr */ |
| 1112 | mbuf_t nd_nam2; /* return socket addr */ |
| 1113 | u_int32_t nd_procnum; /* RPC # */ |
| 1114 | int nd_stable; /* storage type */ |
| 1115 | int nd_vers; /* NFS version */ |
| 1116 | int nd_len; /* Length of this write */ |
| 1117 | int nd_repstat; /* Reply status */ |
| 1118 | u_int32_t nd_retxid; /* Reply xid */ |
| 1119 | struct timeval nd_starttime; /* Time RPC initiated */ |
| 1120 | struct nfs_filehandle nd_fh; /* File handle */ |
| 1121 | uint32_t nd_sec; /* Security flavor */ |
| 1122 | struct nfs_gss_svc_ctx *nd_gss_context;/* RPCSEC_GSS context */ |
| 1123 | uint32_t nd_gss_seqnum; /* RPCSEC_GSS seq num */ |
| 1124 | mbuf_t nd_gss_mb; /* RPCSEC_GSS results mbuf */ |
| 1125 | kauth_cred_t nd_cr; /* Credentials */ |
| 1126 | }; |
| 1127 | |
| 1128 | extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head, nfsd_queue; |
| 1129 | |
| 1130 | typedef int (*nfsrv_proc_t)(struct nfsrv_descript *, struct nfsrv_sock *, |
| 1131 | vfs_context_t, mbuf_t *); |
| 1132 | |
| 1133 | /* mutex for nfs server */ |
| 1134 | extern lck_mtx_t *nfsd_mutex; |
| 1135 | extern int nfsd_thread_count, nfsd_thread_max; |
| 1136 | |
| 1137 | /* request list mutex */ |
| 1138 | extern lck_mtx_t *nfs_request_mutex; |
| 1139 | extern int nfs_request_timer_on; |
| 1140 | |
| 1141 | /* mutex for nfs client globals */ |
| 1142 | extern lck_mtx_t *nfs_global_mutex; |
| 1143 | |
| 1144 | /* NFSv4 callback globals */ |
| 1145 | extern int nfs4_callback_timer_on; |
| 1146 | extern in_port_t nfs4_cb_port, nfs4_cb_port6; |
| 1147 | |
| 1148 | /* nfs timer call structures */ |
| 1149 | extern thread_call_t nfs_request_timer_call; |
| 1150 | extern thread_call_t nfs_buf_timer_call; |
| 1151 | extern thread_call_t nfs4_callback_timer_call; |
| 1152 | extern thread_call_t nfsrv_idlesock_timer_call; |
| 1153 | #if CONFIG_FSE |
| 1154 | extern thread_call_t nfsrv_fmod_timer_call; |
| 1155 | #endif |
| 1156 | |
| 1157 | /* nfs 4 default domain for user mapping */ |
| 1158 | extern char nfs4_default_domain[MAXPATHLEN]; |
| 1159 | |
| 1160 | __BEGIN_DECLS |
| 1161 | |
| 1162 | nfstype vtonfs_type(enum vtype, int); |
| 1163 | enum vtype nfstov_type(nfstype, int); |
| 1164 | int vtonfsv2_mode(enum vtype, mode_t); |
| 1165 | |
| 1166 | void nfs_mbuf_init(void); |
| 1167 | |
| 1168 | void nfs_nhinit(void); |
| 1169 | void nfs_nhinit_finish(void); |
| 1170 | u_long nfs_hash(u_char *, int); |
| 1171 | |
| 1172 | int nfs4_init_clientid(struct nfsmount *); |
| 1173 | int nfs4_setclientid(struct nfsmount *); |
| 1174 | int nfs4_renew(struct nfsmount *, int); |
| 1175 | void nfs4_renew_timer(void *, void *); |
| 1176 | void nfs4_mount_callback_setup(struct nfsmount *); |
| 1177 | void nfs4_mount_callback_shutdown(struct nfsmount *); |
| 1178 | void nfs4_cb_accept(socket_t, void *, int); |
| 1179 | void nfs4_cb_rcv(socket_t, void *, int); |
| 1180 | void nfs4_callback_timer(void *, void *); |
| 1181 | int nfs4_secinfo_rpc(struct nfsmount *, struct nfsreq_secinfo_args *, kauth_cred_t, uint32_t *, int *); |
| 1182 | int nfs4_get_fs_locations(struct nfsmount *, nfsnode_t, u_char *, int, const char *, vfs_context_t, struct nfs_fs_locations *); |
| 1183 | void nfs_fs_locations_cleanup(struct nfs_fs_locations *); |
| 1184 | void nfs4_default_attrs_for_referral_trigger(nfsnode_t, char *, int, struct nfs_vattr *, fhandle_t *); |
| 1185 | |
| 1186 | int nfs_sockaddr_cmp(struct sockaddr *, struct sockaddr *); |
| 1187 | int nfs_connect(struct nfsmount *, int, int); |
| 1188 | void nfs_disconnect(struct nfsmount *); |
| 1189 | void nfs_need_reconnect(struct nfsmount *); |
| 1190 | void nfs_mount_sock_thread_wake(struct nfsmount *); |
| 1191 | int nfs_mount_check_dead_timeout(struct nfsmount *); |
| 1192 | int nfs_mount_gone(struct nfsmount *); |
| 1193 | void nfs_mount_rele(struct nfsmount *); |
| 1194 | void nfs_mount_zombie(struct nfsmount *, int); |
| 1195 | void nfs_mount_make_zombie(struct nfsmount *); |
| 1196 | |
| 1197 | void nfs_rpc_record_state_init(struct nfs_rpc_record_state *); |
| 1198 | void nfs_rpc_record_state_cleanup(struct nfs_rpc_record_state *); |
| 1199 | int nfs_rpc_record_read(socket_t, struct nfs_rpc_record_state *, int, int *, mbuf_t *); |
| 1200 | |
| 1201 | int nfs_getattr(nfsnode_t, struct nfs_vattr *, vfs_context_t, int); |
| 1202 | int nfs_getattrcache(nfsnode_t, struct nfs_vattr *, int); |
| 1203 | int nfs_loadattrcache(nfsnode_t, struct nfs_vattr *, u_int64_t *, int); |
| 1204 | int nfs_attrcachetimeout(nfsnode_t); |
| 1205 | |
| 1206 | int nfs_buf_page_inval(vnode_t vp, off_t offset); |
| 1207 | int nfs_vinvalbuf(vnode_t, int, vfs_context_t, int); |
| 1208 | int nfs_vinvalbuf2(vnode_t, int, thread_t, kauth_cred_t, int); |
| 1209 | int nfs_vinvalbuf_internal(nfsnode_t, int, thread_t, kauth_cred_t, int, int); |
| 1210 | void nfs_wait_bufs(nfsnode_t); |
| 1211 | |
| 1212 | int nfs_request_create(nfsnode_t, mount_t, struct nfsm_chain *, int, thread_t, kauth_cred_t, struct nfsreq **); |
| 1213 | void nfs_request_destroy(struct nfsreq *); |
| 1214 | void nfs_request_ref(struct nfsreq *, int); |
| 1215 | void nfs_request_rele(struct nfsreq *); |
| 1216 | int (struct nfsreq *); |
| 1217 | int nfs_request_send(struct nfsreq *, int); |
| 1218 | void nfs_request_wait(struct nfsreq *); |
| 1219 | int nfs_request_finish(struct nfsreq *, struct nfsm_chain *, int *); |
| 1220 | int nfs_request(nfsnode_t, mount_t, struct nfsm_chain *, int, vfs_context_t, struct nfsreq_secinfo_args *, struct nfsm_chain *, u_int64_t *, int *); |
| 1221 | int nfs_request2(nfsnode_t, mount_t, struct nfsm_chain *, int, thread_t, kauth_cred_t, struct nfsreq_secinfo_args *, int, struct nfsm_chain *, u_int64_t *, int *); |
| 1222 | int nfs_request_gss(mount_t, struct nfsm_chain *, thread_t, kauth_cred_t, int, struct nfs_gss_clnt_ctx *, struct nfsm_chain *, int *); |
| 1223 | int nfs_request_async(nfsnode_t, mount_t, struct nfsm_chain *, int, thread_t, kauth_cred_t, struct nfsreq_secinfo_args *, int, struct nfsreq_cbinfo *, struct nfsreq **); |
| 1224 | int nfs_request_async_finish(struct nfsreq *, struct nfsm_chain *, u_int64_t *, int *); |
| 1225 | void nfs_request_async_cancel(struct nfsreq *); |
| 1226 | void nfs_request_timer(void *, void *); |
| 1227 | int nfs_request_using_gss(struct nfsreq *); |
| 1228 | void nfs_get_xid(uint64_t *); |
| 1229 | int nfs_sigintr(struct nfsmount *, struct nfsreq *, thread_t, int); |
| 1230 | int nfs_noremotehang(thread_t); |
| 1231 | |
| 1232 | int nfs_send(struct nfsreq *, int); |
| 1233 | int nfs_sndlock(struct nfsreq *); |
| 1234 | void nfs_sndunlock(struct nfsreq *); |
| 1235 | |
| 1236 | int nfs_uaddr2sockaddr(const char *, struct sockaddr *); |
| 1237 | |
| 1238 | int nfs_aux_request(struct nfsmount *, thread_t, struct sockaddr *, socket_t, int, mbuf_t, uint32_t, int, int, struct nfsm_chain *); |
| 1239 | int nfs_portmap_lookup(struct nfsmount *, vfs_context_t, struct sockaddr *, socket_t, uint32_t, uint32_t, uint32_t, int); |
| 1240 | |
| 1241 | void nfs_location_next(struct nfs_fs_locations *, struct nfs_location_index *); |
| 1242 | int nfs_location_index_cmp(struct nfs_location_index *, struct nfs_location_index *); |
| 1243 | void nfs_location_mntfromname(struct nfs_fs_locations *, struct nfs_location_index, char *, int, int); |
| 1244 | int nfs_socket_create(struct nfsmount *, struct sockaddr *, int, in_port_t, uint32_t, uint32_t, int, struct nfs_socket **); |
| 1245 | void nfs_socket_destroy(struct nfs_socket *); |
| 1246 | void nfs_socket_options(struct nfsmount *, struct nfs_socket *); |
| 1247 | void nfs_connect_upcall(socket_t, void *, int); |
| 1248 | int nfs_connect_error_class(int); |
| 1249 | int nfs_connect_search_loop(struct nfsmount *, struct nfs_socket_search *); |
| 1250 | void nfs_socket_search_update_error(struct nfs_socket_search *, int); |
| 1251 | void nfs_socket_search_cleanup(struct nfs_socket_search *); |
| 1252 | void nfs_mount_connect_thread(void *, __unused wait_result_t); |
| 1253 | |
| 1254 | int nfs_lookitup(nfsnode_t, char *, int, vfs_context_t, nfsnode_t *); |
| 1255 | void nfs_dulookup_init(struct nfs_dulookup *, nfsnode_t, const char *, int, vfs_context_t); |
| 1256 | void nfs_dulookup_start(struct nfs_dulookup *, nfsnode_t, vfs_context_t); |
| 1257 | void nfs_dulookup_finish(struct nfs_dulookup *, nfsnode_t, vfs_context_t); |
| 1258 | int nfs_dir_buf_cache_lookup(nfsnode_t, nfsnode_t *, struct componentname *, vfs_context_t, int); |
| 1259 | int nfs_dir_buf_search(struct nfsbuf *, struct componentname *, fhandle_t *, struct nfs_vattr *, uint64_t *, time_t *, daddr64_t *, int); |
| 1260 | void nfs_name_cache_purge(nfsnode_t, nfsnode_t, struct componentname *, vfs_context_t); |
| 1261 | |
| 1262 | uint32_t nfs4_ace_nfstype_to_vfstype(uint32_t, int *); |
| 1263 | uint32_t nfs4_ace_vfstype_to_nfstype(uint32_t, int *); |
| 1264 | uint32_t nfs4_ace_nfsflags_to_vfsflags(uint32_t); |
| 1265 | uint32_t nfs4_ace_vfsflags_to_nfsflags(uint32_t); |
| 1266 | uint32_t nfs4_ace_nfsmask_to_vfsrights(uint32_t); |
| 1267 | uint32_t nfs4_ace_vfsrights_to_nfsmask(uint32_t); |
| 1268 | int nfs4_id2guid(char *, guid_t *, int); |
| 1269 | int nfs4_guid2id(guid_t *, char *, size_t *, int); |
| 1270 | |
| 1271 | int nfs_parsefattr(struct nfsm_chain *, int, struct nfs_vattr *); |
| 1272 | int nfs4_parsefattr(struct nfsm_chain *, struct nfs_fsattr *, struct nfs_vattr *, fhandle_t *, struct dqblk *, struct nfs_fs_locations *); |
| 1273 | void nfs_vattr_set_supported(uint32_t *, struct vnode_attr *); |
| 1274 | void nfs_vattr_set_bitmap(struct nfsmount *, uint32_t *, struct vnode_attr *); |
| 1275 | void nfs3_pathconf_cache(struct nfsmount *, struct nfs_fsattr *); |
| 1276 | int nfs3_mount_rpc(struct nfsmount *, struct sockaddr *, int, int, char *, vfs_context_t, int, fhandle_t *, struct nfs_sec *); |
| 1277 | void nfs3_umount_rpc(struct nfsmount *, vfs_context_t, int); |
| 1278 | int nfs_node_access_slot(nfsnode_t, uid_t, int); |
| 1279 | void nfs_vnode_notify(nfsnode_t, uint32_t); |
| 1280 | |
| 1281 | void nfs_avoid_needless_id_setting_on_create(nfsnode_t, struct vnode_attr *, vfs_context_t); |
| 1282 | int nfs4_create_rpc(vfs_context_t, nfsnode_t, struct componentname *, struct vnode_attr *, int, char *, nfsnode_t *); |
| 1283 | int nfs_open_state_set_busy(nfsnode_t, thread_t); |
| 1284 | void nfs_open_state_clear_busy(nfsnode_t); |
| 1285 | struct nfs_open_owner *nfs_open_owner_find(struct nfsmount *, kauth_cred_t, int); |
| 1286 | void nfs_open_owner_destroy(struct nfs_open_owner *); |
| 1287 | void nfs_open_owner_ref(struct nfs_open_owner *); |
| 1288 | void nfs_open_owner_rele(struct nfs_open_owner *); |
| 1289 | int nfs_open_owner_set_busy(struct nfs_open_owner *, thread_t); |
| 1290 | void nfs_open_owner_clear_busy(struct nfs_open_owner *); |
| 1291 | void nfs_owner_seqid_increment(struct nfs_open_owner *, struct nfs_lock_owner *, int); |
| 1292 | int nfs_open_file_find(nfsnode_t, struct nfs_open_owner *, struct nfs_open_file **, uint32_t, uint32_t, int); |
| 1293 | int nfs_open_file_find_internal(nfsnode_t, struct nfs_open_owner *, struct nfs_open_file **, uint32_t, uint32_t, int); |
| 1294 | void nfs_open_file_destroy(struct nfs_open_file *); |
| 1295 | int nfs_open_file_set_busy(struct nfs_open_file *, thread_t); |
| 1296 | void nfs_open_file_clear_busy(struct nfs_open_file *); |
| 1297 | void nfs_open_file_add_open(struct nfs_open_file *, uint32_t, uint32_t, int); |
| 1298 | void nfs_open_file_remove_open_find(struct nfs_open_file *, uint32_t, uint32_t, uint32_t *, uint32_t *, int*); |
| 1299 | void nfs_open_file_remove_open(struct nfs_open_file *, uint32_t, uint32_t); |
| 1300 | void nfs_get_stateid(nfsnode_t, thread_t, kauth_cred_t, nfs_stateid *); |
| 1301 | int nfs4_open(nfsnode_t, struct nfs_open_file *, uint32_t, uint32_t, vfs_context_t); |
| 1302 | int nfs4_open_delegated(nfsnode_t, struct nfs_open_file *, uint32_t, uint32_t, vfs_context_t); |
| 1303 | int nfs_close(nfsnode_t, struct nfs_open_file *, uint32_t, uint32_t, vfs_context_t); |
| 1304 | int nfs_check_for_locks(struct nfs_open_owner *, struct nfs_open_file *); |
| 1305 | int nfs4_reopen(struct nfs_open_file *, thread_t); |
| 1306 | int nfs4_open_rpc(struct nfs_open_file *, vfs_context_t, struct componentname *, struct vnode_attr *, vnode_t, vnode_t *, int, int, int); |
| 1307 | int nfs4_open_rpc_internal(struct nfs_open_file *, vfs_context_t, thread_t, kauth_cred_t, struct componentname *, struct vnode_attr *, vnode_t, vnode_t *, int, int, int); |
| 1308 | int nfs4_open_confirm_rpc(struct nfsmount *, nfsnode_t, u_char *, int, struct nfs_open_owner *, nfs_stateid *, thread_t, kauth_cred_t, struct nfs_vattr *, uint64_t *); |
| 1309 | int nfs4_open_reopen_rpc(struct nfs_open_file *, thread_t, kauth_cred_t, struct componentname *, vnode_t, vnode_t *, int, int); |
| 1310 | int nfs4_open_reclaim_rpc(struct nfs_open_file *, int, int); |
| 1311 | int nfs4_claim_delegated_open_rpc(struct nfs_open_file *, int, int, int); |
| 1312 | int nfs4_claim_delegated_state_for_open_file(struct nfs_open_file *, int); |
| 1313 | int nfs4_claim_delegated_state_for_node(nfsnode_t, int); |
| 1314 | int nfs4_open_downgrade_rpc(nfsnode_t, struct nfs_open_file *, vfs_context_t); |
| 1315 | int nfs4_close_rpc(nfsnode_t, struct nfs_open_file *, thread_t, kauth_cred_t, int); |
| 1316 | void nfs4_delegation_return_enqueue(nfsnode_t); |
| 1317 | int nfs4_delegation_return(nfsnode_t, int, thread_t, kauth_cred_t); |
| 1318 | int nfs4_delegreturn_rpc(struct nfsmount *, u_char *, int, struct nfs_stateid *, int, thread_t, kauth_cred_t); |
| 1319 | void nfs_release_open_state_for_node(nfsnode_t, int); |
| 1320 | void nfs_revoke_open_state_for_node(nfsnode_t); |
| 1321 | struct nfs_lock_owner *nfs_lock_owner_find(nfsnode_t, proc_t, int); |
| 1322 | void nfs_lock_owner_destroy(struct nfs_lock_owner *); |
| 1323 | void nfs_lock_owner_ref(struct nfs_lock_owner *); |
| 1324 | void nfs_lock_owner_rele(struct nfs_lock_owner *); |
| 1325 | int nfs_lock_owner_set_busy(struct nfs_lock_owner *, thread_t); |
| 1326 | void nfs_lock_owner_clear_busy(struct nfs_lock_owner *); |
| 1327 | void nfs_lock_owner_insert_held_lock(struct nfs_lock_owner *, struct nfs_file_lock *); |
| 1328 | struct nfs_file_lock *nfs_file_lock_alloc(struct nfs_lock_owner *); |
| 1329 | void nfs_file_lock_destroy(struct nfs_file_lock *); |
| 1330 | int nfs_file_lock_conflict(struct nfs_file_lock *, struct nfs_file_lock *, int *); |
| 1331 | int nfs4_lock_rpc(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t); |
| 1332 | int nfs_unlock_rpc(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, thread_t, kauth_cred_t, int); |
| 1333 | int nfs_advlock_getlock(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t); |
| 1334 | int nfs_advlock_setlock(nfsnode_t, struct nfs_open_file *, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, short, vfs_context_t); |
| 1335 | int nfs_advlock_unlock(nfsnode_t, struct nfs_open_file *, struct nfs_lock_owner *, uint64_t, uint64_t, int, vfs_context_t); |
| 1336 | |
| 1337 | nfsnode_t nfs4_named_attr_dir_get(nfsnode_t, int, vfs_context_t); |
| 1338 | int nfs4_named_attr_get(nfsnode_t, struct componentname *, uint32_t, int, vfs_context_t, nfsnode_t *, struct nfs_open_file **); |
| 1339 | int nfs4_named_attr_remove(nfsnode_t, nfsnode_t, const char *, vfs_context_t); |
| 1340 | |
| 1341 | int nfs_mount_state_in_use_start(struct nfsmount *, thread_t); |
| 1342 | int nfs_mount_state_in_use_end(struct nfsmount *, int); |
| 1343 | int nfs_mount_state_error_should_restart(int); |
| 1344 | int nfs_mount_state_error_delegation_lost(int); |
| 1345 | uint nfs_mount_state_max_restarts(struct nfsmount *); |
| 1346 | int nfs_mount_state_wait_for_recovery(struct nfsmount *); |
| 1347 | void nfs_need_recover(struct nfsmount *nmp, int error); |
| 1348 | void nfs_recover(struct nfsmount *); |
| 1349 | |
| 1350 | int nfs_vnop_access(struct vnop_access_args *); |
| 1351 | int nfs_vnop_remove(struct vnop_remove_args *); |
| 1352 | int nfs_vnop_read(struct vnop_read_args *); |
| 1353 | int nfs_vnop_write(struct vnop_write_args *); |
| 1354 | int nfs_vnop_open(struct vnop_open_args *); |
| 1355 | int nfs_vnop_close(struct vnop_close_args *); |
| 1356 | int nfs_vnop_advlock(struct vnop_advlock_args *); |
| 1357 | int nfs_vnop_mmap(struct vnop_mmap_args *); |
| 1358 | int nfs_vnop_mnomap(struct vnop_mnomap_args *); |
| 1359 | |
| 1360 | int nfs4_vnop_create(struct vnop_create_args *); |
| 1361 | int nfs4_vnop_mknod(struct vnop_mknod_args *); |
| 1362 | int nfs4_vnop_close(struct vnop_close_args *); |
| 1363 | int nfs4_vnop_getattr(struct vnop_getattr_args *); |
| 1364 | int nfs4_vnop_link(struct vnop_link_args *); |
| 1365 | int nfs4_vnop_mkdir(struct vnop_mkdir_args *); |
| 1366 | int nfs4_vnop_rmdir(struct vnop_rmdir_args *); |
| 1367 | int nfs4_vnop_symlink(struct vnop_symlink_args *); |
| 1368 | int nfs4_vnop_getxattr(struct vnop_getxattr_args *); |
| 1369 | int nfs4_vnop_setxattr(struct vnop_setxattr_args *); |
| 1370 | int nfs4_vnop_removexattr(struct vnop_removexattr_args *); |
| 1371 | int nfs4_vnop_listxattr(struct vnop_listxattr_args *); |
| 1372 | #if NAMEDSTREAMS |
| 1373 | int nfs4_vnop_getnamedstream(struct vnop_getnamedstream_args *); |
| 1374 | int nfs4_vnop_makenamedstream(struct vnop_makenamedstream_args *); |
| 1375 | int nfs4_vnop_removenamedstream(struct vnop_removenamedstream_args *); |
| 1376 | #endif |
| 1377 | |
| 1378 | int nfs_read_rpc(nfsnode_t, uio_t, vfs_context_t); |
| 1379 | int nfs_write_rpc(nfsnode_t, uio_t, vfs_context_t, int *, uint64_t *); |
| 1380 | int nfs_write_rpc2(nfsnode_t, uio_t, thread_t, kauth_cred_t, int *, uint64_t *); |
| 1381 | |
| 1382 | int nfs3_access_rpc(nfsnode_t, u_int32_t *, int, vfs_context_t); |
| 1383 | int nfs4_access_rpc(nfsnode_t, u_int32_t *, int, vfs_context_t); |
| 1384 | int nfs3_getattr_rpc(nfsnode_t, mount_t, u_char *, size_t, int, vfs_context_t, struct nfs_vattr *, u_int64_t *); |
| 1385 | int nfs4_getattr_rpc(nfsnode_t, mount_t, u_char *, size_t, int, vfs_context_t, struct nfs_vattr *, u_int64_t *); |
| 1386 | int nfs3_setattr_rpc(nfsnode_t, struct vnode_attr *, vfs_context_t); |
| 1387 | int nfs4_setattr_rpc(nfsnode_t, struct vnode_attr *, vfs_context_t); |
| 1388 | int nfs3_read_rpc_async(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **); |
| 1389 | int nfs4_read_rpc_async(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **); |
| 1390 | int nfs3_read_rpc_async_finish(nfsnode_t, struct nfsreq *, uio_t, size_t *, int *); |
| 1391 | int nfs4_read_rpc_async_finish(nfsnode_t, struct nfsreq *, uio_t, size_t *, int *); |
| 1392 | int nfs3_write_rpc_async(nfsnode_t, uio_t, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **); |
| 1393 | int nfs4_write_rpc_async(nfsnode_t, uio_t, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **); |
| 1394 | int nfs3_write_rpc_async_finish(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *); |
| 1395 | int nfs4_write_rpc_async_finish(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *); |
| 1396 | int nfs3_readdir_rpc(nfsnode_t, struct nfsbuf *, vfs_context_t); |
| 1397 | int nfs4_readdir_rpc(nfsnode_t, struct nfsbuf *, vfs_context_t); |
| 1398 | int nfs3_readlink_rpc(nfsnode_t, char *, uint32_t *, vfs_context_t); |
| 1399 | int nfs4_readlink_rpc(nfsnode_t, char *, uint32_t *, vfs_context_t); |
| 1400 | int nfs3_commit_rpc(nfsnode_t, uint64_t, uint64_t, kauth_cred_t, uint64_t); |
| 1401 | int nfs4_commit_rpc(nfsnode_t, uint64_t, uint64_t, kauth_cred_t, uint64_t); |
| 1402 | int nfs3_lookup_rpc_async(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **); |
| 1403 | int nfs4_lookup_rpc_async(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **); |
| 1404 | int nfs3_lookup_rpc_async_finish(nfsnode_t, char *, int, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *); |
| 1405 | int nfs4_lookup_rpc_async_finish(nfsnode_t, char *, int, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *); |
| 1406 | int nfs3_remove_rpc(nfsnode_t, char *, int, thread_t, kauth_cred_t); |
| 1407 | int nfs4_remove_rpc(nfsnode_t, char *, int, thread_t, kauth_cred_t); |
| 1408 | int nfs3_rename_rpc(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t); |
| 1409 | int nfs4_rename_rpc(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t); |
| 1410 | int nfs3_pathconf_rpc(nfsnode_t, struct nfs_fsattr *, vfs_context_t); |
| 1411 | int nfs4_pathconf_rpc(nfsnode_t, struct nfs_fsattr *, vfs_context_t); |
| 1412 | int nfs3_setlock_rpc(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t); |
| 1413 | int nfs4_setlock_rpc(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t); |
| 1414 | int nfs3_unlock_rpc(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, thread_t, kauth_cred_t); |
| 1415 | int nfs4_unlock_rpc(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, thread_t, kauth_cred_t); |
| 1416 | int nfs3_getlock_rpc(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t); |
| 1417 | int nfs4_getlock_rpc(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t); |
| 1418 | |
| 1419 | void nfsrv_active_user_list_reclaim(void); |
| 1420 | void nfsrv_cleancache(void); |
| 1421 | void nfsrv_cleanup(void); |
| 1422 | int nfsrv_credcheck(struct nfsrv_descript *, vfs_context_t, struct nfs_export *, |
| 1423 | struct nfs_export_options *); |
| 1424 | void nfsrv_idlesock_timer(void *, void *); |
| 1425 | int nfsrv_dorec(struct nfsrv_sock *, struct nfsd *, struct nfsrv_descript **); |
| 1426 | int nfsrv_errmap(struct nfsrv_descript *, int); |
| 1427 | int nfsrv_export(struct user_nfs_export_args *, vfs_context_t); |
| 1428 | int nfsrv_fhmatch(struct nfs_filehandle *, struct nfs_filehandle *); |
| 1429 | int nfsrv_fhtovp(struct nfs_filehandle *, struct nfsrv_descript *, vnode_t *, |
| 1430 | struct nfs_export **, struct nfs_export_options **); |
| 1431 | int nfsrv_check_exports_allow_address(mbuf_t); |
| 1432 | #if CONFIG_FSE |
| 1433 | void nfsrv_fmod_timer(void *, void *); |
| 1434 | #endif |
| 1435 | int nfsrv_getcache(struct nfsrv_descript *, struct nfsrv_sock *, mbuf_t *); |
| 1436 | void nfsrv_group_sort(gid_t *, int); |
| 1437 | void nfsrv_init(void); |
| 1438 | void nfsrv_initcache(void); |
| 1439 | int nfsrv_is_initialized(void); |
| 1440 | int nfsrv_namei(struct nfsrv_descript *, vfs_context_t, struct nameidata *, |
| 1441 | struct nfs_filehandle *, vnode_t *, |
| 1442 | struct nfs_export **, struct nfs_export_options **); |
| 1443 | void nfsrv_rcv(socket_t, void *, int); |
| 1444 | void nfsrv_rcv_locked(socket_t, struct nfsrv_sock *, int); |
| 1445 | int nfsrv_rephead(struct nfsrv_descript *, struct nfsrv_sock *, struct nfsm_chain *, size_t); |
| 1446 | int nfsrv_send(struct nfsrv_sock *, mbuf_t, mbuf_t); |
| 1447 | void nfsrv_updatecache(struct nfsrv_descript *, int, mbuf_t); |
| 1448 | void nfsrv_update_user_stat(struct nfs_export *, struct nfsrv_descript *, uid_t, u_int, u_int, u_int); |
| 1449 | int nfsrv_vptofh(struct nfs_export *, int, struct nfs_filehandle *, |
| 1450 | vnode_t, vfs_context_t, struct nfs_filehandle *); |
| 1451 | void nfsrv_wakenfsd(struct nfsrv_sock *); |
| 1452 | void nfsrv_wg_timer(void *, void *); |
| 1453 | int nfsrv_writegather(struct nfsrv_descript **, struct nfsrv_sock *, |
| 1454 | vfs_context_t, mbuf_t *); |
| 1455 | |
| 1456 | int nfsrv_access(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1457 | int nfsrv_commit(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1458 | int nfsrv_create(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1459 | int nfsrv_fsinfo(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1460 | int nfsrv_getattr(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1461 | int nfsrv_link(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1462 | int nfsrv_lookup(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1463 | int nfsrv_mkdir(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1464 | int nfsrv_mknod(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1465 | int nfsrv_noop(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1466 | int nfsrv_null(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1467 | int nfsrv_pathconf(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1468 | int nfsrv_read(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1469 | int nfsrv_readdir(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1470 | int nfsrv_readdirplus(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1471 | int nfsrv_readlink(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1472 | int nfsrv_remove(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1473 | int nfsrv_rename(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1474 | int nfsrv_rmdir(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1475 | int nfsrv_setattr(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1476 | int nfsrv_statfs(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1477 | int nfsrv_symlink(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1478 | int nfsrv_write(struct nfsrv_descript *, struct nfsrv_sock *, vfs_context_t, mbuf_t *); |
| 1479 | |
| 1480 | void nfs_interval_timer_start(thread_call_t, int); |
| 1481 | int nfs_use_cache(struct nfsmount *); |
| 1482 | void nfs_up(struct nfsmount *, thread_t, int, const char *); |
| 1483 | void nfs_down(struct nfsmount *, thread_t, int, int, const char *, int); |
| 1484 | int nfs_msg(thread_t, const char *, const char *, int); |
| 1485 | |
| 1486 | int nfs_mountroot(void); |
| 1487 | struct nfs_diskless; |
| 1488 | int nfs_boot_init(struct nfs_diskless *); |
| 1489 | int nfs_boot_getfh(struct nfs_diskless *, int, int); |
| 1490 | |
| 1491 | #if CONFIG_TRIGGERS |
| 1492 | resolver_result_t nfs_mirror_mount_trigger_resolve(vnode_t, const struct componentname *, enum path_operation, int, void *, vfs_context_t); |
| 1493 | resolver_result_t nfs_mirror_mount_trigger_unresolve(vnode_t, int, void *, vfs_context_t); |
| 1494 | resolver_result_t nfs_mirror_mount_trigger_rearm(vnode_t, int, void *, vfs_context_t); |
| 1495 | int nfs_mirror_mount_domount(vnode_t, vnode_t, vfs_context_t); |
| 1496 | void nfs_ephemeral_mount_harvester_start(void); |
| 1497 | void nfs_ephemeral_mount_harvester(__unused void *arg, __unused wait_result_t wr); |
| 1498 | #endif |
| 1499 | |
| 1500 | /* socket upcall interfaces */ |
| 1501 | void nfsrv_uc_init(void); |
| 1502 | void nfsrv_uc_cleanup(void); |
| 1503 | void nfsrv_uc_addsock(struct nfsrv_sock *, int); |
| 1504 | void nfsrv_uc_dequeue(struct nfsrv_sock *); |
| 1505 | |
| 1506 | /* Debug support */ |
| 1507 | #define NFS_DEBUG_LEVEL (nfs_debug_ctl & 0xf) |
| 1508 | #define NFS_DEBUG_FACILITY ((nfs_debug_ctl >> 4) & 0xff) |
| 1509 | #define NFS_DEBUG_FLAGS ((nfs_debug_ctl >> 12) & 0xff) |
| 1510 | #define NFS_DEBUG_VALUE ((nfs_debug_ctl >> 20) & 0xfff) |
| 1511 | #define NFS_FAC_SOCK 0x01 |
| 1512 | #define NFS_FAC_STATE 0x02 |
| 1513 | #define NFS_FAC_NODE 0x04 |
| 1514 | #define NFS_FAC_VNOP 0x08 |
| 1515 | #define NFS_FAC_BIO 0x10 |
| 1516 | #define NFS_FAC_GSS 0x20 |
| 1517 | #define NFS_FAC_VFS 0x40 |
| 1518 | |
| 1519 | #define NFS_DBG(fac, lev, fmt, ...) \ |
| 1520 | if (__builtin_expect(NFS_DEBUG_LEVEL, 0)) nfs_printf(fac, lev, "%s: %d: " fmt, __func__, __LINE__, ## __VA_ARGS__) |
| 1521 | |
| 1522 | void nfs_printf(int, int, const char *, ...) __printflike(3,4); |
| 1523 | int nfs_mountopts(struct nfsmount *, char *, int); |
| 1524 | |
| 1525 | __END_DECLS |
| 1526 | |
| 1527 | #endif /* KERNEL */ |
| 1528 | #endif /* __APPLE_API_PRIVATE */ |
| 1529 | |
| 1530 | #endif |
| 1531 | |