2 * Copyright (c) 2000-2007 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
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 * @(#)nfsmount.h 8.3 (Berkeley) 3/30/95
65 * FreeBSD-Id: nfsmount.h,v 1.13 1997/08/16 19:16:05 wollman Exp $
69 #ifndef _NFS_NFSMOUNT_H_
70 #define _NFS_NFSMOUNT_H_
72 #include <sys/appleapiopts.h>
74 #ifdef __APPLE_API_PRIVATE
77 * NFS mount file system attributes
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 */
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_FHTYPE_MASK 0xFF000000
109 #define NFS_FSFLAG_FHTYPE_SHIFT 24
112 * function table for calling version-specific NFS functions
115 int (*nf_mount
)(struct nfsmount
*, vfs_context_t
, struct user_nfs_args
*, nfsnode_t
*);
116 int (*nf_update_statfs
)(struct nfsmount
*, vfs_context_t
);
117 int (*nf_getquota
)(struct nfsmount
*, vfs_context_t
, u_long
, int, struct dqblk
*);
118 int (*nf_access_rpc
)(nfsnode_t
, u_long
*, vfs_context_t
);
119 int (*nf_getattr_rpc
)(nfsnode_t
, mount_t
, u_char
*, size_t, vfs_context_t
, struct nfs_vattr
*, u_int64_t
*);
120 int (*nf_setattr_rpc
)(nfsnode_t
, struct vnode_attr
*, vfs_context_t
, int);
121 int (*nf_read_rpc_async
)(nfsnode_t
, off_t
, size_t, thread_t
, kauth_cred_t
, struct nfsreq_cbinfo
*, struct nfsreq
**);
122 int (*nf_read_rpc_async_finish
)(nfsnode_t
, struct nfsreq
*, struct uio
*, size_t *, int *);
123 int (*nf_readlink_rpc
)(nfsnode_t
, char *, uint32_t *, vfs_context_t
);
124 int (*nf_write_rpc_async
)(nfsnode_t
, struct uio
*, size_t, thread_t
, kauth_cred_t
, int, struct nfsreq_cbinfo
*, struct nfsreq
**);
125 int (*nf_write_rpc_async_finish
)(nfsnode_t
, struct nfsreq
*, int *, size_t *, uint64_t *);
126 int (*nf_commit_rpc
)(nfsnode_t
, uint64_t, uint64_t, kauth_cred_t
);
127 int (*nf_lookup_rpc_async
)(nfsnode_t
, char *, int, vfs_context_t
, struct nfsreq
**);
128 int (*nf_lookup_rpc_async_finish
)(nfsnode_t
, vfs_context_t
, struct nfsreq
*, u_int64_t
*, fhandle_t
*, struct nfs_vattr
*);
129 int (*nf_remove_rpc
)(nfsnode_t
, char *, int, thread_t
, kauth_cred_t
);
130 int (*nf_rename_rpc
)(nfsnode_t
, char *, int, nfsnode_t
, char *, int, vfs_context_t
);
135 * One allocated on every NFS mount.
136 * Holds NFS specific information for mount.
139 lck_mtx_t nm_lock
; /* nfs mount lock */
140 int nm_flag
; /* Flags for soft/hard... */
141 int nm_state
; /* Internal state flags */
142 int nm_vers
; /* NFS version */
143 struct nfs_funcs
*nm_funcs
; /* version-specific functions */
144 mount_t nm_mountp
; /* VFS structure for this filesystem */
145 nfsnode_t nm_dnp
; /* root directory nfsnode pointer */
146 int nm_numgrps
; /* Max. size of groupslist */
147 TAILQ_HEAD(, nfs_gss_clnt_ctx
) nm_gsscl
; /* GSS user contexts */
148 int nm_timeo
; /* Init timer for NFSMNT_DUMBTIMR */
149 int nm_retry
; /* Max retries */
150 int nm_rsize
; /* Max size of read rpc */
151 int nm_wsize
; /* Max size of write rpc */
152 int nm_biosize
; /* buffer I/O size */
153 int nm_readdirsize
; /* Size of a readdir rpc */
154 int nm_readahead
; /* Num. of blocks to readahead */
155 int nm_acregmin
; /* reg file min attr cache timeout */
156 int nm_acregmax
; /* reg file max attr cache timeout */
157 int nm_acdirmin
; /* dir min attr cache timeout */
158 int nm_acdirmax
; /* dir max attr cache timeout */
159 uint32_t nm_auth
; /* security mechanism flavor */
161 uint32_t nm_fsattrstamp
; /* timestamp for fs attrs */
162 struct nfs_fsattr nm_fsattr
; /* file system attributes */
163 uint64_t nm_verf
; /* v3/v4 write verifier */
165 struct { /* v2/v3 specific fields */
166 u_short rqport
; /* cached rquota port */
167 uint32_t rqportstamp
; /* timestamp of rquota port */
169 struct { /* v4 specific fields */
170 uint64_t clientid
; /* client ID */
171 uint64_t mounttime
; /* mount verifier */
172 thread_call_t renew_timer
; /* RENEW timer call */
175 /* async I/O queue */
176 struct nfs_reqqhead nm_resendq
; /* async I/O resend queue */
177 struct nfs_reqqhead nm_iodq
; /* async I/O request queue */
178 struct nfsiod
*nm_niod
; /* nfsiod processing this mount */
179 TAILQ_ENTRY(nfsmount
) nm_iodlink
; /* chain of mounts awaiting nfsiod */
180 int nm_asyncwrites
; /* outstanding async I/O writes */
182 int nm_sotype
; /* Type of socket */
183 int nm_soproto
; /* and protocol */
184 mbuf_t nm_nam
; /* Address of server */
185 u_short nm_sockflags
; /* socket state flags */
186 socket_t nm_so
; /* RPC socket */
187 int nm_reconnect_start
; /* reconnect start time */
188 int nm_tprintf_initial_delay
; /* delay first "server down" */
189 int nm_tprintf_delay
; /* delay between "server down" */
190 int nm_srtt
[4]; /* Timers for RPCs */
192 int nm_timeouts
; /* Request timeouts */
195 int sent
; /* Request send count */
196 int cwnd
; /* Request congestion window */
197 struct nfs_reqqhead cwndq
; /* requests waiting on cwnd */
200 u_int32_t mleft
;/* marker bytes remaining */
201 u_int32_t fleft
;/* fragment bytes remaining */
202 u_int32_t len
; /* length of RPC record */
203 mbuf_t m
; /* mbufs for current record */
207 TAILQ_ENTRY(nfsmount
) nm_pokeq
; /* mount poke queue chain */
208 thread_t nm_sockthd
; /* socket thread for this mount */
212 * NFS mount state flags (nm_state)
214 #define NFSSTA_JUKEBOXTIMEO 0x00001000 /* experienced a jukebox timeout */
215 #define NFSSTA_LOCKTIMEO 0x00002000 /* experienced a lock req timeout */
216 #define NFSSTA_MOUNTED 0x00004000 /* completely mounted */
217 #define NFSSTA_LOCKSWORK 0x00008000 /* lock ops have worked. */
218 #define NFSSTA_TIMEO 0x00010000 /* experienced a timeout. */
219 #define NFSSTA_FORCE 0x00020000 /* doing a forced unmount. */
220 #define NFSSTA_HASWRITEVERF 0x00040000 /* Has write verifier for V3 */
221 #define NFSSTA_GOTPATHCONF 0x00080000 /* Got the V3 pathconf info */
222 #define NFSSTA_GOTFSINFO 0x00100000 /* Got the V3 fsinfo */
223 #define NFSSTA_SNDLOCK 0x01000000 /* Send socket lock */
224 #define NFSSTA_WANTSND 0x02000000 /* Want above */
226 /* flags for nm_sockflags */
227 #define NMSOCK_READY 0x0001 /* socket is ready for use */
228 #define NMSOCK_CONNECTING 0x0002 /* socket is being connect()ed */
229 #define NMSOCK_SETUP 0x0004 /* socket/connection is being set up */
230 #define NMSOCK_UNMOUNT 0x0008 /* unmounted, no more socket activity */
231 #define NMSOCK_LASTFRAG 0x0010 /* on last fragment of RPC record */
232 #define NMSOCK_POKE 0x0020 /* socket needs to be poked */
233 #define NMSOCK_UPCALL 0x0040 /* socket upcall in progress */
235 /* aliases for socket state variables */
236 #define nm_sent nm_sockstate.udp.sent
237 #define nm_cwnd nm_sockstate.udp.cwnd
238 #define nm_cwndq nm_sockstate.udp.cwndq
239 #define nm_markerleft nm_sockstate.tcp.mleft
240 #define nm_fragleft nm_sockstate.tcp.fleft
241 #define nm_reclen nm_sockstate.tcp.len
242 #define nm_m nm_sockstate.tcp.m
243 #define nm_mlast nm_sockstate.tcp.mlast
245 /* aliases for version-specific fields */
246 #define nm_rqport nm_un.v3.rqport
247 #define nm_rqportstamp nm_un.v3.rqportstamp
248 #define nm_clientid nm_un.v4.clientid
249 #define nm_mounttime nm_un.v4.mounttime
250 #define nm_renew_timer nm_un.v4.renew_timer
254 * Macros to convert from various things to mount structures.
256 #define VFSTONFS(mp) ((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL)
257 #define VTONMP(vp) VFSTONFS(vnode_mount(vp))
258 #define NFSTONMP(np) VTONMP(NFSTOV(np))
259 #define NFSTOMP(np) (vnode_mount(NFSTOV(np)))
263 #endif /* __APPLE_API_PRIVATE */
264 #endif /* _NFS_NFSMOUNT_H_ */