| 1 | /* |
| 2 | * Copyright (c) 2000-2015 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 |
| 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 | * @(#)nfsmount.h 8.3 (Berkeley) 3/30/95 |
| 65 | * FreeBSD-Id: nfsmount.h,v 1.13 1997/08/16 19:16:05 wollman Exp $ |
| 66 | */ |
| 67 | |
| 68 | |
| 69 | #ifndef _NFS_NFSMOUNT_H_ |
| 70 | #define _NFS_NFSMOUNT_H_ |
| 71 | |
| 72 | #include <sys/appleapiopts.h> |
| 73 | |
| 74 | #ifdef __APPLE_API_PRIVATE |
| 75 | |
| 76 | /* |
| 77 | * NFS mount file system attributes |
| 78 | */ |
| 79 | struct nfs_fsattr { |
| 80 | uint32_t nfsa_flags; /* file system flags */ |
| 81 | uint32_t nfsa_lease; /* lease time in seconds */ |
| 82 | uint32_t nfsa_maxname; /* maximum filename size */ |
| 83 | uint32_t nfsa_maxlink; /* maximum # links */ |
| 84 | uint32_t nfsa_bsize; /* block size */ |
| 85 | uint32_t nfsa_pad; /* UNUSED */ |
| 86 | uint64_t nfsa_maxfilesize; /* maximum file size */ |
| 87 | uint64_t nfsa_maxread; /* maximum read size */ |
| 88 | uint64_t nfsa_maxwrite; /* maximum write size */ |
| 89 | uint64_t nfsa_files_avail; /* file slots available */ |
| 90 | uint64_t nfsa_files_free; /* file slots free */ |
| 91 | uint64_t nfsa_files_total; /* file slots total */ |
| 92 | uint64_t nfsa_space_avail; /* disk space available */ |
| 93 | uint64_t nfsa_space_free; /* disk space free */ |
| 94 | uint64_t nfsa_space_total; /* disk space total */ |
| 95 | uint32_t nfsa_supp_attr[NFS_ATTR_BITMAP_LEN]; /* attributes supported on this file system */ |
| 96 | uint32_t nfsa_bitmap[NFS_ATTR_BITMAP_LEN]; /* valid attributes */ |
| 97 | }; |
| 98 | #define NFS_FSFLAG_LINK 0x00000001 |
| 99 | #define NFS_FSFLAG_SYMLINK 0x00000002 |
| 100 | #define NFS_FSFLAG_UNIQUE_FH 0x00000004 |
| 101 | #define NFS_FSFLAG_ACL 0x00000008 |
| 102 | #define NFS_FSFLAG_SET_TIME 0x00000010 |
| 103 | #define NFS_FSFLAG_CASE_INSENSITIVE 0x00000020 |
| 104 | #define NFS_FSFLAG_CASE_PRESERVING 0x00000040 |
| 105 | #define NFS_FSFLAG_CHOWN_RESTRICTED 0x00000080 |
| 106 | #define NFS_FSFLAG_HOMOGENEOUS 0x00000100 |
| 107 | #define NFS_FSFLAG_NO_TRUNC 0x00000200 |
| 108 | #define NFS_FSFLAG_NAMED_ATTR 0x00000400 |
| 109 | #define NFS_FSFLAG_FHTYPE_MASK 0xFF000000 |
| 110 | #define NFS_FSFLAG_FHTYPE_SHIFT 24 |
| 111 | |
| 112 | /* |
| 113 | * NFS file system location structures |
| 114 | */ |
| 115 | struct nfs_fs_server { |
| 116 | char * ns_name; /* name of server */ |
| 117 | char ** ns_addresses; /* array of addresses for server */ |
| 118 | uint32_t ns_addrcount; /* # of addresses */ |
| 119 | }; |
| 120 | struct nfs_fs_path { |
| 121 | char ** np_components; /* array of component pointers */ |
| 122 | uint32_t np_compcount; /* # components in path */ |
| 123 | }; |
| 124 | struct nfs_fs_location { |
| 125 | struct nfs_fs_server ** nl_servers; /* array of server pointers */ |
| 126 | struct nfs_fs_path nl_path; /* file system path */ |
| 127 | uint32_t nl_servcount; /* # of servers */ |
| 128 | }; |
| 129 | |
| 130 | struct nfs_location_index { |
| 131 | uint8_t nli_flags; /* misc flags */ |
| 132 | uint8_t nli_loc; /* location index */ |
| 133 | uint8_t nli_serv; /* server index */ |
| 134 | uint8_t nli_addr; /* address index */ |
| 135 | }; |
| 136 | #define NLI_VALID 0x01 /* index is valid */ |
| 137 | |
| 138 | struct nfs_fs_locations { |
| 139 | struct nfs_fs_path nl_root; /* current server's root file system path */ |
| 140 | uint32_t nl_numlocs; /* # of locations */ |
| 141 | struct nfs_location_index nl_current; /* index of current location/server/address */ |
| 142 | struct nfs_fs_location **nl_locations; /* array of fs locations */ |
| 143 | }; |
| 144 | |
| 145 | /* |
| 146 | * RPC record marker parsing state |
| 147 | */ |
| 148 | struct nfs_rpc_record_state { |
| 149 | mbuf_t nrrs_m; /* mbufs for current record */ |
| 150 | mbuf_t nrrs_mlast; |
| 151 | uint16_t nrrs_lastfrag; /* last fragment of record */ |
| 152 | uint16_t nrrs_markerleft; /* marker bytes remaining */ |
| 153 | uint32_t nrrs_fragleft; /* fragment bytes remaining */ |
| 154 | uint32_t nrrs_reclen; /* length of RPC record */ |
| 155 | }; |
| 156 | |
| 157 | /* |
| 158 | * NFS socket structures |
| 159 | */ |
| 160 | struct nfs_socket { |
| 161 | lck_mtx_t nso_lock; /* nfs socket lock */ |
| 162 | TAILQ_ENTRY(nfs_socket) nso_link; /* list of sockets */ |
| 163 | struct sockaddr * nso_saddr; /* socket address */ |
| 164 | struct sockaddr * nso_saddr2; /* additional socket address */ |
| 165 | void * nso_wake; /* address to wake up */ |
| 166 | time_t nso_timestamp; |
| 167 | time_t nso_reqtimestamp; /* last request sent */ |
| 168 | socket_t nso_so; /* socket */ |
| 169 | uint8_t nso_sotype; /* Type of socket */ |
| 170 | uint16_t nso_flags; /* NSO_* flags */ |
| 171 | struct nfs_location_index nso_location; /* location index */ |
| 172 | uint32_t nso_protocol; /* RPC protocol */ |
| 173 | uint32_t nso_version; /* RPC protocol version */ |
| 174 | uint32_t nso_pingxid; /* RPC XID of NULL ping request */ |
| 175 | uint32_t nso_nfs_min_vers; /* minimum nfs version for connecting sockets */ |
| 176 | uint32_t nso_nfs_max_vers; /* maximum nfs version for connecting sockets */ |
| 177 | int nso_error; /* saved error/status */ |
| 178 | struct nfs_rpc_record_state nso_rrs; /* RPC record parsing state (TCP) */ |
| 179 | }; |
| 180 | TAILQ_HEAD(nfssocketlist, nfs_socket); |
| 181 | /* nso_flags */ |
| 182 | #define NSO_UPCALL 0x0001 /* socket upcall in progress */ |
| 183 | #define NSO_DEAD 0x0002 /* socket is dead */ |
| 184 | #define NSO_CONNECTING 0x0004 /* socket is being connected */ |
| 185 | #define NSO_CONNECTED 0x0008 /* socket connection complete */ |
| 186 | #define NSO_PINGING 0x0010 /* socket is being tested */ |
| 187 | #define NSO_VERIFIED 0x0020 /* socket appears functional */ |
| 188 | #define NSO_DISCONNECTING 0x0040 /* socket is being disconnected */ |
| 189 | |
| 190 | /* NFS connect socket search state */ |
| 191 | struct nfs_socket_search { |
| 192 | struct nfs_location_index nss_startloc; /* starting location index */ |
| 193 | struct nfs_location_index nss_nextloc; /* next location index */ |
| 194 | struct nfssocketlist nss_socklist; /* list of active sockets */ |
| 195 | time_t nss_timestamp; /* search start time */ |
| 196 | time_t nss_last; /* timestamp of last socket */ |
| 197 | struct nfs_socket * nss_sock; /* found socket */ |
| 198 | uint8_t nss_sotype; /* TCP/UDP */ |
| 199 | uint8_t nss_sockcnt; /* # of active sockets */ |
| 200 | in_port_t nss_port; /* port # to connect to */ |
| 201 | uint32_t nss_protocol; /* RPC protocol */ |
| 202 | uint32_t nss_version; /* RPC protocol version */ |
| 203 | uint32_t nss_flags; /* (see below) */ |
| 204 | int nss_addrcnt; /* Number addresses to try or left */ |
| 205 | int nss_timeo; /* how long we are willing to wait */ |
| 206 | int nss_error; /* best error we've gotten so far */ |
| 207 | }; |
| 208 | /* nss_flags */ |
| 209 | #define NSS_VERBOSE 0x00000001 /* OK to log info about socket search */ |
| 210 | #define NSS_WARNED 0x00000002 /* logged warning about socket search taking a while */ |
| 211 | #define NSS_FALLBACK2PMAP 0x00000004 /* Try V4 on NFS_PORT first, if that fails fall back to portmapper */ |
| 212 | |
| 213 | /* |
| 214 | * function table for calling version-specific NFS functions |
| 215 | */ |
| 216 | struct nfs_funcs { |
| 217 | int (*nf_mount)(struct nfsmount *, vfs_context_t, nfsnode_t *); |
| 218 | int (*nf_update_statfs)(struct nfsmount *, vfs_context_t); |
| 219 | int (*nf_getquota)(struct nfsmount *, vfs_context_t, uid_t, int, struct dqblk *); |
| 220 | int (*nf_access_rpc)(nfsnode_t, u_int32_t *, int, vfs_context_t); |
| 221 | int (*nf_getattr_rpc)(nfsnode_t, mount_t, u_char *, size_t, int, vfs_context_t, struct nfs_vattr *, u_int64_t *); |
| 222 | int (*nf_setattr_rpc)(nfsnode_t, struct vnode_attr *, vfs_context_t); |
| 223 | int (*nf_read_rpc_async)(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **); |
| 224 | int (*nf_read_rpc_async_finish)(nfsnode_t, struct nfsreq *, uio_t, size_t *, int *); |
| 225 | int (*nf_readlink_rpc)(nfsnode_t, char *, uint32_t *, vfs_context_t); |
| 226 | int (*nf_write_rpc_async)(nfsnode_t, uio_t, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **); |
| 227 | int (*nf_write_rpc_async_finish)(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *); |
| 228 | int (*nf_commit_rpc)(nfsnode_t, uint64_t, uint64_t, kauth_cred_t, uint64_t); |
| 229 | int (*nf_lookup_rpc_async)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **); |
| 230 | int (*nf_lookup_rpc_async_finish)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *); |
| 231 | int (*nf_remove_rpc)(nfsnode_t, char *, int, thread_t, kauth_cred_t); |
| 232 | int (*nf_rename_rpc)(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t); |
| 233 | int (*nf_setlock_rpc)(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t); |
| 234 | int (*nf_unlock_rpc)(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, thread_t, kauth_cred_t); |
| 235 | int (*nf_getlock_rpc)(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t); |
| 236 | }; |
| 237 | |
| 238 | /* |
| 239 | * The long form of the NFSv4 client ID. |
| 240 | */ |
| 241 | struct nfs_client_id { |
| 242 | TAILQ_ENTRY(nfs_client_id) nci_link; /* list of client IDs */ |
| 243 | char *nci_id; /* client id buffer */ |
| 244 | int nci_idlen; /* length of client id buffer */ |
| 245 | }; |
| 246 | TAILQ_HEAD(nfsclientidlist, nfs_client_id); |
| 247 | extern struct nfsclientidlist nfsclientids; |
| 248 | |
| 249 | /* |
| 250 | * Mount structure. |
| 251 | * One allocated on every NFS mount. |
| 252 | * Holds NFS specific information for mount. |
| 253 | */ |
| 254 | struct nfsmount { |
| 255 | lck_mtx_t nm_lock; /* nfs mount lock */ |
| 256 | char * nm_args; /* NFS mount args (XDR) */ |
| 257 | uint32_t nm_mattrs[NFS_MATTR_BITMAP_LEN]; /* mount attributes in mount args */ |
| 258 | uint32_t nm_mflags_mask[NFS_MFLAG_BITMAP_LEN]; /* mount flags mask in mount args */ |
| 259 | uint32_t nm_mflags[NFS_MFLAG_BITMAP_LEN]; /* mount flags in mount args */ |
| 260 | uint32_t nm_flags[NFS_MFLAG_BITMAP_LEN]; /* current mount flags (soft, intr, etc...) */ |
| 261 | char * nm_realm; /* Kerberos realm to use */ |
| 262 | char * nm_principal; /* GSS principal to use on initial mount */ |
| 263 | char * nm_sprinc; /* Kerberos principal of the server */ |
| 264 | int nm_ref; /* Reference count on this mount */ |
| 265 | int nm_state; /* Internal state flags */ |
| 266 | int nm_vers; /* NFS version */ |
| 267 | uint32_t nm_minor_vers; /* minor version of above */ |
| 268 | uint32_t nm_min_vers; /* minimum packed version to try */ |
| 269 | uint32_t nm_max_vers; /* maximum packed version to try */ |
| 270 | const struct nfs_funcs *nm_funcs;/* version-specific functions */ |
| 271 | kauth_cred_t nm_mcred; /* credential used for the mount */ |
| 272 | mount_t nm_mountp; /* VFS structure for this filesystem */ |
| 273 | nfsnode_t nm_dnp; /* root directory nfsnode pointer */ |
| 274 | struct nfs_fs_locations nm_locations; /* file system locations */ |
| 275 | uint32_t nm_numgrps; /* Max. size of groupslist */ |
| 276 | TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gsscl; /* GSS user contexts */ |
| 277 | uint32_t nm_ncentries; /* GSS expired negative cache entries */ |
| 278 | int nm_timeo; /* Init timer for NFSMNT_DUMBTIMR */ |
| 279 | int nm_retry; /* Max retries */ |
| 280 | uint32_t nm_rsize; /* Max size of read rpc */ |
| 281 | uint32_t nm_wsize; /* Max size of write rpc */ |
| 282 | uint32_t nm_biosize; /* buffer I/O size */ |
| 283 | uint32_t nm_readdirsize; /* Size of a readdir rpc */ |
| 284 | uint32_t nm_readahead; /* Num. of blocks to readahead */ |
| 285 | uint32_t nm_acregmin; /* reg file min attr cache timeout */ |
| 286 | uint32_t nm_acregmax; /* reg file max attr cache timeout */ |
| 287 | uint32_t nm_acdirmin; /* dir min attr cache timeout */ |
| 288 | uint32_t nm_acdirmax; /* dir max attr cache timeout */ |
| 289 | uint32_t nm_auth; /* security mechanism flavor being used */ |
| 290 | uint32_t nm_writers; /* Number of nodes open for writing */ |
| 291 | uint32_t nm_mappers; /* Number of nodes that have mmapped */ |
| 292 | struct nfs_sec nm_sec; /* acceptable security mechanism flavors */ |
| 293 | struct nfs_sec nm_servsec; /* server's acceptable security mechanism flavors */ |
| 294 | struct nfs_etype nm_etype; /* If using kerberos, the support session key encryption types */ |
| 295 | fhandle_t *nm_fh; /* initial file handle */ |
| 296 | uint8_t nm_lockmode; /* advisory file locking mode */ |
| 297 | /* mount info */ |
| 298 | uint32_t nm_fsattrstamp; /* timestamp for fs attrs */ |
| 299 | struct nfs_fsattr nm_fsattr; /* file system attributes */ |
| 300 | uint64_t nm_verf; /* v3/v4 write verifier */ |
| 301 | union { |
| 302 | struct { /* v2/v3 specific fields */ |
| 303 | TAILQ_ENTRY(nfsmount) ldlink; /* chain of mounts registered for lockd use */ |
| 304 | int udp_sent; /* UDP request send count */ |
| 305 | int udp_cwnd; /* UDP request congestion window */ |
| 306 | struct nfs_reqqhead udp_cwndq; /* requests waiting on cwnd */ |
| 307 | struct sockaddr *rqsaddr;/* cached rquota socket address */ |
| 308 | uint32_t rqsaddrstamp; /* timestamp of rquota socket address */ |
| 309 | } v3; |
| 310 | struct { /* v4 specific fields */ |
| 311 | struct nfs_client_id *longid; /* client ID, long form */ |
| 312 | uint64_t mounttime; /* used as client ID verifier */ |
| 313 | uint64_t clientid; /* client ID, short form */ |
| 314 | thread_call_t renew_timer; /* RENEW timer call */ |
| 315 | nfs_fsid fsid; /* NFS file system id */ |
| 316 | TAILQ_HEAD(, nfsnode) delegations; /* list of nodes with delegations */ |
| 317 | TAILQ_HEAD(, nfsnode) dreturnq; /* list of nodes with delegations to return */ |
| 318 | TAILQ_ENTRY(nfsmount) cblink; /* chain of mounts registered for callbacks */ |
| 319 | uint32_t cbid; /* callback channel identifier */ |
| 320 | uint32_t cbrefs; /* # callbacks using this mount */ |
| 321 | } v4; |
| 322 | } nm_un; |
| 323 | /* common state */ |
| 324 | TAILQ_HEAD(, nfs_open_owner) nm_open_owners; /* list of open owners */ |
| 325 | uint32_t nm_stateinuse; /* state in use counter */ |
| 326 | uint32_t nm_stategenid; /* state generation counter */ |
| 327 | time_t nm_recover_start; /* recover start time */ |
| 328 | LIST_HEAD(, nfsnode) nm_monlist; /* list of nodes being monitored */ |
| 329 | /* async I/O queue */ |
| 330 | struct nfs_reqqhead nm_resendq; /* async I/O resend queue */ |
| 331 | struct nfs_reqqhead nm_iodq; /* async I/O request queue */ |
| 332 | struct nfsiod *nm_niod; /* nfsiod processing this mount */ |
| 333 | TAILQ_ENTRY(nfsmount) nm_iodlink; /* chain of mounts awaiting nfsiod */ |
| 334 | int nm_asyncwrites; /* outstanding async I/O writes */ |
| 335 | /* socket state */ |
| 336 | uint8_t nm_sofamily; /* (preferred) protocol family of socket */ |
| 337 | uint8_t nm_sotype; /* (preferred) type of socket */ |
| 338 | in_port_t nm_nfsport; /* NFS protocol port */ |
| 339 | in_port_t nm_mountport; /* MOUNT protocol port (v2/v3) */ |
| 340 | struct nfs_socket_search *nm_nss; /* current socket search structure */ |
| 341 | struct nfs_socket *nm_nso; /* current socket */ |
| 342 | struct sockaddr *nm_saddr; /* Address of server */ |
| 343 | u_short nm_sockflags; /* socket state flags */ |
| 344 | time_t nm_deadto_start; /* dead timeout start time */ |
| 345 | time_t nm_reconnect_start; /* reconnect start time */ |
| 346 | int nm_tprintf_initial_delay; /* delay first "server down" */ |
| 347 | int nm_tprintf_delay; /* delay between "server down" */ |
| 348 | int nm_deadtimeout; /* delay between first "server down" and dead set at mount time */ |
| 349 | int nm_curdeadtimeout; /* current dead timeout. Adjusted by mount state and mobility */ |
| 350 | int nm_srtt[4]; /* Timers for RPCs */ |
| 351 | int nm_sdrtt[4]; |
| 352 | int nm_timeouts; /* Request timeouts */ |
| 353 | int nm_jbreqs; /* # R_JBTPRINTFMSG requests */ |
| 354 | int nm_mounterror; /* status of mount connect */ |
| 355 | TAILQ_ENTRY(nfsmount) nm_pokeq; /* mount poke queue chain */ |
| 356 | thread_t nm_sockthd; /* socket thread for this mount */ |
| 357 | }; |
| 358 | |
| 359 | /* macro for checking current mount flags */ |
| 360 | #define NMFLAG(NMP, F) NFS_BITMAP_ISSET((NMP)->nm_flags, NFS_MFLAG_ ## F) |
| 361 | /* macros for checking (original) mount attributes/flags */ |
| 362 | #define NM_OMATTR_GIVEN(NMP, F) NFS_BITMAP_ISSET((NMP)->nm_mattrs, NFS_MATTR_ ## F) |
| 363 | #define NM_OMFLAG_GIVEN(NMP, F) NFS_BITMAP_ISSET((NMP)->nm_mflags_mask, NFS_MFLAG_ ## F) |
| 364 | #define NM_OMFLAG(NMP, F) NFS_BITMAP_ISSET((NMP)->nm_mflags, NFS_MFLAG_ ## F) |
| 365 | |
| 366 | /* |
| 367 | * NFS mount state flags (nm_state) |
| 368 | */ |
| 369 | #define NFSSTA_MOUNT_THREAD 0x00000040 /* nfs_mount_connect_thread running */ |
| 370 | #define NFSSTA_MONITOR_SCAN 0x00000080 /* scan of monitored nodes in progress */ |
| 371 | #define NFSSTA_UNMOUNTING 0x00000100 /* an unmount attempt is in progress */ |
| 372 | #define NFSSTA_NEEDSECINFO 0x00000200 /* need to fetch security info */ |
| 373 | #define NFSSTA_CLIENTID 0x00000400 /* short client ID is valid */ |
| 374 | #define NFSSTA_BIGCOOKIES 0x00000800 /* have seen >32bit dir cookies */ |
| 375 | #define NFSSTA_JUKEBOXTIMEO 0x00001000 /* experienced a jukebox timeout */ |
| 376 | #define NFSSTA_LOCKTIMEO 0x00002000 /* experienced a lock req timeout */ |
| 377 | #define NFSSTA_MOUNTED 0x00004000 /* completely mounted */ |
| 378 | #define NFSSTA_LOCKSWORK 0x00008000 /* lock ops have worked. */ |
| 379 | #define NFSSTA_TIMEO 0x00010000 /* experienced a timeout. */ |
| 380 | #define NFSSTA_FORCE 0x00020000 /* doing a forced unmount. */ |
| 381 | #define NFSSTA_HASWRITEVERF 0x00040000 /* Has write verifier for V3 */ |
| 382 | #define NFSSTA_GOTPATHCONF 0x00080000 /* Got the V3 pathconf info */ |
| 383 | #define NFSSTA_GOTFSINFO 0x00100000 /* Got the V3 fsinfo */ |
| 384 | #define NFSSTA_WANTRQUOTA 0x00200000 /* Want rquota address */ |
| 385 | #define NFSSTA_RQUOTAINPROG 0x00400000 /* Getting rquota address */ |
| 386 | #define NFSSTA_SENDING 0x00800000 /* Sending on socket */ |
| 387 | #define NFSSTA_SNDLOCK 0x01000000 /* Send socket lock */ |
| 388 | #define NFSSTA_WANTSND 0x02000000 /* Want above */ |
| 389 | #define NFSSTA_DEAD 0x04000000 /* mount is dead */ |
| 390 | #define NFSSTA_RECOVER 0x08000000 /* mount state needs to be recovered */ |
| 391 | #define NFSSTA_RECOVER_EXPIRED 0x10000000 /* mount state expired */ |
| 392 | #define NFSSTA_REVOKE 0x20000000 /* need to scan for revoked nodes */ |
| 393 | #define NFSSTA_SQUISHY 0x40000000 /* we can ask to be forcibly unmounted */ |
| 394 | #define NFSSTA_MOUNT_DRAIN 0x80000000 /* mount is draining references */ |
| 395 | |
| 396 | /* flags for nm_sockflags */ |
| 397 | #define NMSOCK_READY 0x0001 /* socket is ready for use */ |
| 398 | #define NMSOCK_CONNECTING 0x0002 /* socket is being connect()ed */ |
| 399 | #define NMSOCK_SETUP 0x0004 /* socket/connection is being set up */ |
| 400 | #define NMSOCK_UNMOUNT 0x0008 /* unmounted, no more socket activity */ |
| 401 | #define NMSOCK_HASCONNECTED 0x0010 /* socket has connected before */ |
| 402 | #define NMSOCK_POKE 0x0020 /* socket needs to be poked */ |
| 403 | #define NMSOCK_DISCONNECTING 0x0080 /* socket is being disconnected */ |
| 404 | |
| 405 | /* aliases for version-specific fields */ |
| 406 | #define nm_ldlink nm_un.v3.ldlink |
| 407 | #define nm_sent nm_un.v3.udp_sent |
| 408 | #define nm_cwnd nm_un.v3.udp_cwnd |
| 409 | #define nm_cwndq nm_un.v3.udp_cwndq |
| 410 | #define nm_rqproto nm_un.v3.rqproto |
| 411 | #define nm_rqsaddr nm_un.v3.rqsaddr |
| 412 | #define nm_rqsaddrstamp nm_un.v3.rqsaddrstamp |
| 413 | #define nm_longid nm_un.v4.longid |
| 414 | #define nm_clientid nm_un.v4.clientid |
| 415 | #define nm_mounttime nm_un.v4.mounttime |
| 416 | #define nm_fsid nm_un.v4.fsid |
| 417 | #define nm_renew_timer nm_un.v4.renew_timer |
| 418 | #define nm_cbid nm_un.v4.cbid |
| 419 | #define nm_cblink nm_un.v4.cblink |
| 420 | #define nm_cbrefs nm_un.v4.cbrefs |
| 421 | #define nm_delegations nm_un.v4.delegations |
| 422 | #define nm_dreturnq nm_un.v4.dreturnq |
| 423 | |
| 424 | #if defined(KERNEL) |
| 425 | /* |
| 426 | * Macros to convert from various things to mount structures. |
| 427 | */ |
| 428 | #define VFSTONFS(mp) ((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL) |
| 429 | #define VTONMP(vp) VFSTONFS(vnode_mount(vp)) |
| 430 | #define NFSTONMP(np) VTONMP(NFSTOV(np)) |
| 431 | #define NFSTOMP(np) (vnode_mount(NFSTOV(np))) |
| 432 | |
| 433 | #endif /* KERNEL */ |
| 434 | |
| 435 | #endif /* __APPLE_API_PRIVATE */ |
| 436 | #endif /* _NFS_NFSMOUNT_H_ */ |
| 437 | |