Loading...
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
/*
 * Copyright (c) 2000-2015 Apple Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 * 
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
/*
 * Copyright (c) 1989, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Rick Macklem at The University of Guelph.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)nfsmount.h	8.3 (Berkeley) 3/30/95
 * FreeBSD-Id: nfsmount.h,v 1.13 1997/08/16 19:16:05 wollman Exp $
 */


#ifndef _NFS_NFSMOUNT_H_
#define _NFS_NFSMOUNT_H_

#include <sys/appleapiopts.h>

#ifdef __APPLE_API_PRIVATE

/*
 * NFS mount file system attributes
 */
struct nfs_fsattr {
	uint32_t	nfsa_flags;		/* file system flags */
	uint32_t	nfsa_lease;		/* lease time in seconds */
	uint32_t	nfsa_maxname;		/* maximum filename size */
	uint32_t	nfsa_maxlink;		/* maximum # links */
	uint32_t	nfsa_bsize;		/* block size */
	uint32_t	nfsa_pad;		/* UNUSED */
	uint64_t	nfsa_maxfilesize;	/* maximum file size */
	uint64_t	nfsa_maxread;		/* maximum read size */
	uint64_t	nfsa_maxwrite;		/* maximum write size */
	uint64_t	nfsa_files_avail;	/* file slots available */
	uint64_t	nfsa_files_free;	/* file slots free */
	uint64_t	nfsa_files_total;	/* file slots total */
	uint64_t	nfsa_space_avail;	/* disk space available */
	uint64_t	nfsa_space_free;	/* disk space free */
	uint64_t	nfsa_space_total;	/* disk space total */
	uint32_t	nfsa_supp_attr[NFS_ATTR_BITMAP_LEN]; /* attributes supported on this file system */
	uint32_t	nfsa_bitmap[NFS_ATTR_BITMAP_LEN]; /* valid attributes */
};
#define NFS_FSFLAG_LINK			0x00000001
#define NFS_FSFLAG_SYMLINK		0x00000002
#define NFS_FSFLAG_UNIQUE_FH		0x00000004
#define NFS_FSFLAG_ACL			0x00000008
#define NFS_FSFLAG_SET_TIME		0x00000010
#define NFS_FSFLAG_CASE_INSENSITIVE	0x00000020
#define NFS_FSFLAG_CASE_PRESERVING	0x00000040
#define NFS_FSFLAG_CHOWN_RESTRICTED	0x00000080
#define NFS_FSFLAG_HOMOGENEOUS		0x00000100
#define NFS_FSFLAG_NO_TRUNC		0x00000200
#define NFS_FSFLAG_NAMED_ATTR		0x00000400
#define NFS_FSFLAG_FHTYPE_MASK		0xFF000000
#define NFS_FSFLAG_FHTYPE_SHIFT		24

/*
 * NFS file system location structures
 */
struct nfs_fs_server {
	char *			ns_name;		/* name of server */
	char **			ns_addresses;		/* array of addresses for server */
	uint32_t		ns_addrcount;		/* # of addresses */
};
struct nfs_fs_path {
	char **			np_components;		/* array of component pointers */
	uint32_t		np_compcount;		/* # components in path */
};
struct nfs_fs_location {
	struct nfs_fs_server **	nl_servers;		/* array of server pointers */
	struct nfs_fs_path	nl_path;		/* file system path */
	uint32_t		nl_servcount;		/* # of servers */
};

struct nfs_location_index {
	uint8_t 		nli_flags;		/* misc flags */
	uint8_t 		nli_loc;		/* location index */
	uint8_t 		nli_serv;		/* server index */
	uint8_t 		nli_addr;		/* address index */
};
#define NLI_VALID	0x01	/* index is valid */

struct nfs_fs_locations {
	struct nfs_fs_path	nl_root;		/* current server's root file system path */
	uint32_t		nl_numlocs;		/* # of locations */
	struct nfs_location_index nl_current;		/* index of current location/server/address */
	struct nfs_fs_location **nl_locations;		/* array of fs locations */
};

/*
 * RPC record marker parsing state
 */
struct nfs_rpc_record_state {
	mbuf_t			nrrs_m;			/* mbufs for current record */
	mbuf_t			nrrs_mlast;
	uint16_t		nrrs_lastfrag;		/* last fragment of record */
	uint16_t		nrrs_markerleft;	/* marker bytes remaining */
	uint32_t		nrrs_fragleft;		/* fragment bytes remaining */
	uint32_t		nrrs_reclen;		/* length of RPC record */
};

