2  * Copyright (c) 2000-2011 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   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. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  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. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  28 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 
  30  * Copyright (c) 1989, 1993, 1995 
  31  *      The Regents of the University of California.  All rights reserved. 
  33  * This code is derived from software contributed to Berkeley by 
  34  * Rick Macklem at The University of Guelph. 
  36  * Redistribution and use in source and binary forms, with or without 
  37  * modification, are permitted provided that the following conditions 
  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. 
  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 
  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 $ 
  71 #include <sys/appleapiopts.h> 
  72 #include <sys/cdefs.h> 
  74 #ifdef __APPLE_API_PRIVATE 
  76  * Tunable constants for nfs 
  79 #define NFS_TICKINTVL   5               /* Desired time for a tick (msec) */ 
  80 #define NFS_HZ          (hz / nfs_ticks) /* Ticks/sec */ 
  81 __private_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     16              /* 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_DEADSOCKDELAY     5       /* Seconds before dead sockets are reaped */ 
 110 #define NFSRV_MAXWGATHERDELAY   100     /* Max. write gather delay (msec) */ 
 111 #ifndef NFSRV_WGATHERDELAY 
 112 #define NFSRV_WGATHERDELAY      1       /* Default write gather delay (msec) */ 
 114 #define NFS_DIRBLKSIZ   4096            /* size of NFS directory buffers */ 
 115 #if defined(KERNEL) && !defined(DIRBLKSIZ) 
 116 #define DIRBLKSIZ       512             /* XXX we used to use ufs's DIRBLKSIZ */ 
 117                                         /* can't be larger than NFS_FABLKSIZE */ 
 120 /* default values for unresponsive mount timeouts */ 
 121 #define NFS_TPRINTF_INITIAL_DELAY       12 
 122 #define NFS_TPRINTF_DELAY               30 
 127 #define NFS_CMPFH(n, f, s) \ 
 128         ((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s))) 
 129 #define NFSRV_NDMAXDATA(n) \ 
 130                 (((n)->nd_vers == NFS_VER3) ? (((n)->nd_nam2) ? \ 
 131                  NFS_MAXDGRAMDATA : NFSRV_MAXDATA) : NFS_V2MAXDATA) 
 134  * The IO_METASYNC flag should be implemented for local file systems. 
 135  * (Until then, it is nothin at all.) 
 138 #define IO_METASYNC     0 
 142  * Expected allocation sizes for major data structures. If the actual size 
 143  * of the structure exceeds these sizes, then malloc() will be allocating 
 144  * almost twice the memory required. This is used in nfs_init() to warn 
 145  * the sysadmin that the size of a structure should be reduced. 
 146  * (These sizes are always a power of 2. If the kernel malloc() changes 
 147  *  to one that does not allocate space in powers of 2 size, then this all 
 149  * Note that some of these structures come out of their own nfs zones. 
 151 #define NFS_NODEALLOC   1024 
 152 #define NFS_MNTALLOC    1024 
 153 #define NFS_SVCALLOC    512 
 155 #define NFS_ARGSVERSION_XDR     88      /* NFS mount args are in XDR format */ 
 157 #define NFS_XDRARGS_VERSION_0   0 
 158 #define NFS_MATTR_BITMAP_LEN    1               /* length of mount attributes bitmap */ 
 159 #define NFS_MFLAG_BITMAP_LEN    1               /* length of mount flags bitmap */ 
 161 /* NFS mount attributes */ 
 162 #define NFS_MATTR_FLAGS                 0       /* mount flags (NFS_MATTR_*) */ 
 163 #define NFS_MATTR_NFS_VERSION           1       /* NFS protocol version */ 
 164 #define NFS_MATTR_NFS_MINOR_VERSION     2       /* NFS protocol minor version */ 
 165 #define NFS_MATTR_READ_SIZE             3       /* READ RPC size */ 
 166 #define NFS_MATTR_WRITE_SIZE            4       /* WRITE RPC size */ 
 167 #define NFS_MATTR_READDIR_SIZE          5       /* READDIR RPC size */ 
 168 #define NFS_MATTR_READAHEAD             6       /* block readahead count */ 
 169 #define NFS_MATTR_ATTRCACHE_REG_MIN     7       /* minimum attribute cache time */ 
 170 #define NFS_MATTR_ATTRCACHE_REG_MAX     8       /* maximum attribute cache time */ 
 171 #define NFS_MATTR_ATTRCACHE_DIR_MIN     9       /* minimum attribute cache time for dirs */ 
 172 #define NFS_MATTR_ATTRCACHE_DIR_MAX     10      /* maximum attribute cache time for dirs */ 
 173 #define NFS_MATTR_LOCK_MODE             11      /* advisory file locking mode (NFS_LOCK_MODE_*) */ 
 174 #define NFS_MATTR_SECURITY              12      /* RPC security flavors to use */ 
 175 #define NFS_MATTR_MAX_GROUP_LIST        13      /* max # of RPC AUTH_SYS groups */ 
 176 #define NFS_MATTR_SOCKET_TYPE           14      /* socket transport type as a netid-like string */ 
 177 #define NFS_MATTR_NFS_PORT              15      /* port # to use for NFS protocol */ 
 178 #define NFS_MATTR_MOUNT_PORT            16      /* port # to use for MOUNT protocol */ 
 179 #define NFS_MATTR_REQUEST_TIMEOUT       17      /* initial RPC request timeout value */ 
 180 #define NFS_MATTR_SOFT_RETRY_COUNT      18      /* max RPC retransmissions for soft mounts */ 
 181 #define NFS_MATTR_DEAD_TIMEOUT          19      /* how long until unresponsive mount is considered dead */ 
 182 #define NFS_MATTR_FH                    20      /* file handle for mount directory */ 
 183 #define NFS_MATTR_FS_LOCATIONS          21      /* list of locations for the file system */ 
 184 #define NFS_MATTR_MNTFLAGS              22      /* VFS mount flags (MNT_*) */ 
 185 #define NFS_MATTR_MNTFROM               23      /* fixed string to use for "f_mntfromname" */ 
 187 /* NFS mount flags */ 
 188 #define NFS_MFLAG_SOFT                  0       /* soft mount (requests fail if unresponsive) */ 
 189 #define NFS_MFLAG_INTR                  1       /* allow operations to be interrupted */ 
 190 #define NFS_MFLAG_RESVPORT              2       /* use a reserved port */ 
 191 #define NFS_MFLAG_NOCONNECT             3       /* don't connect the socket (UDP) */ 
 192 #define NFS_MFLAG_DUMBTIMER             4       /* don't estimate RTT dynamically */ 
 193 #define NFS_MFLAG_CALLUMNT              5       /* call MOUNTPROC_UMNT on unmount */ 
 194 #define NFS_MFLAG_RDIRPLUS              6       /* request additional info when reading directories */ 
 195 #define NFS_MFLAG_NONEGNAMECACHE        7       /* don't do negative name caching */ 
 196 #define NFS_MFLAG_MUTEJUKEBOX           8       /* don't treat jukebox errors as unresponsive */ 
 197 #define NFS_MFLAG_EPHEMERAL             9       /* ephemeral (mirror) mount */ 
 198 #define NFS_MFLAG_NOCALLBACK            10      /* don't provide callback RPC service */ 
 199 #define NFS_MFLAG_NONAMEDATTR           11      /* don't use named attributes */ 
 200 #define NFS_MFLAG_NOACL                 12      /* don't support ACLs */ 
 201 #define NFS_MFLAG_ACLONLY               13      /* only support ACLs - not mode */ 
 202 #define NFS_MFLAG_NFC                   14      /* send NFC strings */ 
 203 #define NFS_MFLAG_NOQUOTA               15      /* don't support QUOTA requests */ 
 204 #define NFS_MFLAG_MNTUDP                16      /* MOUNT protocol should use UDP */ 
 205 #define NFS_MFLAG_MNTQUICK              17      /* use short timeouts while mounting */ 
 207 /* NFS advisory file locking modes */ 
 208 #define NFS_LOCK_MODE_ENABLED           0       /* advisory file locking enabled */ 
 209 #define NFS_LOCK_MODE_DISABLED          1       /* do not support advisory file locking */ 
 210 #define NFS_LOCK_MODE_LOCAL             2       /* perform advisory file locking locally */ 
 213  * Old-style arguments to mount NFS 
 215 #define NFS_ARGSVERSION 6               /* change when nfs_args changes */ 
 217         int             version
;        /* args structure version number */ 
 219         user32_addr_t addr
;             /* file server address */ 
 221         struct sockaddr 
*addr
;          /* file server address */ 
 223         int             addrlen
;        /* length of address */ 
 224         int             sotype
;         /* Socket type */ 
 225         int             proto
;          /* and Protocol */ 
 227         user32_addr_t fh
;               /* File handle to be mounted */ 
 229         u_char          
*fh
;            /* File handle to be mounted */ 
 231         int             fhsize
;         /* Size, in bytes, of fh */ 
 232         int             flags
;          /* flags */ 
 233         int             wsize
;          /* write size in bytes */ 
 234         int             rsize
;          /* read size in bytes */ 
 235         int             readdirsize
;    /* readdir size in bytes */ 
 236         int             timeo
;          /* initial timeout in .1 secs */ 
 237         int             retrans
;        /* times to retry send */ 
 238         int             maxgrouplist
;   /* Max. size of group list */ 
 239         int             readahead
;      /* # of blocks to readahead */ 
 240         int             leaseterm
;      /* obsolete: Term (sec) of lease */ 
 241         int             deadthresh
;     /* obsolete: Retrans threshold */ 
 243         user32_addr_t hostname
; /* server's name */ 
 245         char            *hostname
;      /* server's name */ 
 247         /* NFS_ARGSVERSION 3 ends here */ 
 248         int             acregmin
;       /* reg file min attr cache timeout */ 
 249         int             acregmax
;       /* reg file max attr cache timeout */ 
 250         int             acdirmin
;       /* dir min attr cache timeout */ 
 251         int             acdirmax
;       /* dir max attr cache timeout */ 
 252         /* NFS_ARGSVERSION 4 ends here */ 
 253         uint32_t        auth
;           /* security mechanism flavor */ 
 254         /* NFS_ARGSVERSION 5 ends here */ 
 255         uint32_t        deadtimeout
;    /* secs until unresponsive mount considered dead */ 
 258 /* incremental size additions in each version of nfs_args */ 
 259 #define NFS_ARGSVERSION4_INCSIZE        (4 * sizeof(int)) 
 260 #define NFS_ARGSVERSION5_INCSIZE        (sizeof(uint32_t)) 
 261 #define NFS_ARGSVERSION6_INCSIZE        (sizeof(uint32_t)) 
 264 /* LP64 version of nfs_args.  all pointers and longs 
 265  * grow when we're dealing with a 64-bit process. 
 266  * WARNING - keep in sync with nfs_args 
 268 struct user_nfs_args 
{ 
 269         int             version
;        /* args structure version number */ 
 270         user_addr_t     addr 
__attribute((aligned(8)));         /* file server address */ 
 271         int             addrlen
;        /* length of address */ 
 272         int             sotype
;         /* Socket type */ 
 273         int             proto
;          /* and Protocol */ 
 274         user_addr_t     fh 
__attribute((aligned(8)));           /* File handle to be mounted */ 
 275         int             fhsize
;         /* Size, in bytes, of fh */ 
 276         int             flags
;          /* flags */ 
 277         int             wsize
;          /* write size in bytes */ 
 278         int             rsize
;          /* read size in bytes */ 
 279         int             readdirsize
;    /* readdir size in bytes */ 
 280         int             timeo
;          /* initial timeout in .1 secs */ 
 281         int             retrans
;        /* times to retry send */ 
 282         int             maxgrouplist
;   /* Max. size of group list */ 
 283         int             readahead
;      /* # of blocks to readahead */ 
 284         int             leaseterm
;      /* obsolete: Term (sec) of lease */ 
 285         int             deadthresh
;     /* obsolete: Retrans threshold */ 
 286         user_addr_t     hostname 
__attribute((aligned(8)));     /* server's name */ 
 287         /* NFS_ARGSVERSION 3 ends here */ 
 288         int             acregmin
;       /* reg file min attr cache timeout */ 
 289         int             acregmax
;       /* reg file max attr cache timeout */ 
 290         int             acdirmin
;       /* dir min attr cache timeout */ 
 291         int             acdirmax
;       /* dir max attr cache timeout */ 
 292         /* NFS_ARGSVERSION 4 ends here */ 
 293         uint32_t        auth
;           /* security mechanism flavor */ 
 294         /* NFS_ARGSVERSION 5 ends here */ 
 295         uint32_t        deadtimeout
;    /* secs until unresponsive mount considered dead */ 
 300  * Old-style NFS mount option flags 
 302 #define NFSMNT_SOFT             0x00000001  /* soft mount (hard is default) */ 
 303 #define NFSMNT_WSIZE            0x00000002  /* set write size */ 
 304 #define NFSMNT_RSIZE            0x00000004  /* set read size */ 
 305 #define NFSMNT_TIMEO            0x00000008  /* set initial timeout */ 
 306 #define NFSMNT_RETRANS          0x00000010  /* set number of request retries */ 
 307 #define NFSMNT_MAXGRPS          0x00000020  /* set maximum grouplist size */ 
 308 #define NFSMNT_INT              0x00000040  /* allow interrupts on hard mount */ 
 309 #define NFSMNT_NOCONN           0x00000080  /* Don't Connect the socket */ 
 310 #define NFSMNT_NONEGNAMECACHE   0x00000100  /* Don't do negative name caching */ 
 311 #define NFSMNT_NFSV3            0x00000200  /* Use NFS Version 3 protocol */ 
 312 #define NFSMNT_NFSV4            0x00000400  /* Use NFS Version 4 protocol */ 
 313 #define NFSMNT_DUMBTIMR         0x00000800  /* Don't estimate rtt dynamically */ 
 314 #define NFSMNT_DEADTIMEOUT      0x00001000  /* unmount after a period of unresponsiveness */ 
 315 #define NFSMNT_READAHEAD        0x00002000  /* set read ahead */ 
 316 #define NFSMNT_CALLUMNT         0x00004000  /* call MOUNTPROC_UMNT on unmount */ 
 317 #define NFSMNT_RESVPORT         0x00008000  /* Allocate a reserved port */ 
 318 #define NFSMNT_RDIRPLUS         0x00010000  /* Use Readdirplus for V3 */ 
 319 #define NFSMNT_READDIRSIZE      0x00020000  /* Set readdir size */ 
 320 #define NFSMNT_NOLOCKS          0x00040000  /* don't support file locking */ 
 321 #define NFSMNT_LOCALLOCKS       0x00080000  /* do file locking locally on client */ 
 322 #define NFSMNT_ACREGMIN         0x00100000  /* reg min attr cache timeout */ 
 323 #define NFSMNT_ACREGMAX         0x00200000  /* reg max attr cache timeout */ 
 324 #define NFSMNT_ACDIRMIN         0x00400000  /* dir min attr cache timeout */ 
 325 #define NFSMNT_ACDIRMAX         0x00800000  /* dir max attr cache timeout */ 
 326 #define NFSMNT_SECFLAVOR        0x01000000  /* Use security flavor */ 
 327 #define NFSMNT_SECSYSOK         0x02000000  /* Server can support auth sys */ 
 328 #define NFSMNT_MUTEJUKEBOX      0x04000000  /* don't treat jukebox errors as unresponsive */ 
 329 #define NFSMNT_NOQUOTA          0x08000000  /* don't support QUOTA requests */ 
 333  * fs.nfs sysctl(3) NFS_MOUNTINFO defines 
 335 #define NFS_MOUNT_INFO_VERSION  0       /* nfsstat mount information version */ 
 336 #define NFS_MIATTR_BITMAP_LEN   1       /* length of mount info attributes bitmap */ 
 337 #define NFS_MIFLAG_BITMAP_LEN   1       /* length of mount info flags bitmap */ 
 339 /* NFS mount info attributes */ 
 340 #define NFS_MIATTR_FLAGS                0       /* mount info flags bitmap (MIFLAG_*) */ 
 341 #define NFS_MIATTR_ORIG_ARGS            1       /* original mount args passed into mount call */ 
 342 #define NFS_MIATTR_CUR_ARGS             2       /* current mount args values */ 
 343 #define NFS_MIATTR_CUR_LOC_INDEX        3       /* current fs location index */ 
 345 /* NFS mount info flags */ 
 346 #define NFS_MIFLAG_DEAD         0       /* mount is dead */ 
 347 #define NFS_MIFLAG_NOTRESP      1       /* server is unresponsive */ 
 348 #define NFS_MIFLAG_RECOVERY     2       /* mount in recovery */ 
 352  * Structures for the nfssvc(2) syscall. Not that anyone but nfsd 
 353  * should ever try and use it. 
 356         int     sock
;           /* Socket to serve */ 
 358         user32_addr_t   name
;           /* Client addr for connection based sockets */ 
 360         caddr_t name
;           /* Client addr for connection based sockets */ 
 362         int     namelen
;        /* Length of name */ 
 366 /* LP64 version of nfsd_args.  all pointers and longs 
 367  * grow when we're dealing with a 64-bit process. 
 368  * WARNING - keep in sync with nfsd_args 
 370 struct user_nfsd_args 
{ 
 371         int             sock
;           /* Socket to serve */ 
 372         user_addr_t     name 
__attribute((aligned(8)));         /* Client addr for connection based sockets */ 
 373         int             namelen
;        /* Length of name */ 
 379  * NFS Server File Handle structures 
 382 /* NFS export handle identifies which NFS export */ 
 383 #define NFS_FH_VERSION  0x4e580000              /* 'NX00' */ 
 384 struct nfs_exphandle 
{ 
 385         uint32_t        nxh_version
;            /* data structure version */ 
 386         uint32_t        nxh_fsid
;               /* File System Export ID */ 
 387         uint32_t        nxh_expid
;              /* Export ID */ 
 388         uint16_t        nxh_flags
;              /* export handle flags */ 
 389         uint8_t         nxh_reserved
;           /* future use */ 
 390         uint8_t         nxh_fidlen
;             /* length of File ID */ 
 394 #define NXHF_INVALIDFH          0x0001          /* file handle is invalid */ 
 396 #define NFS_MAX_FID_SIZE        (NFS_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) 
 397 #define NFSV4_MAX_FID_SIZE      (NFSV4_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) 
 398 #define NFSV3_MAX_FID_SIZE      (NFSV3_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) 
 399 #define NFSV2_MAX_FID_SIZE      (NFSV2_MAX_FH_SIZE - sizeof(struct nfs_exphandle)) 
 401 /* NFS server internal view of fhandle_t */ 
 402 /* The first sizeof(fhandle_t) bytes must match what goes into fhandle_t. */ 
 403 /* (fhp is used to allow use of an external buffer) */ 
 404 struct nfs_filehandle 
{ 
 405         uint32_t                nfh_len
;        /* total length of file handle */ 
 406         struct nfs_exphandle    nfh_xh
;         /* export handle */ 
 407         unsigned char           nfh_fid
[NFS_MAX_FID_SIZE
]; /* File ID */ 
 408         unsigned char           *nfh_fhp
;       /* pointer to file handle */ 
 412  * NFS export data structures 
 415 /* Structure to hold an array of security flavors */ 
 416 #define NX_MAX_SEC_FLAVORS 5 
 419         uint32_t flavors
[NX_MAX_SEC_FLAVORS
]; 
 422 struct nfs_export_net_args 
{ 
 423         uint32_t                nxna_flags
;     /* export flags */ 
 424         struct xucred           nxna_cred
;      /* mapped credential for root/all user */ 
 425         struct sockaddr_storage nxna_addr
;      /* net address to which exported */ 
 426         struct sockaddr_storage nxna_mask
;      /* mask for net address */ 
 427         struct nfs_sec          nxna_sec
;       /* security mechanism flavors */ 
 430 struct nfs_export_args 
{ 
 431         uint32_t                nxa_fsid
;       /* export FS ID */ 
 432         uint32_t                nxa_expid
;      /* export ID */ 
 434         user32_addr_t           nxa_fspath
;     /* export FS path */ 
 435         user32_addr_t           nxa_exppath
;    /* export sub-path */ 
 437         char                    *nxa_fspath
;    /* export FS path */ 
 438         char                    *nxa_exppath
;   /* export sub-path */ 
 440         uint32_t                nxa_flags
;      /* export arg flags */ 
 441         uint32_t                nxa_netcount
;   /* #entries in ex_nets array */ 
 443         user32_addr_t           nxa_nets
;       /* array of net args */ 
 445         struct nfs_export_net_args 
*nxa_nets
;   /* array of net args */ 
 450 /* LP64 version of export_args */ 
 452 struct user_nfs_export_args 
{ 
 453         uint32_t                nxa_fsid
;       /* export FS ID */ 
 454         uint32_t                nxa_expid
;      /* export ID */ 
 455         user_addr_t             nxa_fspath
;     /* export FS path */ 
 456         user_addr_t             nxa_exppath
;    /* export sub-path */ 
 457         uint32_t                nxa_flags
;      /* export arg flags */ 
 458         uint32_t                nxa_netcount
;   /* #entries in ex_nets array */ 
 459         user_addr_t             nxa_nets
;       /* array of net args */ 
 464 /* nfs export arg flags */ 
 465 #define NXA_DELETE              0x0001  /* delete the specified export(s) */ 
 466 #define NXA_ADD                 0x0002  /* add the specified export(s) */ 
 467 #define NXA_REPLACE             0x0003  /* delete and add the specified export(s) */ 
 468 #define NXA_DELETE_ALL          0x0004  /* delete all exports */ 
 469 #define NXA_OFFLINE             0x0008  /* export is offline */ 
 470 #define NXA_CHECK               0x0010  /* check if exportable */ 
 472 /* export option flags */ 
 473 #define NX_READONLY             0x0001  /* exported read-only */ 
 474 #define NX_DEFAULTEXPORT        0x0002  /* exported to the world */ 
 475 #define NX_MAPROOT              0x0004  /* map root access to anon credential */ 
 476 #define NX_MAPALL               0x0008  /* map all access to anon credential */ 
 477 #define NX_32BITCLIENTS         0x0020  /* restrict directory cookies to 32 bits */ 
 478 #define NX_OFFLINE              0x0040  /* export is offline */ 
 481  * fs.nfs sysctl(3) export stats record structures 
 483 #define NFS_EXPORT_STAT_REC_VERSION 1   /* export stat record version */ 
 484 #define NFS_USER_STAT_REC_VERSION 1     /* active user list record version */ 
 486 /* descriptor describing following records */ 
 487 struct nfs_export_stat_desc
 
 489         uint32_t rec_vers
;              /* version of export stat records */ 
 490         uint32_t rec_count
;             /* total record count */ 
 491 }__attribute__((__packed__
)); 
 493 /* export stat record containing path and stat counters */ 
 494 struct nfs_export_stat_rec 
{ 
 495         char     path
[RPCMNT_PATHLEN 
+ 1]; 
 496         uint64_t ops
;           /* Count of NFS Requests received for this export */ 
 497         uint64_t bytes_read
;    /* Count of bytes read from this export */ 
 498         uint64_t bytes_written
; /* Count of bytes written to this export */ 
 499 }__attribute__((__packed__
)); 
 501 /* Active user list stat buffer descriptor */ 
 502 struct nfs_user_stat_desc
 
 504         uint32_t rec_vers
;      /* version of active user stat records */ 
 505         uint32_t rec_count
;     /* total record count */ 
 506 }__attribute__((__packed__
)); 
 508 /* Active user list user stat record format */ 
 509 struct nfs_user_stat_user_rec 
{ 
 512         struct sockaddr_storage sock
; 
 515         uint64_t                bytes_written
; 
 518 }__attribute__((__packed__
)); 
 520 /* Active user list path record format */ 
 521 struct nfs_user_stat_path_rec 
{ 
 523         char    path
[RPCMNT_PATHLEN 
+ 1]; 
 524 }__attribute__((__packed__
)); 
 526 /* Defines for rec_type field of 
 527  * nfs_user_stat_rec & nfs_user_stat_rec 
 530 #define NFS_USER_STAT_USER_REC  0 
 531 #define NFS_USER_STAT_PATH_REC  1 
 537 struct nfs_export_options 
{ 
 538         uint32_t                nxo_flags
;      /* export options */ 
 539         kauth_cred_t            nxo_cred
;       /* mapped credential */ 
 540         struct nfs_sec          nxo_sec
;        /* security mechanism flavors */ 
 543 /* Network address lookup element and individual export options */ 
 545         struct radix_node               no_rnodes
[2];   /* radix tree glue */ 
 546         struct nfs_export_options       no_opt
;         /* export options */ 
 549 /* statistic counters for each exported directory 
 551  * Since 64-bit atomic operations are not available on 32-bit platforms, 
 552  * 64-bit counters are implemented using 32-bit integers and 32-bit 
 555 typedef struct nfsstatcount64 
{ 
 560 struct nfs_export_stat_counters 
{ 
 561         struct nfsstatcount64 ops
;              /* Count of NFS Requests received for this export  */ 
 562         struct nfsstatcount64 bytes_read
;       /* Count of bytes read from this export */ 
 563         struct nfsstatcount64 bytes_written
;    /* Count of bytes written to his export */ 
 564 }__attribute__((__packed__
)); 
 566 /* Macro for updating nfs export stat counters */ 
 567 #define NFSStatAdd64(PTR, VAL) \ 
 569                 uint32_t NFSSA_OldValue = \ 
 570                 OSAddAtomic((VAL), &(PTR)->lo); \ 
 571                 if ((NFSSA_OldValue + (VAL)) < NFSSA_OldValue) \ 
 572                         OSAddAtomic(1, &(PTR)->hi); \ 
 575 /* Some defines for dealing with active user list stats */ 
 576 #define NFSRV_USER_STAT_DEF_MAX_NODES 1024      /* default active user list size limit */ 
 577 #define NFSRV_USER_STAT_DEF_IDLE_SEC  7200      /* default idle seconds (node no longer considered active) */ 
 579 /* active user list globals */ 
 580 __private_extern__ 
uint32_t nfsrv_user_stat_enabled
;            /* enable/disable active user list */ 
 581 __private_extern__ 
uint32_t nfsrv_user_stat_node_count
;         /* current count of user stat nodes */ 
 582 __private_extern__ 
uint32_t nfsrv_user_stat_max_idle_sec
;       /* idle seconds (node no longer considered active) */ 
 583 __private_extern__ 
uint32_t nfsrv_user_stat_max_nodes
;          /* active user list size limit */ 
 584 __private_extern__ lck_grp_t 
*nfsrv_active_user_mutex_group
; 
 586 /* An active user node represented in the kernel */ 
 587 struct nfs_user_stat_node 
{ 
 588         TAILQ_ENTRY(nfs_user_stat_node
) lru_link
; 
 589         LIST_ENTRY(nfs_user_stat_node
)  hash_link
; 
 591         struct sockaddr_storage sock
; 
 594         uint64_t                bytes_written
; 
 599 /* Hash table for active user nodes */ 
 600 #define NFS_USER_STAT_HASH_SIZE 16      /* MUST be a power of 2 */ 
 601 #define NFS_USER_STAT_HASH(userhashtbl, uid) \ 
 602                 &((userhashtbl)[(uid) & (NFS_USER_STAT_HASH_SIZE - 1)]) 
 604 TAILQ_HEAD(nfs_user_stat_lru_head
, nfs_user_stat_node
); 
 605 LIST_HEAD(nfs_user_stat_hashtbl_head
, nfs_user_stat_node
); 
 607 /* Active user list data structure */ 
 608 /* One per exported directory */ 
 609 struct nfs_active_user_list 
{ 
 610         struct nfs_user_stat_lru_head           user_lru
; 
 611         struct nfs_user_stat_hashtbl_head       user_hashtbl
[NFS_USER_STAT_HASH_SIZE
]; 
 613         lck_mtx_t user_mutex
; 
 617 /* Network export information */ 
 618 /* one of these for each exported directory */ 
 620         LIST_ENTRY(nfs_export
)          nx_next
;        /* FS export list */ 
 621         LIST_ENTRY(nfs_export
)          nx_hash
;        /* export hash chain */ 
 622         struct nfs_export               
*nx_parent
;     /* parent export */ 
 623         uint32_t                        nx_id
;          /* export ID */ 
 624         uint32_t                        nx_flags
;       /* export flags */ 
 625         struct nfs_exportfs             
*nx_fs
;         /* exported file system */ 
 626         char                            *nx_path
;       /* exported file system sub-path */ 
 627         struct nfs_filehandle           nx_fh
;          /* export root file handle */ 
 628         struct nfs_export_options       nx_defopt
;      /* default options */ 
 629         uint32_t                        nx_expcnt
;      /* # exports in table */ 
 630         struct radix_node_head          
*nx_rtable
[AF_MAX
+1]; /* table of exports (netopts) */ 
 631         struct nfs_export_stat_counters nx_stats
;       /* statistic counters for this exported directory */ 
 632         struct nfs_active_user_list     nx_user_list
;   /* Active User List for this exported directory */ 
 633         struct timeval                  nx_exptime
;     /* time of export for write verifier */ 
 636 /* NFS exported file system info */ 
 637 /* one of these for each exported file system */ 
 638 struct nfs_exportfs 
{ 
 639         LIST_ENTRY(nfs_exportfs
)        nxfs_next
;      /* exported file system list */ 
 640         uint32_t                        nxfs_id
;        /* exported file system ID */ 
 641         char                            *nxfs_path
;     /* exported file system path */ 
 642         LIST_HEAD(,nfs_export
)          nxfs_exports
;   /* list of exports for this file system */ 
 645 __private_extern__ 
LIST_HEAD(nfsrv_expfs_list
, nfs_exportfs
) nfsrv_exports
; 
 646 __private_extern__ lck_rw_t nfsrv_export_rwlock
;  // lock for export data structures 
 647 #define NFSRVEXPHASHSZ  64 
 648 #define NFSRVEXPHASHVAL(FSID, EXPID)    \ 
 649         (((FSID) >> 24) ^ ((FSID) >> 16) ^ ((FSID) >> 8) ^ (EXPID)) 
 650 #define NFSRVEXPHASH(FSID, EXPID)       \ 
 651         (&nfsrv_export_hashtbl[NFSRVEXPHASHVAL((FSID),(EXPID)) & nfsrv_export_hash]) 
 652 __private_extern__ 
LIST_HEAD(nfsrv_export_hashhead
, nfs_export
) *nfsrv_export_hashtbl
; 
 653 __private_extern__ u_long nfsrv_export_hash
; 
 657  * NFS server file mod fsevents 
 660         LIST_ENTRY(nfsrv_fmod
)  fm_link
; 
 662         struct vfs_context      fm_context
; 
 663         uint64_t                fm_deadline
; 
 666 #define NFSRVFMODHASHSZ 128 
 667 #define NFSRVFMODHASH(vp) (((uintptr_t) vp) & nfsrv_fmod_hash) 
 668 __private_extern__ 
LIST_HEAD(nfsrv_fmod_hashhead
, nfsrv_fmod
) *nfsrv_fmod_hashtbl
; 
 669 __private_extern__ u_long nfsrv_fmod_hash
; 
 670 __private_extern__ lck_mtx_t 
*nfsrv_fmod_mutex
; 
 671 __private_extern__ 
int nfsrv_fmod_pending
, nfsrv_fsevents_enabled
; 
 674 __private_extern__ 
int nfsrv_async
, nfsrv_export_hash_size
,  
 675                         nfsrv_reqcache_size
, nfsrv_sock_max_rec_queue_length
; 
 676 __private_extern__ 
uint32_t nfsrv_gss_context_ttl
; 
 677 __private_extern__ 
struct nfsstats nfsstats
; 
 682  * XXX to allow amd to include nfs.h without nfsproto.h 
 690         int     attrcache_misses
; 
 691         int     lookupcache_hits
; 
 692         int     lookupcache_misses
; 
 693         int     direofcache_hits
; 
 694         int     direofcache_misses
; 
 701         int     biocache_readlinks
; 
 703         int     biocache_readdirs
; 
 705         int     rpccnt
[NFS_NPROCS
]; 
 707         int     srvrpccnt
[NFS_NPROCS
]; 
 714         int     srvcache_inproghits
; 
 715         int     srvcache_idemdonehits
; 
 716         int     srvcache_nonidemdonehits
; 
 725  * Flags for nfssvc() system call. 
 727 #define NFSSVC_NFSD     0x004 
 728 #define NFSSVC_ADDSOCK  0x008 
 729 #define NFSSVC_EXPORT   0x200 
 732  * Flags for nfsclnt() system call. 
 734 #define NFSCLNT_LOCKDANS        0x200 
 735 #define NFSCLNT_LOCKDNOTIFY     0x400 
 738  * fs.nfs sysctl(3) identifiers 
 740 #define NFS_NFSSTATS    1       /* struct: struct nfsstats */ 
 741 #define NFS_EXPORTSTATS 3       /* gets exported directory stats */ 
 742 #define NFS_USERSTATS   4       /* gets exported directory active user stats */ 
 743 #define NFS_USERCOUNT   5       /* gets current count of active nfs users */ 
 744 #define NFS_MOUNTINFO   6       /* gets information about an NFS mount */ 
 746 #ifndef NFS_WDELAYHASHSIZ 
 747 #define NFS_WDELAYHASHSIZ 16    /* and with this */ 
 751 #include <sys/kernel_types.h> 
 752 #include <kern/thread_call.h> 
 753 #include <sys/kdebug.h> 
 755 #define NFS_KERNEL_DEBUG KERNEL_DEBUG 
 757 /* kernel debug trace macros */ 
 758 #define FSDBG(A, B, C, D, E) \ 
 759         NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_NONE, \ 
 760                 (int)(B), (int)(C), (int)(D), (int)(E), 0) 
 761 #define FSDBG_TOP(A, B, C, D, E) \ 
 762         NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_START, \ 
 763                 (int)(B), (int)(C), (int)(D), (int)(E), 0) 
 764 #define FSDBG_BOT(A, B, C, D, E) \ 
 765         NFS_KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, (A))) | DBG_FUNC_END, \ 
 766                 (int)(B), (int)(C), (int)(D), (int)(E), 0) 
 768 #ifdef MALLOC_DECLARE 
 769 MALLOC_DECLARE(M_NFSREQ
); 
 770 MALLOC_DECLARE(M_NFSMNT
); 
 771 MALLOC_DECLARE(M_NFSDIROFF
); 
 772 MALLOC_DECLARE(M_NFSRVDESC
); 
 773 MALLOC_DECLARE(M_NFSD
); 
 774 MALLOC_DECLARE(M_NFSBIGFH
); 
 777 struct vnode_attr
; struct nameidata
; struct dqblk
; struct sockaddr_in
; /* XXX */ 
 782 typedef struct nfsnode 
* nfsnode_t
; 
 783 struct nfs_open_owner
; 
 784 struct nfs_open_file
; 
 785 struct nfs_lock_owner
; 
 786 struct nfs_file_lock
; 
 788 struct nfs_rpc_record_state
; 
 789 struct nfs_fs_locations
; 
 790 struct nfs_location_index
; 
 792 struct nfs_socket_search
; 
 795  * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. 
 796  * What should be in this set is open to debate, but I believe that since 
 797  * I/O system calls on ufs are never interrupted by signals the set should 
 798  * be minimal. My reasoning is that many current programs that use signals 
 799  * such as SIGALRM will not expect file I/O system calls to be interrupted 
 802 #define NFSINT_SIGMASK  (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \ 
 803                          sigmask(SIGHUP)|sigmask(SIGQUIT)) 
 805 __private_extern__ 