/*
 * NFS socket structures
 */
struct nfs_socket {
	lck_mtx_t		nso_lock;		/* nfs socket lock */
	TAILQ_ENTRY(nfs_socket)	nso_link;		/* list of sockets */
	struct sockaddr *	nso_saddr;		/* socket address */
	struct sockaddr *	nso_saddr2;		/* additional socket address */
	void *			nso_wake;		/* address to wake up */
	time_t			nso_timestamp;
	time_t			nso_reqtimestamp;	/* last request sent */
	socket_t		nso_so;			/* socket */
	uint8_t			nso_sotype;		/* Type of socket */
	uint16_t		nso_flags;		/* NSO_* flags */
	struct nfs_location_index nso_location;		/* location index */
	uint32_t		nso_protocol;		/* RPC protocol */
	uint32_t		nso_version;		/* RPC protocol version */
	uint32_t		nso_pingxid;		/* RPC XID of NULL ping request */
	uint32_t		nso_nfs_min_vers;	/* minimum nfs version for connecting sockets */
	uint32_t		nso_nfs_max_vers;	/* maximum nfs version for connecting sockets */
	int			nso_error;		/* saved error/status */
	struct nfs_rpc_record_state nso_rrs;		/* RPC record parsing state (TCP) */
};
TAILQ_HEAD(nfssocketlist, nfs_socket);
/* nso_flags */
#define NSO_UPCALL		0x0001			/* socket upcall in progress */
#define NSO_DEAD		0x0002			/* socket is dead */
#define NSO_CONNECTING		0x0004			/* socket is being connected */
#define NSO_CONNECTED		0x0008			/* socket connection complete */
#define NSO_PINGING		0x0010			/* socket is being tested */
#define NSO_VERIFIED		0x0020			/* socket appears functional */
#define NSO_DISCONNECTING	0x0040			/* socket is being disconnected */

/* NFS connect socket search state */
struct nfs_socket_search {
	struct nfs_location_index nss_startloc;		/* starting location index */
	struct nfs_location_index nss_nextloc;		/* next location index */
	struct nfssocketlist	nss_socklist;		/* list of active sockets */
	time_t			nss_timestamp;		/* search start time */
	time_t			nss_last;		/* timestamp of last socket */
	struct nfs_socket *	nss_sock;		/* found socket */
	uint8_t			nss_sotype;		/* TCP/UDP */
	uint8_t			nss_sockcnt;		/* # of active sockets */
	in_port_t		nss_port;		/* port # to connect to */
	uint32_t		nss_protocol;		/* RPC protocol */
	uint32_t		nss_version;		/* RPC protocol version */
	uint32_t		nss_flags;		/* (see below) */
	int			nss_addrcnt;		/* Number addresses to try or left */
	int			nss_timeo;		/* how long we are willing to wait */
	int			nss_error;		/* best error we've gotten so far */
};
/* nss_flags */
#define NSS_VERBOSE		0x00000001		/* OK to log info about socket search */
#define NSS_WARNED		0x00000002		/* logged warning about socket search taking a while */
#define NSS_FALLBACK2PMAP	0x00000004		/* Try V4 on NFS_PORT first, if that fails fall back to portmapper */

/*
 * function table for calling version-specific NFS functions
 */
struct nfs_funcs {
	int	(*nf_mount)(struct nfsmount *, vfs_context_t, nfsnode_t *);
	int	(*nf_update_statfs)(struct nfsmount *, vfs_context_t);
	int	(*nf_getquota)(struct nfsmount *, vfs_context_t, uid_t, int, struct dqblk *);
	int	(*nf_access_rpc)(nfsnode_t, u_int32_t *, int, vfs_context_t);
	int	(*nf_getattr_rpc)(nfsnode_t, mount_t, u_char *, size_t, int, vfs_context_t, struct nfs_vattr *, u_int64_t *);
	int	(*nf_setattr_rpc)(nfsnode_t, struct vnode_attr *, vfs_context_t);
	int	(*nf_read_rpc_async)(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **);
	int	(*nf_read_rpc_async_finish)(nfsnode_t, struct nfsreq *, uio_t, size_t *, int *);
	int	(*nf_readlink_rpc)(nfsnode_t, char *, uint32_t *, vfs_context_t);
	int	(*nf_write_rpc_async)(nfsnode_t, uio_t, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **);
	int	(*nf_write_rpc_async_finish)(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *);
	int	(*nf_commit_rpc)(nfsnode_t, uint64_t, uint64_t, kauth_cred_t, uint64_t);
	int	(*nf_lookup_rpc_async)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **);
	int	(*nf_lookup_rpc_async_finish)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *);
	int	(*nf_remove_rpc)(nfsnode_t, char *, int, thread_t, kauth_cred_t);
	int	(*nf_rename_rpc)(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t);
	int	(*nf_setlock_rpc)(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t);
	int	(*nf_unlock_rpc)(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, thread_t, kauth_cred_t);
	int	(*nf_getlock_rpc)(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t);
};

/*
 * The long form of the NFSv4 client ID.
 */
struct nfs_client_id {
	TAILQ_ENTRY(nfs_client_id)	nci_link;	/* list of client IDs */
	char				*nci_id;	/* client id buffer */
	int				nci_idlen;	/* length of client id buffer */
};
TAILQ_HEAD(nfsclientidlist, nfs_client_id);
extern struct nfsclientidlist nfsclientids;

/*
 * Mount structure.
 * One allocated on every NFS mount.
 * Holds NFS specific information for mount.
 */
struct nfsmount {
	lck_mtx_t nm_lock;		/* nfs mount lock */
	char *	nm_args;		/* NFS mount args (XDR) */
	uint32_t nm_mattrs[NFS_MATTR_BITMAP_LEN]; /* mount attributes in mount args */
	uint32_t nm_mflags_mask[NFS_MFLAG_BITMAP_LEN]; /* mount flags mask in mount args */
	uint32_t nm_mflags[NFS_MFLAG_BITMAP_LEN]; /* mount flags in mount args */
	uint32_t nm_flags[NFS_MFLAG_BITMAP_LEN]; /* current mount flags (soft, intr, etc...) */
	char *  nm_realm;		/* Kerberos realm to use */
	char *  nm_principal;		/* GSS principal to use on initial mount */
	char *	nm_sprinc;		/* Kerberos principal of the server */
	int	nm_ref;			/* Reference count on this mount */
	int	nm_state;		/* Internal state flags */
	int	nm_vers;		/* NFS version */
	uint32_t nm_minor_vers;		/* minor version of above */
	uint32_t nm_min_vers;		/* minimum packed version to try */
	uint32_t nm_max_vers;		/* maximum packed version to try */
	struct nfs_funcs *nm_funcs;	/* version-specific functions */
	kauth_cred_t nm_mcred;		/* credential used for the mount */
	mount_t	nm_mountp;		/* VFS structure for this filesystem */
	nfsnode_t nm_dnp;		/* root directory nfsnode pointer */
	struct nfs_fs_locations nm_locations; /* file system locations */
	uint32_t nm_numgrps;		/* Max. size of groupslist */
	TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gsscl;	/* GSS user contexts */
	uint32_t nm_ncentries;		/* GSS expired negative cache entries */
	int	nm_timeo;		/* Init timer for NFSMNT_DUMBTIMR */
	int	nm_retry;		/* Max retries */
	uint32_t nm_rsize;		/* Max size of read rpc */
	uint32_t nm_wsize;		/* Max size of write rpc */
	uint32_t nm_biosize;		/* buffer I/O size */
	uint32_t nm_readdirsize;	/* Size of a readdir rpc */
	uint32_t nm_readahead;		/* Num. of blocks to readahead */
	uint32_t nm_acregmin;		/* reg file min attr cache timeout */
	uint32_t nm_acregmax;		/* reg file max attr cache timeout */
	uint32_t nm_acdirmin;		/* dir min attr cache timeout */
	uint32_t nm_acdirmax;		/* dir max attr cache timeout */
	uint32_t nm_auth;		/* security mechanism flavor being used */
	uint32_t nm_writers;		/* Number of nodes open for writing */
	uint32_t nm_mappers;		/* Number of nodes that have mmapped */
	struct nfs_sec nm_sec;		/* acceptable security mechanism flavors */
	struct nfs_sec nm_servsec;	/* server's acceptable security mechanism flavors */
	fhandle_t *nm_fh;		/* initial file handle */
	uint8_t  nm_lockmode;		/* advisory file locking mode */
	/* mount info */
	uint32_t nm_fsattrstamp;	/* timestamp for fs attrs */
	struct nfs_fsattr nm_fsattr;	/* file system attributes */
	uint64_t nm_verf;		/* v3/v4 write verifier */
	union {
	    struct {			/* v2/v3 specific fields */
		TAILQ_ENTRY(nfsmount) ldlink; /* chain of mounts registered for lockd use */
		int udp_sent;		/* UDP request send count */
		int udp_cwnd;		/* UDP request congestion window */
		struct nfs_reqqhead udp_cwndq; /* requests waiting on cwnd */
		struct sockaddr *rqsaddr;/* cached rquota socket address */
		uint32_t rqsaddrstamp;	/* timestamp of rquota socket address */
	    } v3;
	    struct {			/* v4 specific fields */
		struct nfs_client_id *longid; /* client ID, long form */
		uint64_t mounttime;	/* used as client ID verifier */
		uint64_t clientid;	/* client ID, short form */
		thread_call_t renew_timer; /* RENEW timer call */
		nfs_fsid fsid;		/* NFS file system id */
		TAILQ_HEAD(, nfsnode) delegations; /* list of nodes with delegations */
		TAILQ_HEAD(, nfsnode) dreturnq; /* list of nodes with delegations to return */
		TAILQ_ENTRY(nfsmount) cblink; /* chain of mounts registered for callbacks */
		uint32_t cbid;		/* callback channel identifier */
		uint32_t cbrefs;	/* # callbacks using this mount */
	    } v4;
	} nm_un;
	/* common state */
	TAILQ_HEAD(, nfs_open_owner) nm_open_owners; /* list of open owners */
	uint32_t nm_stateinuse;		/* state in use counter */
	uint32_t nm_stategenid;		/* state generation counter */
	time_t	nm_recover_start;	/* recover start time */
 	LIST_HEAD(, nfsnode) nm_monlist; /* list of nodes being monitored */
	/* async I/O queue */
	struct nfs_reqqhead nm_resendq;	/* async I/O resend queue */
	struct nfs_reqqhead nm_iodq;	/* async I/O request queue */
	struct nfsiod *nm_niod;		/* nfsiod processing this mount */
	TAILQ_ENTRY(nfsmount) nm_iodlink; /* chain of mounts awaiting nfsiod */
	int	nm_asyncwrites;		/* outstanding async I/O writes */
	/* socket state */
	uint8_t	nm_sofamily;		/* (preferred) protocol family of socket */
	uint8_t	nm_sotype;		/* (preferred) type of socket */
	in_port_t	nm_nfsport;	/* NFS protocol port */
	in_port_t	nm_mountport;	/* MOUNT protocol port (v2/v3) */
	struct nfs_socket_search *nm_nss; /* current socket search structure */
	struct nfs_socket *nm_nso;	/* current socket */
	struct sockaddr	*nm_saddr;	/* Address of server */
	u_short nm_sockflags;		/* socket state flags */
	time_t	nm_deadto_start;	/* dead timeout start time */
	time_t	nm_reconnect_start;	/* reconnect start time */
	int	nm_tprintf_initial_delay;	/* delay first "server down" */
	int	nm_tprintf_delay;	/* delay between "server down" */
	int	nm_deadtimeout;		/* delay between first "server down" and dead set at mount time */
	int	nm_curdeadtimeout;	/* current dead timeout. Adjusted by mount state and mobility */
	int	nm_srtt[4];		/* Timers for RPCs */
	int	nm_sdrtt[4];
	int	nm_timeouts;		/* Request timeouts */
	int	nm_jbreqs;		/* # R_JBTPRINTFMSG requests */
	int	nm_mounterror;		/* status of mount connect */
	TAILQ_ENTRY(nfsmount) nm_pokeq;	/* mount poke queue chain */
	thread_t nm_sockthd;		/* socket thread for this mount */
};