size_t nfs_mbuf_mhlen
, nfs_mbuf_minclsize
; 
 808  * NFS mbuf chain structure used for managing the building/dissection of RPCs 
 811         mbuf_t          nmc_mhead
;      /* mbuf chain head */ 
 812         mbuf_t          nmc_mcur
;       /* current mbuf */ 
 813         caddr_t         nmc_ptr
;        /* pointer into current mbuf */ 
 814         uint32_t        nmc_left
;       /* bytes remaining in current mbuf */ 
 815         uint32_t        nmc_flags
;      /* flags for this nfsm_chain */ 
 817 #define NFSM_CHAIN_FLAG_ADD_CLUSTERS    0x1     /* always add mbuf clusters */ 
 820  * Each retransmission of an RPCSEC_GSS request 
 821  * has an additional sequence number. 
 824         SLIST_ENTRY(gss_seq
)    gss_seqnext
; 
 829  * async NFS request callback info 
 831 struct nfsreq_cbinfo 
{ 
 832         void                    (*rcb_func
)(struct nfsreq 
*);   /* async request callback function */ 
 833         struct nfsbuf           
*rcb_bp
;                        /* buffer I/O RPC is for */ 
 834         uint32_t                rcb_args
[3];                    /* additional callback args */ 
 838  * Arguments to use if a request needs to call SECINFO to handle a WRONGSEC error 
 840  * If only node is set, use the parent file handle and this node's name; otherwise, 
 841  * use any file handle and name provided. 
 843 struct nfsreq_secinfo_args 
{ 
 844         nfsnode_t               rsia_np
;                /* the node */ 
 845         const char              *rsia_name
;             /* alternate name string */ 
 846         u_char                  
*rsia_fh
;               /* alternate file handle */ 
 847         uint32_t                rsia_namelen
;           /* length of string */ 
 848         uint32_t                rsia_fhsize
;            /* length of fh */ 
 850 #define NFSREQ_SECINFO_SET(SI, NP, FH, FHSIZE, NAME, NAMELEN) \ 
 852                 (SI)->rsia_np = (NP); \ 
 853                 (SI)->rsia_fh = (FH); \ 
 854                 (SI)->rsia_fhsize = (FHSIZE); \ 
 855                 (SI)->rsia_name = (NAME); \ 
 856                 (SI)->rsia_namelen = (NAMELEN); \ 
 860  * NFS outstanding request list element 
 863         lck_mtx_t               r_mtx
;          /* NFS request mutex */ 
 864         TAILQ_ENTRY(nfsreq
)     r_chain
;        /* request queue chain */ 
 865         TAILQ_ENTRY(nfsreq
)     r_achain
;       /* mount's async I/O request queue chain */ 
 866         TAILQ_ENTRY(nfsreq
)     r_rchain
;       /* mount's async I/O resend queue chain */ 
 867         TAILQ_ENTRY(nfsreq
)     r_cchain
;       /* mount's cwnd queue chain */ 
 868         mbuf_t                  r_mrest
;        /* request body mbufs */ 
 869         mbuf_t                  r_mhead
;        /* request header mbufs */ 
 870         struct nfsm_chain       r_nmrep
;        /* reply mbufs */ 
 871         nfsnode_t               r_np
;           /* NFS node */ 
 872         struct nfsmount         
*r_nmp
;         /* NFS mount point */ 
 873         uint64_t                r_xid
;          /* RPC transaction ID */ 
 874         uint32_t                r_procnum
;      /* NFS procedure number */ 
 875         uint32_t                r_mreqlen
;      /* request length */ 
 876         int                     r_flags
;        /* flags on request, see below */ 
 877         int                     r_lflags
;       /* flags protected by list mutex, see below */ 
 878         int                     r_refs
;         /* # outstanding references */ 
 879         uint8_t                 r_delay
;        /* delay to use for jukebox error */ 
 880         uint8_t                 r_retry
;        /* max retransmission count */ 
 881         uint8_t                 r_rexmit
;       /* current retrans count */ 
 882         int                     r_rtt
;          /* RTT for rpc */ 
 883         thread_t                r_thread
;       /* thread that did I/O system call */ 
 884         kauth_cred_t            r_cred
;         /* credential used for request */ 
 885         time_t                  r_start
;        /* request start time */ 
 886         time_t                  r_lastmsg
;      /* time of last tprintf */ 
 887         time_t                  r_resendtime
;   /* time of next jukebox error resend */ 
 888         struct nfs_gss_clnt_ctx 
*r_gss_ctx
;     /* RPCSEC_GSS context */ 
 889         SLIST_HEAD(, gss_seq
)   r_gss_seqlist
;  /* RPCSEC_GSS sequence numbers */ 
 890         uint32_t                r_gss_argoff
;   /* RPCSEC_GSS offset to args */ 
 891         uint32_t                r_gss_arglen
;   /* RPCSEC_GSS arg length */ 
 892         uint32_t                r_auth
;         /* security flavor request sent with */ 
 893         uint32_t                *r_wrongsec
;    /* wrongsec: other flavors to try */ 
 894         int                     r_error
;        /* request error */ 
 895         struct nfsreq_cbinfo    r_callback
;     /* callback info */ 
 896         struct nfsreq_secinfo_args r_secinfo
;   /* secinfo args */ 
 900  * Queue head for nfsreq's 
 902 TAILQ_HEAD(nfs_reqqhead
, nfsreq
); 
 903 __private_extern__ 
struct nfs_reqqhead nfs_reqq
; 
 904 __private_extern__ lck_grp_t 
*nfs_request_grp
; 
 906 #define R_XID32(x)      ((x) & 0xffffffff) 
 908 #define NFSREQNOLIST ((struct nfsreq *)0xdeadbeef)      /* sentinel value for nfsreq lists */ 
 910 /* Flag values for r_flags */ 
 911 #define R_TIMING        0x00000001      /* timing request (in mntp) */ 
 912 #define R_CWND          0x00000002      /* request accounted for in congestion window */ 
 913 #define R_SOFTTERM      0x00000004      /* request terminated (e.g. soft mnt) */ 
 914 #define R_RESTART       0x00000008      /* RPC should be restarted. */ 
 915 #define R_INITTED       0x00000010      /* request has been initialized */ 
 916 #define R_TPRINTFMSG    0x00000020      /* Did a tprintf msg. */ 
 917 #define R_MUSTRESEND    0x00000040      /* Must resend request */ 
 918 #define R_ALLOCATED     0x00000080      /* request was allocated */ 
 919 #define R_SENT          0x00000100      /* request has been sent */ 
 920 #define R_WAITSENT      0x00000200      /* someone is waiting for request to be sent */ 
 921 #define R_RESENDERR     0x00000400      /* resend failed */ 
 922 #define R_JBTPRINTFMSG  0x00000800      /* Did a tprintf msg for jukebox error */ 
 923 #define R_ASYNC         0x00001000      /* async request */ 
 924 #define R_ASYNCWAIT     0x00002000      /* async request now being waited on */ 
 925 #define R_RESENDQ       0x00004000      /* async request currently on resendq */ 
 926 #define R_SENDING       0x00008000      /* request currently being sent */ 
 928 #define R_NOINTR        0x20000000      /* request should not be interupted by a signal */ 
 929 #define R_RECOVER       0x40000000      /* a state recovery RPC - during NFSSTA_RECOVER */ 
 930 #define R_SETUP         0x80000000      /* a setup RPC - during (re)connection */ 
 931 #define R_OPTMASK       0xe0000000      /* mask of all RPC option flags */ 
 933 /* Flag values for r_lflags */ 
 934 #define RL_BUSY         0x0001          /* Locked. */ 
 935 #define RL_WAITING      0x0002          /* Someone waiting for lock. */ 
 936 #define RL_QUEUED       0x0004          /* request is on the queue */ 
 938 __private_extern__ u_int32_t nfs_xid
, nfs_xidwrap
; 
 939 __private_extern__ 
int nfs_iosize
, nfs_allow_async
, nfs_statfs_rate_limit
; 
 940 __private_extern__ 
int nfs_access_cache_timeout
, nfs_access_delete
, nfs_access_dotzfs
, nfs_access_for_getattr
; 
 941 __private_extern__ 
int nfs_lockd_mounts
, nfs_lockd_request_sent
, nfs_single_des
; 
 942 __private_extern__ 
int nfs_tprintf_initial_delay
, nfs_tprintf_delay
; 
 943 __private_extern__ 
int nfsiod_thread_count
, nfsiod_thread_max
, nfs_max_async_writes
; 
 944 __private_extern__ 
int nfs_idmap_ctrl
, nfs_callback_port
; 
 946 /* bits for nfs_idmap_ctrl: */ 
 947 #define NFS_IDMAP_CTRL_USE_IDMAP_SERVICE                0x00000001 /* use the ID mapping service */ 
 948 #define NFS_IDMAP_CTRL_FALLBACK_NO_COMMON_IDS           0x00000002 /* fallback should NOT handle common IDs like "root" and "nobody" */ 
 949 #define NFS_IDMAP_CTRL_FALLBACK_NO_WELLKNOWN_IDS        0x00000004 /* fallback should NOT handle the well known "XXX@" IDs */ 
 950 #define NFS_IDMAP_CTRL_UNKNOWN_IS_99                    0x00000008 /* for unknown IDs use uid/gid 99 instead of -2/nobody */ 
 951 #define NFS_IDMAP_CTRL_COMPARE_RESULTS                  0x00000010 /* compare results of ID mapping service and fallback */ 
 952 #define NFS_IDMAP_CTRL_LOG_FAILED_MAPPINGS              0x00000020 /* log failed ID mapping attempts */ 
 953 #define NFS_IDMAP_CTRL_LOG_SUCCESSFUL_MAPPINGS          0x00000040 /* log successful ID mapping attempts */ 
 955 #define NFSIOD_MAX      (MIN(nfsiod_thread_max, NFS_MAXASYNCTHREAD)) 
 957 struct nfs_dulookup 
{ 
 958         int du_flags
;                   /* state of ._ lookup */ 
 959 #define NFS_DULOOKUP_DOIT       0x1 
 960 #define NFS_DULOOKUP_INPROG     0x2 
 961         struct componentname du_cn
;     /* ._ name being looked up */ 
 962         struct nfsreq du_req
;           /* NFS request for lookup */ 
 963         char du_smallname
[48];          /* buffer for small names */ 
 967  * One nfsrv_sock structure is maintained for each socket the 
 968  * server is servicing requests on. 
 971         TAILQ_ENTRY(nfsrv_sock
) ns_chain
;       /* List of all nfsrv_sock's */ 
 972         TAILQ_ENTRY(nfsrv_sock
) ns_svcq
;        /* List of sockets needing servicing */ 
 973         TAILQ_ENTRY(nfsrv_sock
) ns_wgq
;         /* List of sockets with a pending write gather */ 
 974         lck_rw_t        ns_rwlock
;              /* lock for most fields */ 
 988         time_t          ns_timestamp
;           /* socket timestamp */ 
 989         lck_mtx_t       ns_wgmutex
;             /* mutex for write gather fields */ 
 990         u_quad_t        ns_wgtime
;              /* next Write deadline (usec) */ 
 991         LIST_HEAD(, nfsrv_descript
) ns_tq
;      /* Write gather lists */ 
 992         LIST_HEAD(nfsrv_wg_delayhash
, nfsrv_descript
) ns_wdelayhashtbl
[NFS_WDELAYHASHSIZ
]; 
 995 /* Bits for "ns_flag" */ 
 996 #define SLP_VALID       0x0001 /* nfs sock valid */ 
 997 #define SLP_DOREC       0x0002 /* nfs sock has received data to process */ 
 998 #define SLP_NEEDQ       0x0004 /* network socket has data to receive */ 
 999 #define SLP_DISCONN     0x0008 /* socket needs to be zapped */ 
1000 #define SLP_GETSTREAM   0x0010 /* currently in nfsrv_getstream() */ 
1001 #define SLP_LASTFRAG    0x0020 /* on last fragment of RPC record */ 
1002 #define SLP_DOWRITES    0x0040 /* nfs sock has gathered writes to service */ 
1003 #define SLP_WORKTODO    0x004e /* mask of all "work to do" flags */ 
1004 #define SLP_ALLFLAGS    0x007f 
1005 #define SLP_WAITQ       0x4000 /* nfs sock is on the wait queue */ 
1006 #define SLP_WORKQ       0x8000 /* nfs sock is on the work queue */ 
1007 #define SLP_QUEUED      0xc000 /* nfs sock is on a queue */ 
1009 #define SLPNOLIST ((struct nfsrv_sock *)0xdeadbeef)     /* sentinel value for sockets not in the nfsrv_sockwg list */ 
1011 __private_extern__ 
struct nfsrv_sock 
*nfsrv_udpsock
, *nfsrv_udp6sock
; 
1014  * global NFS server socket lists: 
1016  * nfsrv_socklist - list of all sockets (ns_chain) 
1017  * nfsrv_sockwait - sockets w/new data waiting to be worked on (ns_svcq) 
1018  * nfsrv_sockwork - sockets being worked on which may have more work to do (ns_svcq) 
1019  * nfsrv_sockwg - sockets with pending write gather input (ns_wgq) 
1021 __private_extern__ 
TAILQ_HEAD(nfsrv_sockhead
, nfsrv_sock
) nfsrv_socklist
, nfsrv_deadsocklist
, 
1022                                                 nfsrv_sockwg
, nfsrv_sockwait
, nfsrv_sockwork
; 
1024 /* lock groups for nfsrv_sock's */ 
1025 __private_extern__ lck_grp_t 
*nfsrv_slp_rwlock_group
; 
1026 __private_extern__ lck_grp_t 
*nfsrv_slp_mutex_group
; 
1029  * One of these structures is allocated for each nfsd. 
1032         TAILQ_ENTRY(nfsd
)       nfsd_chain
;     /* List of all nfsd's */ 
1033         TAILQ_ENTRY(nfsd
)       nfsd_queue
;     /* List of waiting nfsd's */ 
1034         int                     nfsd_flag
;      /* NFSD_ flags */ 
1035         struct nfsrv_sock       
*nfsd_slp
;      /* Current socket */ 
1036         struct nfsrv_descript   
*nfsd_nd
;       /* Associated nfsrv_descript */ 
1039 /* Bits for "nfsd_flag" */ 
1040 #define NFSD_WAITING    0x01 
1041 #define NFSD_REQINPROG  0x02 
1044  * This structure is used by the server for describing each request. 
1045  * Some fields are used only when write request gathering is performed. 
1047 struct nfsrv_descript 
{ 
1048         u_quad_t                nd_time
;        /* Write deadline (usec) */ 
1049         off_t                   nd_off
;         /* Start byte offset */ 
1050         off_t                   nd_eoff
;        /* and end byte offset */ 
1051         LIST_ENTRY(nfsrv_descript
) nd_hash
;     /* Hash list */ 
1052         LIST_ENTRY(nfsrv_descript
) nd_tq
;       /* and timer list */ 
1053         LIST_HEAD(,nfsrv_descript
) nd_coalesce
; /* coalesced writes */ 
1054         struct nfsm_chain       nd_nmreq
;       /* Request mbuf chain */ 
1055         mbuf_t                  nd_mrep
;        /* Reply mbuf list (WG) */ 
1056         mbuf_t                  nd_nam
;         /* and socket addr */ 
1057         mbuf_t                  nd_nam2
;        /* return socket addr */ 
1058         u_int32_t               nd_procnum
;     /* RPC # */ 
1059         int                     nd_stable
;      /* storage type */ 
1060         int                     nd_vers
;        /* NFS version */ 
1061         int                     nd_len
;         /* Length of this write */ 
1062         int                     nd_repstat
;     /* Reply status */ 
1063         u_int32_t                       nd_retxid
;      /* Reply xid */ 
1064         struct timeval          nd_starttime
;   /* Time RPC initiated */ 
1065         struct nfs_filehandle   nd_fh
;          /* File handle */ 
1066         uint32_t                nd_sec
;         /* Security flavor */ 
1067         struct nfs_gss_svc_ctx  
*nd_gss_context
;/* RPCSEC_GSS context */ 
1068         uint32_t                nd_gss_seqnum
;  /* RPCSEC_GSS seq num */ 
1069         mbuf_t                  nd_gss_mb
;      /* RPCSEC_GSS results mbuf */ 
1070         kauth_cred_t            nd_cr
;          /* Credentials */ 
1073 __private_extern__ 
TAILQ_HEAD(nfsd_head
, nfsd
) nfsd_head
, nfsd_queue
; 
1075 /* mutex for nfs server */ 
1076 __private_extern__ lck_mtx_t 
*nfsd_mutex
; 
1077 __private_extern__ 
int nfsd_thread_count
, nfsd_thread_max
; 
1079 /* request list mutex */ 
1080 __private_extern__ lck_mtx_t 
*nfs_request_mutex
; 
1081 __private_extern__ 
int nfs_request_timer_on
; 
1083 /* mutex for nfs client globals */ 
1084 __private_extern__ lck_mtx_t 
*nfs_global_mutex
; 
1086 /* NFSv4 callback globals */ 
1087 __private_extern__ 
int nfs4_callback_timer_on
; 
1088 __private_extern__ in_port_t nfs4_cb_port
, nfs4_cb_port6
; 
1090 /* nfs timer call structures */ 
1091 __private_extern__ thread_call_t        nfs_request_timer_call
; 
1092 __private_extern__ thread_call_t        nfs_buf_timer_call
; 
1093 __private_extern__ thread_call_t        nfs4_callback_timer_call
; 
1094 __private_extern__ thread_call_t        nfsrv_deadsock_timer_call
; 
1096 __private_extern__ thread_call_t        nfsrv_fmod_timer_call
; 
1101 nfstype 
vtonfs_type(enum vtype
, int); 
1102 enum vtype 
nfstov_type(nfstype
, int); 
1103 int     vtonfsv2_mode(enum vtype
, mode_t
); 
1105 void    nfs_mbuf_init(void); 
1107 void    nfs_nhinit(void); 
1108 void    nfs_nhinit_finish(void); 
1109 u_long  
nfs_hash(u_char 
*, int); 
1111 int     nfs4_init_clientid(struct nfsmount 
*); 
1112 int     nfs4_setclientid(struct nfsmount 
*); 
1113 int     nfs4_renew(struct nfsmount 
*, int); 
1114 void    nfs4_renew_timer(void *, void *); 
1115 void    nfs4_mount_callback_setup(struct nfsmount 
*); 
1116 void    nfs4_mount_callback_shutdown(struct nfsmount 
*); 
1117 void    nfs4_cb_accept(socket_t
, void *, int); 
1118 void    nfs4_cb_rcv(socket_t
, void *, int); 
1119 void    nfs4_callback_timer(void *, void *); 
1120 int     nfs4_secinfo_rpc(struct nfsmount 
*, struct nfsreq_secinfo_args 
*, kauth_cred_t
, uint32_t *, int *); 
1121 int     nfs4_get_fs_locations(struct nfsmount 
*, nfsnode_t
, u_char 
*, int, const char *, vfs_context_t
, struct nfs_fs_locations 
*); 
1122 void    nfs_fs_locations_cleanup(struct nfs_fs_locations 
*); 
1123 void    nfs4_default_attrs_for_referral_trigger(nfsnode_t
, char *, int, struct nfs_vattr 
*, fhandle_t 
*); 
1125 int     nfs_sockaddr_cmp(struct sockaddr 
*, struct sockaddr 
*); 
1126 int     nfs_connect(struct nfsmount 
*, int, int); 
1127 void    nfs_disconnect(struct nfsmount 
*); 
1128 void    nfs_need_reconnect(struct nfsmount 
*); 
1129 void    nfs_mount_sock_thread_wake(struct nfsmount 
*); 
1130 void    nfs_mount_check_dead_timeout(struct nfsmount 
*); 
1131 void    nfs_rpc_record_state_init(struct nfs_rpc_record_state 
*); 
1132 void    nfs_rpc_record_state_cleanup(struct nfs_rpc_record_state 
*); 
1133 int     nfs_rpc_record_read(socket_t
, struct nfs_rpc_record_state 
*, int, int *, mbuf_t 
*); 
1135 int     nfs_getattr(nfsnode_t
, struct nfs_vattr 
*, vfs_context_t
, int); 
1136 int     nfs_getattrcache(nfsnode_t
, struct nfs_vattr 
*, int); 
1137 int     nfs_loadattrcache(nfsnode_t
, struct nfs_vattr 
*, u_int64_t 
*, int); 
1138 int     nfs_attrcachetimeout(nfsnode_t
); 
1140 int     nfs_buf_page_inval(vnode_t vp
, off_t offset
); 
1141 int     nfs_vinvalbuf(vnode_t
, int, vfs_context_t
, int); 
1142 int     nfs_vinvalbuf2(vnode_t
, int, thread_t
, kauth_cred_t
, int); 
1143 int     nfs_vinvalbuf_internal(nfsnode_t
, int, thread_t
, kauth_cred_t
, int, int); 
1144 void    nfs_wait_bufs(nfsnode_t
); 
1146 int     nfs_request_create(nfsnode_t
, mount_t
, struct nfsm_chain 
*, int, thread_t
, kauth_cred_t
, struct nfsreq 
**); 
1147 void    nfs_request_destroy(struct nfsreq 
*); 
1148 void    nfs_request_ref(struct nfsreq 
*, int); 
1149 void    nfs_request_rele(struct nfsreq 
*); 
1150 int     nfs_request_add_header(struct nfsreq 
*); 
1151 int     nfs_request_send(struct nfsreq 
*, int); 
1152 void    nfs_request_wait(struct nfsreq 
*); 
1153 int     nfs_request_finish(struct nfsreq 
*, struct nfsm_chain 
*, int *); 
1154 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 *); 
1155 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 *); 
1156 int     nfs_request_gss(mount_t
, struct nfsm_chain 
*, thread_t
, kauth_cred_t
, int, struct nfs_gss_clnt_ctx 
*, struct nfsm_chain 
*, int *); 
1157 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 
**); 
1158 int     nfs_request_async_finish(struct nfsreq 
*, struct nfsm_chain 
*, u_int64_t 
*, int *); 
1159 void    nfs_request_async_cancel(struct nfsreq 
*); 
1160 void    nfs_request_timer(void *, void *); 
1161 int     nfs_request_using_gss(struct nfsreq 
*); 
1162 void    nfs_get_xid(uint64_t *); 
1163 int     nfs_sigintr(struct nfsmount 
*, struct nfsreq 
*, thread_t
, int); 
1164 int     nfs_noremotehang(thread_t
); 
1166 int     nfs_send(struct nfsreq 
*, int); 
1167 int     nfs_sndlock(struct nfsreq 
*); 
1168 void    nfs_sndunlock(struct nfsreq 
*); 
1170 int     nfs_uaddr2sockaddr(const char *, struct sockaddr 
*); 
1172 int     nfs_aux_request(struct nfsmount 
*, thread_t
, struct sockaddr 
*, socket_t
, int, mbuf_t
, uint32_t, int, int, struct nfsm_chain 
*); 
1173 int     nfs_portmap_lookup(struct nfsmount 
*, vfs_context_t
, struct sockaddr 
*, socket_t
, uint32_t, uint32_t, uint32_t, int); 
1175 void    nfs_location_next(struct nfs_fs_locations 
*, struct nfs_location_index 
*); 
1176 int     nfs_location_index_cmp(struct nfs_location_index 
*, struct nfs_location_index 
*); 
1177 void    nfs_location_mntfromname(struct nfs_fs_locations 
*, struct nfs_location_index
, char *, int, int); 
1178 int     nfs_socket_create(struct nfsmount 
*, struct sockaddr 
*, int, in_port_t
, uint32_t, uint32_t, int, struct nfs_socket 
**); 
1179 void    nfs_socket_destroy(struct nfs_socket 
*); 
1180 void    nfs_socket_options(struct nfsmount 
*, struct nfs_socket 
*); 
1181 void    nfs_connect_upcall(socket_t
, void *, int); 
1182 int     nfs_connect_error_class(int); 
1183 int     nfs_connect_search_loop(struct nfsmount 
*, struct nfs_socket_search 
*); 
1184 void    nfs_socket_search_update_error(struct nfs_socket_search 
*, int); 
1185 void    nfs_socket_search_cleanup(struct nfs_socket_search 
*); 
1186 void    nfs_mount_connect_thread(void *, __unused wait_result_t
); 
1188 int     nfs_lookitup(nfsnode_t
, char *, int, vfs_context_t
, nfsnode_t 
*); 
1189 void    nfs_dulookup_init(struct nfs_dulookup 
*, nfsnode_t
, const char *, int, vfs_context_t
); 
1190 void    nfs_dulookup_start(struct nfs_dulookup 
*, nfsnode_t
, vfs_context_t
); 
1191 void    nfs_dulookup_finish(struct nfs_dulookup 
*, nfsnode_t
, vfs_context_t
); 
1192 int     nfs_dir_buf_cache_lookup(nfsnode_t
, nfsnode_t 
*, struct componentname 
*, vfs_context_t
, int); 
1193 int     nfs_dir_buf_search(struct nfsbuf 
*, struct componentname 
*, fhandle_t 
*, struct nfs_vattr 
*, uint64_t *, time_t *, daddr64_t 
*, int); 
1194 void    nfs_name_cache_purge(nfsnode_t
, nfsnode_t
, struct componentname 
*, vfs_context_t
); 
1196 uint32_t nfs4_ace_nfstype_to_vfstype(uint32_t, int *); 
1197 uint32_t nfs4_ace_vfstype_to_nfstype(uint32_t, int *); 
1198 uint32_t nfs4_ace_nfsflags_to_vfsflags(uint32_t); 
1199 uint32_t nfs4_ace_vfsflags_to_nfsflags(uint32_t); 
1200 uint32_t nfs4_ace_nfsmask_to_vfsrights(uint32_t); 
1201 uint32_t nfs4_ace_vfsrights_to_nfsmask(uint32_t); 
1202 int nfs4_id2guid(char *, guid_t 
*, int); 
1203 int nfs4_guid2id(guid_t 
*, char *, int *, int); 
1205 int     nfs_parsefattr(struct nfsm_chain 
*, int, struct nfs_vattr 
*); 
1206 int     nfs4_parsefattr(struct nfsm_chain 
*, struct nfs_fsattr 
*, struct nfs_vattr 
*, fhandle_t 
*, struct dqblk 
*, struct nfs_fs_locations 
*); 
1207 void    nfs_vattr_set_supported(uint32_t *, struct vnode_attr 
*); 
1208 void    nfs_vattr_set_bitmap(struct nfsmount 
*, uint32_t *, struct vnode_attr 
*); 
1209 void    nfs3_pathconf_cache(struct nfsmount 
*, struct nfs_fsattr 
*); 
1210 int     nfs3_mount_rpc(struct nfsmount 
*, struct sockaddr 
*, int, int, char *, vfs_context_t
, int, fhandle_t 
*, struct nfs_sec 
*); 
1211 void    nfs3_umount_rpc(struct nfsmount 
*, vfs_context_t
, int); 
1212 int     nfs_node_access_slot(nfsnode_t
, uid_t
, int); 
1213 void    nfs_vnode_notify(nfsnode_t
, uint32_t); 
1215 void    nfs_avoid_needless_id_setting_on_create(nfsnode_t
, struct vnode_attr 
*, vfs_context_t
); 
1216 int     nfs4_create_rpc(vfs_context_t
, nfsnode_t
, struct componentname 
*, struct vnode_attr 
*, int, char *, nfsnode_t 
*); 
1217 int     nfs_open_state_set_busy(nfsnode_t
, thread_t
); 
1218 void    nfs_open_state_clear_busy(nfsnode_t
); 
1219 struct nfs_open_owner 
*nfs_open_owner_find(struct nfsmount 
*, kauth_cred_t
, int); 
1220 void    nfs_open_owner_destroy(struct nfs_open_owner 
*); 
1221 void    nfs_open_owner_ref(struct nfs_open_owner 
*); 
1222 void    nfs_open_owner_rele(struct nfs_open_owner 
*); 
1223 int     nfs_open_owner_set_busy(struct nfs_open_owner 
*, thread_t
); 
1224 void    nfs_open_owner_clear_busy(struct nfs_open_owner 
*); 
1225 void    nfs_owner_seqid_increment(struct nfs_open_owner 
*, struct nfs_lock_owner 
*, int); 
1226 int     nfs_open_file_find(nfsnode_t
, struct nfs_open_owner 
*, struct nfs_open_file 
**, uint32_t, uint32_t, int); 
1227 int     nfs_open_file_find_internal(nfsnode_t
, struct nfs_open_owner 
*, struct nfs_open_file 
**, uint32_t, uint32_t, int); 
1228 void    nfs_open_file_destroy(struct nfs_open_file 
*); 
1229 int     nfs_open_file_set_busy(struct nfs_open_file 
*, thread_t
); 
1230 void    nfs_open_file_clear_busy(struct nfs_open_file 
*); 
1231 void    nfs_open_file_add_open(struct nfs_open_file 
*, uint32_t, uint32_t, int); 
1232 void    nfs_open_file_remove_open_find(struct nfs_open_file 
*, uint32_t, uint32_t, uint32_t *, uint32_t *, int*); 
1233 void    nfs_open_file_remove_open(struct nfs_open_file 
*, uint32_t, uint32_t); 
1234 void    nfs_get_stateid(nfsnode_t
, thread_t
, kauth_cred_t
, nfs_stateid 
*); 
1235 int     nfs4_open(nfsnode_t
, struct nfs_open_file 
*, uint32_t, uint32_t, vfs_context_t
); 
1236 int     nfs4_open_delegated(nfsnode_t
, struct nfs_open_file 
*, uint32_t, uint32_t, vfs_context_t
); 
1237 int     nfs_close(nfsnode_t
, struct nfs_open_file 
*, uint32_t, uint32_t, vfs_context_t
); 
1238 int     nfs_check_for_locks(struct nfs_open_owner 
*, struct nfs_open_file 
*); 
1239 int     nfs4_reopen(struct nfs_open_file 
*, thread_t
); 
1240 int     nfs4_open_rpc(struct nfs_open_file 
*, vfs_context_t
, struct componentname 
*, struct vnode_attr 
*, vnode_t
, vnode_t 
*, int, int, int); 
1241 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); 
1242 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 *); 
1243 int     nfs4_open_reopen_rpc(struct nfs_open_file 
*, thread_t
, kauth_cred_t
, struct componentname 
*, vnode_t
, vnode_t 
*, int, int); 
1244 int     nfs4_open_reclaim_rpc(struct nfs_open_file 
*, int, int); 
1245 int     nfs4_claim_delegated_open_rpc(struct nfs_open_file 
*, int, int, int); 
1246 int     nfs4_claim_delegated_state_for_open_file(struct nfs_open_file 
*, int); 
1247 int     nfs4_claim_delegated_state_for_node(nfsnode_t
, int); 
1248 int     nfs4_open_downgrade_rpc(nfsnode_t
, struct nfs_open_file 
*, vfs_context_t
); 
1249 int     nfs4_close_rpc(nfsnode_t
, struct nfs_open_file 
*, thread_t
, kauth_cred_t
, int); 
1250 void    nfs4_delegation_return_enqueue(nfsnode_t
); 
1251 int     nfs4_delegation_return(nfsnode_t
, int, thread_t
, kauth_cred_t
); 
1252 int     nfs4_delegreturn_rpc(struct nfsmount 
*, u_char 
*, int, struct nfs_stateid 
*, int, thread_t
, kauth_cred_t
); 
1253 void    nfs_release_open_state_for_node(nfsnode_t
, int); 
1254 void    nfs_revoke_open_state_for_node(nfsnode_t
); 
1255 struct nfs_lock_owner 
*nfs_lock_owner_find(nfsnode_t
, proc_t
, int); 
1256 void    nfs_lock_owner_destroy(struct nfs_lock_owner 
*); 
1257 void    nfs_lock_owner_ref(struct nfs_lock_owner 
*); 
1258 void    nfs_lock_owner_rele(struct nfs_lock_owner 
*); 
1259 int     nfs_lock_owner_set_busy(struct nfs_lock_owner 
*, thread_t
); 
1260 void    nfs_lock_owner_clear_busy(struct nfs_lock_owner 
*); 
1261 void    nfs_lock_owner_insert_held_lock(struct nfs_lock_owner 
*, struct nfs_file_lock 
*); 
1262 struct nfs_file_lock 
*nfs_file_lock_alloc(struct nfs_lock_owner 
*); 
1263 void    nfs_file_lock_destroy(struct nfs_file_lock 
*); 
1264 int     nfs_file_lock_conflict(struct nfs_file_lock 
*, struct nfs_file_lock 
*, int *); 
1265 int     nfs4_lock_rpc(nfsnode_t
, struct nfs_open_file 
*, struct nfs_file_lock 
*, int, int, thread_t
, kauth_cred_t
); 
1266 int     nfs_unlock_rpc(nfsnode_t
, struct nfs_lock_owner 
*, int, uint64_t, uint64_t, thread_t
, kauth_cred_t
, int); 
1267 int     nfs_advlock_getlock(nfsnode_t
, struct nfs_lock_owner 
*, struct flock 
*, uint64_t, uint64_t, vfs_context_t
); 
1268 int     nfs_advlock_setlock(nfsnode_t
, struct nfs_open_file 
*, struct nfs_lock_owner 
*, int, uint64_t, uint64_t, int, short, vfs_context_t
); 
1269 int     nfs_advlock_unlock(nfsnode_t
, struct nfs_open_file 
*, struct nfs_lock_owner 
*, uint64_t, uint64_t, int, vfs_context_t
); 
1271 nfsnode_t 
nfs4_named_attr_dir_get(nfsnode_t
, int, vfs_context_t
); 
1272 int     nfs4_named_attr_get(nfsnode_t
, struct componentname 
*, uint32_t, int, vfs_context_t
, nfsnode_t 
*, struct nfs_open_file 
**); 
1273 int     nfs4_named_attr_remove(nfsnode_t
, nfsnode_t
, const char *, vfs_context_t
); 
1275 int     nfs_mount_state_in_use_start(struct nfsmount 
*, thread_t
); 
1276 int     nfs_mount_state_in_use_end(struct nfsmount 
*, int); 
1277 int     nfs_mount_state_error_should_restart(int); 
1278 int     nfs_mount_state_error_delegation_lost(int); 
1279 uint    
nfs_mount_state_max_restarts(struct nfsmount 
*); 
1280 int     nfs_mount_state_wait_for_recovery(struct nfsmount 
*); 
1281 void    nfs_need_recover(struct nfsmount 
*nmp
, int error
); 
1282 void    nfs_recover(struct nfsmount 
*); 
1284 int     nfs_vnop_access(struct vnop_access_args 
*); 
1285 int     nfs_vnop_remove(struct vnop_remove_args 
*); 
1286 int     nfs_vnop_read(struct vnop_read_args 
*); 
1287 int     nfs_vnop_write(struct vnop_write_args 
*); 
1288 int     nfs_vnop_open(struct vnop_open_args 
*); 
1289 int     nfs_vnop_close(struct vnop_close_args 
*); 
1290 int     nfs_vnop_advlock(struct vnop_advlock_args 
*); 
1291 int     nfs_vnop_mmap(struct vnop_mmap_args 
*); 
1292 int     nfs_vnop_mnomap(struct vnop_mnomap_args 
*); 
1294 int     nfs4_vnop_create(struct vnop_create_args 
*); 
1295 int     nfs4_vnop_mknod(struct vnop_mknod_args 
*); 
1296 int     nfs4_vnop_close(struct vnop_close_args 
*); 
1297 int     nfs4_vnop_getattr(struct vnop_getattr_args 
*); 
1298 int     nfs4_vnop_link(struct vnop_link_args 
*); 
1299 int     nfs4_vnop_mkdir(struct vnop_mkdir_args 
*); 
1300 int     nfs4_vnop_rmdir(struct vnop_rmdir_args 
*); 
1301 int     nfs4_vnop_symlink(struct vnop_symlink_args 
*); 
1302 int     nfs4_vnop_getxattr(struct vnop_getxattr_args 
*); 
1303 int     nfs4_vnop_setxattr(struct vnop_setxattr_args 
*); 
1304 int     nfs4_vnop_removexattr(struct vnop_removexattr_args 
*); 
1305 int     nfs4_vnop_listxattr(struct vnop_listxattr_args 
*); 
1307 int     nfs4_vnop_getnamedstream(struct vnop_getnamedstream_args 
*); 
1308 int     nfs4_vnop_makenamedstream(struct vnop_makenamedstream_args 
*); 
1309 int     nfs4_vnop_removenamedstream(struct vnop_removenamedstream_args 
*); 
1312 int     nfs_read_rpc(nfsnode_t
, uio_t
, vfs_context_t
); 
1313 int     nfs_write_rpc(nfsnode_t
, uio_t
, vfs_context_t
, int *, uint64_t *); 
1314 int     nfs_write_rpc2(nfsnode_t
, uio_t
, thread_t
, kauth_cred_t
, int *, uint64_t *); 
1316 int     nfs3_access_rpc(nfsnode_t
, u_int32_t 
*, vfs_context_t
); 
1317 int     nfs4_access_rpc(nfsnode_t
, u_int32_t 
*, vfs_context_t
); 
1318 int     nfs3_getattr_rpc(nfsnode_t
, mount_t
, u_char 
*, size_t, int, vfs_context_t
, struct nfs_vattr 
*, u_int64_t 
*); 
1319 int     nfs4_getattr_rpc(nfsnode_t
, mount_t
, u_char 
*, size_t, int, vfs_context_t
, struct nfs_vattr 
*, u_int64_t 
*); 
1320 int     nfs3_setattr_rpc(nfsnode_t
, struct vnode_attr 
*, vfs_context_t
); 
1321 int     nfs4_setattr_rpc(nfsnode_t
, struct vnode_attr 
*, vfs_context_t
); 
1322 int     nfs3_read_rpc_async(nfsnode_t
, off_t
, size_t, thread_t
, kauth_cred_t
, struct nfsreq_cbinfo 
*, struct nfsreq 
**); 
1323 int     nfs4_read_rpc_async(nfsnode_t
, off_t
, size_t, thread_t
, kauth_cred_t
, struct nfsreq_cbinfo 
*, struct nfsreq 
**); 
1324 int     nfs3_read_rpc_async_finish(nfsnode_t
, struct nfsreq 
*, uio_t
, size_t *, int *); 
1325 int     nfs4_read_rpc_async_finish(nfsnode_t
, struct nfsreq 
*, uio_t
, size_t *, int *); 
1326 int     nfs3_write_rpc_async(nfsnode_t
, uio_t
, size_t, thread_t
, kauth_cred_t
, int, struct nfsreq_cbinfo 
*, struct nfsreq 
**); 
1327 int     nfs4_write_rpc_async(nfsnode_t
, uio_t
, size_t, thread_t
, kauth_cred_t
, int, struct nfsreq_cbinfo 
*, struct nfsreq 
**); 
1328 int     nfs3_write_rpc_async_finish(nfsnode_t
, struct nfsreq 
*, int *, size_t *, uint64_t *); 
1329 int     nfs4_write_rpc_async_finish(nfsnode_t
, struct nfsreq 
*, int *, size_t *, uint64_t *); 
1330 int     nfs3_readdir_rpc(nfsnode_t
, struct nfsbuf 
*, vfs_context_t
); 
1331 int     nfs4_readdir_rpc(nfsnode_t
, struct nfsbuf 
*, vfs_context_t
); 
1332 int     nfs3_readlink_rpc(nfsnode_t
, char *, uint32_t *, vfs_context_t
); 
1333 int     nfs4_readlink_rpc(nfsnode_t
, char *, uint32_t *, vfs_context_t
); 
1334 int     nfs3_commit_rpc(nfsnode_t
, uint64_t, uint64_t, kauth_cred_t
, uint64_t); 
1335 int     nfs4_commit_rpc(nfsnode_t
, uint64_t, uint64_t, kauth_cred_t
, uint64_t); 
1336 int     nfs3_lookup_rpc_async(nfsnode_t
, char *, int, vfs_context_t
, struct nfsreq 
**); 
1337 int     nfs4_lookup_rpc_async(nfsnode_t
, char *, int, vfs_context_t
, struct nfsreq 
**); 
1338 int     nfs3_lookup_rpc_async_finish(nfsnode_t
, char *, int, vfs_context_t
, struct nfsreq 
*, u_int64_t 
*, fhandle_t 
*, struct nfs_vattr 
*); 
1339 int     nfs4_lookup_rpc_async_finish(nfsnode_t
, char *, int, vfs_context_t
, struct nfsreq 
*, u_int64_t 
*, fhandle_t 
*, struct nfs_vattr 
*); 
1340 int     nfs3_remove_rpc(nfsnode_t
, char *, int, thread_t
, kauth_cred_t
); 
1341 int     nfs4_remove_rpc(nfsnode_t
, char *, int, thread_t
, kauth_cred_t
); 
1342 int     nfs3_rename_rpc(nfsnode_t
, char *, int, nfsnode_t
, char *, int, vfs_context_t
); 
1343 int     nfs4_rename_rpc(nfsnode_t
, char *, int, nfsnode_t
, char *, int, vfs_context_t
); 
1344 int     nfs3_pathconf_rpc(nfsnode_t
, struct nfs_fsattr 
*, vfs_context_t
); 
1345 int     nfs4_pathconf_rpc(nfsnode_t
, struct nfs_fsattr 
*, vfs_context_t
); 
1346 int     nfs3_setlock_rpc(nfsnode_t
, struct nfs_open_file 
*, struct nfs_file_lock 
*, int, int, thread_t
, kauth_cred_t
); 
1347 int     nfs4_setlock_rpc(nfsnode_t
, struct nfs_open_file 
*, struct nfs_file_lock 
*, int, int, thread_t
, kauth_cred_t
); 
1348 int     nfs3_unlock_rpc(nfsnode_t
, struct nfs_lock_owner 
*, int, uint64_t, uint64_t, int, thread_t
, kauth_cred_t
); 
1349 int     nfs4_unlock_rpc(nfsnode_t
, struct nfs_lock_owner 
*, int, uint64_t, uint64_t, int, thread_t
, kauth_cred_t
); 
1350 int     nfs3_getlock_rpc(nfsnode_t
, struct nfs_lock_owner 
*, struct flock 
*, uint64_t, uint64_t, vfs_context_t
); 
1351 int     nfs4_getlock_rpc(nfsnode_t
, struct nfs_lock_owner 
*, struct flock 
*, uint64_t, uint64_t, vfs_context_t
); 
1353 void    nfsrv_active_user_list_reclaim(void); 
1354 void    nfsrv_cleancache(void); 
1355 void    nfsrv_cleanup(void); 
1356 int     nfsrv_credcheck(struct nfsrv_descript 
*, vfs_context_t
, struct nfs_export 
*, 
1357                         struct nfs_export_options 
*); 
1358 void    nfsrv_deadsock_timer(void *, void *); 
1359 int     nfsrv_dorec(struct nfsrv_sock 
*, struct nfsd 
*, struct nfsrv_descript 
**); 
1360 int     nfsrv_errmap(struct nfsrv_descript 
*, int); 
1361 int     nfsrv_export(struct user_nfs_export_args 
*, vfs_context_t
); 
1362 int     nfsrv_fhmatch(struct nfs_filehandle 
*, struct nfs_filehandle 
*); 
1363 int     nfsrv_fhtovp(struct nfs_filehandle 
*, struct nfsrv_descript 
*, vnode_t 
*, 
1364                         struct nfs_export 
**, struct nfs_export_options 
**); 
1366 void    nfsrv_fmod_timer(void *, void *); 
1368 int     nfsrv_getcache(struct nfsrv_descript 
*, struct nfsrv_sock 
*, mbuf_t 
*); 
1369 void    nfsrv_group_sort(gid_t 
*, int); 
1370 void    nfsrv_init(void); 
1371 void    nfsrv_initcache(void); 
1372 int     nfsrv_is_initialized(void); 
1373 int     nfsrv_namei(struct nfsrv_descript 
*, vfs_context_t
, struct nameidata 
*, 
1374                         struct nfs_filehandle 
*, vnode_t 
*, 
1375                         struct nfs_export 
**, struct nfs_export_options 
**); 
1376 void    nfsrv_rcv(socket_t
, void *, int); 
1377 void    nfsrv_rcv_locked(socket_t
, struct nfsrv_sock 
*, int); 
1378 int     nfsrv_rephead(struct nfsrv_descript 
*, struct nfsrv_sock 
*, struct nfsm_chain 
*, size_t); 
1379 int     nfsrv_send(struct nfsrv_sock 
*, mbuf_t
, mbuf_t
); 
1380 void    nfsrv_updatecache(struct nfsrv_descript 
*, int, mbuf_t
); 
1381 void    nfsrv_update_user_stat(struct nfs_export 
*, struct nfsrv_descript 
*, uid_t
, u_int
, u_int
, u_int
); 
1382 int     nfsrv_vptofh(struct nfs_export 
*, int, struct nfs_filehandle 
*, 
1383                         vnode_t
, vfs_context_t
, struct nfs_filehandle 
*); 
1384 void    nfsrv_wakenfsd(struct nfsrv_sock 
*); 
1385 void    nfsrv_wg_timer(void *, void *); 
1386 int     nfsrv_writegather(struct nfsrv_descript 
**, struct nfsrv_sock 
*, 
1387                                vfs_context_t
, mbuf_t 
*); 
1389 int     nfsrv_access(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1390 int     nfsrv_commit(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1391 int     nfsrv_create(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1392 int     nfsrv_fsinfo(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1393 int     nfsrv_getattr(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1394 int     nfsrv_link(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1395 int     nfsrv_lookup(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1396 int     nfsrv_mkdir(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1397 int     nfsrv_mknod(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1398 int     nfsrv_noop(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1399 int     nfsrv_null(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1400 int     nfsrv_pathconf(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1401 int     nfsrv_read(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1402 int     nfsrv_readdir(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1403 int     nfsrv_readdirplus(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1404 int     nfsrv_readlink(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1405 int     nfsrv_remove(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1406 int     nfsrv_rename(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1407 int     nfsrv_rmdir(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1408 int     nfsrv_setattr(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1409 int     nfsrv_statfs(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1410 int     nfsrv_symlink(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1411 int     nfsrv_write(struct nfsrv_descript 
*, struct nfsrv_sock 
*, vfs_context_t
, mbuf_t 
*); 
1413 void    nfs_interval_timer_start(thread_call_t
, int); 
1414 void    nfs_up(struct nfsmount 
*, thread_t
, int, const char *); 
1415 void    nfs_down(struct nfsmount 
*, thread_t
, int, int, const char *); 
1416 int     nfs_msg(thread_t
, const char *, const char *, int); 
1418 int     nfs_mountroot(void); 
1419 struct nfs_diskless
; 
1420 int     nfs_boot_init(struct nfs_diskless 
*); 
1421 int     nfs_boot_getfh(struct nfs_diskless 
*, int, int); 
1424 resolver_result_t 
nfs_mirror_mount_trigger_resolve(vnode_t
, const struct componentname 
*, enum path_operation
, int, void *, vfs_context_t
); 
1425 resolver_result_t 
nfs_mirror_mount_trigger_unresolve(vnode_t
, int, void *, vfs_context_t
); 
1426 resolver_result_t 
nfs_mirror_mount_trigger_rearm(vnode_t
, int, void *, vfs_context_t
); 
1427 int     nfs_mirror_mount_domount(vnode_t
, vnode_t
, vfs_context_t
); 
1428 void    nfs_ephemeral_mount_harvester_start(void); 
1429 void    nfs_ephemeral_mount_harvester(__unused 
void *arg
, __unused wait_result_t wr
); 
1435 #endif /* __APPLE_API_PRIVATE */