/* macro for checking current mount flags */
#define NMFLAG(NMP, F)		NFS_BITMAP_ISSET((NMP)->nm_flags, NFS_MFLAG_ ## F)
/* macros for checking (original) mount attributes/flags */
#define NM_OMATTR_GIVEN(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mattrs, NFS_MATTR_ ## F)
#define NM_OMFLAG_GIVEN(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mflags_mask, NFS_MFLAG_ ## F)
#define NM_OMFLAG(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mflags, NFS_MFLAG_ ## F)

/*
 * NFS mount state flags (nm_state)
 */
#define NFSSTA_MOUNT_THREAD	0x00000040  /* nfs_mount_connect_thread running */
#define NFSSTA_MONITOR_SCAN	0x00000080  /* scan of monitored nodes in progress */
#define NFSSTA_UNMOUNTING	0x00000100  /* an unmount attempt is in progress */
#define NFSSTA_NEEDSECINFO	0x00000200  /* need to fetch security info */
#define NFSSTA_CLIENTID		0x00000400  /* short client ID is valid */
#define NFSSTA_BIGCOOKIES	0x00000800  /* have seen >32bit dir cookies */
#define NFSSTA_JUKEBOXTIMEO	0x00001000  /* experienced a jukebox timeout */
#define NFSSTA_LOCKTIMEO	0x00002000  /* experienced a lock req timeout */
#define NFSSTA_MOUNTED		0x00004000  /* completely mounted */
#define NFSSTA_LOCKSWORK	0x00008000  /* lock ops have worked. */
#define NFSSTA_TIMEO		0x00010000  /* experienced a timeout. */
#define NFSSTA_FORCE		0x00020000  /* doing a forced unmount. */
#define NFSSTA_HASWRITEVERF	0x00040000  /* Has write verifier for V3 */
#define NFSSTA_GOTPATHCONF	0x00080000  /* Got the V3 pathconf info */
#define NFSSTA_GOTFSINFO	0x00100000  /* Got the V3 fsinfo */
#define NFSSTA_SENDING		0x00800000  /* Sending on socket */
#define NFSSTA_SNDLOCK		0x01000000  /* Send socket lock */
#define NFSSTA_WANTSND		0x02000000  /* Want above */
#define NFSSTA_DEAD		0x04000000  /* mount is dead */
#define NFSSTA_RECOVER		0x08000000  /* mount state needs to be recovered */
#define NFSSTA_RECOVER_EXPIRED	0x10000000  /* mount state expired */
#define NFSSTA_REVOKE		0x20000000  /* need to scan for revoked nodes */
#define	NFSSTA_SQUISHY		0x40000000  /* we can ask to be forcibly unmounted */
#define NFSSTA_MOUNT_DRAIN	0x80000000  /* mount is draining references */

/* flags for nm_sockflags */
#define NMSOCK_READY		0x0001	/* socket is ready for use */
#define NMSOCK_CONNECTING	0x0002	/* socket is being connect()ed */
#define NMSOCK_SETUP		0x0004	/* socket/connection is being set up */
#define NMSOCK_UNMOUNT		0x0008	/* unmounted, no more socket activity */
#define NMSOCK_HASCONNECTED	0x0010	/* socket has connected before */
#define NMSOCK_POKE		0x0020	/* socket needs to be poked */
#define NMSOCK_DISCONNECTING	0x0080	/* socket is being disconnected */

/* aliases for version-specific fields */
#define nm_ldlink	nm_un.v3.ldlink
#define nm_sent		nm_un.v3.udp_sent
#define nm_cwnd		nm_un.v3.udp_cwnd
#define nm_cwndq	nm_un.v3.udp_cwndq
#define nm_rqproto	nm_un.v3.rqproto
#define nm_rqsaddr	nm_un.v3.rqsaddr
#define nm_rqsaddrstamp	nm_un.v3.rqsaddrstamp
#define nm_longid	nm_un.v4.longid
#define nm_clientid	nm_un.v4.clientid
#define nm_mounttime	nm_un.v4.mounttime
#define nm_fsid		nm_un.v4.fsid
#define nm_renew_timer	nm_un.v4.renew_timer
#define nm_cbid		nm_un.v4.cbid
#define nm_cblink	nm_un.v4.cblink
#define nm_cbrefs	nm_un.v4.cbrefs
#define nm_delegations	nm_un.v4.delegations
#define nm_dreturnq	nm_un.v4.dreturnq

#if defined(KERNEL)
/*
 * Macros to convert from various things to mount structures.
 */
#define VFSTONFS(mp)	((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL)
#define VTONMP(vp)	VFSTONFS(vnode_mount(vp))
#define NFSTONMP(np)	VTONMP(NFSTOV(np))
#define NFSTOMP(np)	(vnode_mount(NFSTOV(np)))

#endif /* KERNEL */

#endif /* __APPLE_API_PRIVATE */
#endif /* _NFS_NFSMOUNT_H_ */