nfs.h revision 1.17
1/*	$OpenBSD: nfs.h,v 1.17 2002/02/10 22:02:05 nate Exp $	*/
2/*	$NetBSD: nfs.h,v 1.10.4.1 1996/05/27 11:23:56 fvdl Exp $	*/
3
4/*
5 * Copyright (c) 1989, 1993, 1995
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Rick Macklem at The University of Guelph.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgement:
21 *	This product includes software developed by the University of
22 *	California, Berkeley and its contributors.
23 * 4. Neither the name of the University nor the names of its contributors
24 *    may be used to endorse or promote products derived from this software
25 *    without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 *
39 *	@(#)nfs.h	8.4 (Berkeley) 5/1/95
40 */
41
42#ifndef _NFS_NFS_H_
43#define _NFS_NFS_H_
44
45/*
46 * Tunable constants for nfs
47 */
48
49#define	NFS_MAXIOVEC	34
50#define NFS_TICKINTVL	5		/* Desired time for a tick (msec) */
51#define NFS_HZ		(hz / nfs_ticks) /* Ticks/sec */
52#define	NFS_TIMEO	(1 * NFS_HZ)	/* Default timeout = 1 second */
53#define	NFS_MINTIMEO	(1 * NFS_HZ)	/* Min timeout to use */
54#define	NFS_MAXTIMEO	(60 * NFS_HZ)	/* Max timeout to backoff to */
55#define	NFS_MINIDEMTIMEO (5 * NFS_HZ)	/* Min timeout for non-idempotent ops*/
56#define	NFS_MAXREXMIT	100		/* Stop counting after this many */
57#define	NFS_MAXWINDOW	1024		/* Max number of outstanding requests */
58#define	NFS_RETRANS	10		/* Num of retrans for soft mounts */
59#define	NFS_MAXGRPS	16		/* Max. size of groups list */
60#ifndef NFS_MINATTRTIMO
61#define	NFS_MINATTRTIMO 5		/* Attribute cache timeout in sec */
62#endif
63#ifndef NFS_MAXATTRTIMO
64#define	NFS_MAXATTRTIMO 60
65#endif
66#define	NFS_WSIZE	8192		/* Def. write data size <= 8192 */
67#define	NFS_RSIZE	8192		/* Def. read data size <= 8192 */
68#define NFS_READDIRSIZE	8192		/* Def. readdir size */
69#define	NFS_DEFRAHEAD	1		/* Def. read ahead # blocks */
70#define	NFS_MAXRAHEAD	4		/* Max. read ahead # blocks */
71#define	NFS_MAXUIDHASH	64		/* Max. # of hashed uid entries/mp */
72#define	NFS_MAXASYNCDAEMON 	20	/* Max. number async_daemons runable */
73#define NFS_MAXGATHERDELAY	100	/* Max. write gather delay (msec) */
74#ifndef NFS_GATHERDELAY
75#define NFS_GATHERDELAY		10	/* Default write gather delay (msec) */
76#endif
77/*
78 * Ideally, NFS_DIRBLKSIZ should be bigger, but I've seen servers with
79 * broken NFS/ethernet drivers that won't work with anything bigger (Linux..)
80 */
81#define	NFS_DIRBLKSIZ	1024		/* Must be a multiple of DIRBLKSIZ */
82#define NFS_READDIRBLKSIZ	512	/* Size of read dir blocks. XXX */
83
84/*
85 * Oddballs
86 */
87#define	NMOD(a)		((a) % nfs_asyncdaemons)
88#define NFS_CMPFH(n, f, s) \
89	((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s)))
90#define NFS_ISV3(v)	(VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3)
91#define NFS_SRVMAXDATA(n) \
92		(((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
93		 NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
94
95/*
96 * sys/malloc.h needs M_NFSDIROFF, M_NFSRVDESC and M_NFSBIGFH added.
97 * The VA_EXCLUSIVE flag should be added for va_vaflags and set for an
98 * exclusive create.
99 */
100#ifndef M_NFSRVDESC
101#define M_NFSRVDESC	M_TEMP
102#endif
103#ifndef M_NFSDIROFF
104#define M_NFSDIROFF	M_TEMP
105#endif
106#ifndef M_NFSBIGFH
107#define M_NFSBIGFH	M_TEMP
108#endif
109#ifndef VA_EXCLUSIVE
110#define VA_EXCLUSIVE	0
111#endif
112
113/*
114 * The B_INVAFTERWRITE flag should be set to whatever is required by the
115 * buffer cache code to say "Invalidate the block after it is written back".
116 */
117#define	B_INVAFTERWRITE	B_INVAL
118
119/*
120 * The IO_METASYNC flag should be implemented for local file systems.
121 * (Until then, it is nothin at all.)
122 */
123#ifndef IO_METASYNC
124#define IO_METASYNC	0
125#endif
126
127/*
128 * Set the attribute timeout based on how recently the file has been modified.
129 */
130#if 0 /* replaced by nfs_attrtimeo() in nfs_subs.c */
131#define	NFS_ATTRTIMEO(np) \
132	((((np)->n_flag & NMODIFIED) || \
133	 (time.tv_sec - (np)->n_mtime) / 10 < NFS_MINATTRTIMO) ? NFS_MINATTRTIMO : \
134	 ((time.tv_sec - (np)->n_mtime) / 10 > NFS_MAXATTRTIMO ? NFS_MAXATTRTIMO : \
135	  (time.tv_sec - (np)->n_mtime) / 10))
136#endif
137
138/*
139 * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
140 * should ever try and use it.
141 */
142struct nfsd_args {
143	int	sock;		/* Socket to serve */
144	caddr_t	name;		/* Client addr for connection based sockets */
145	int	namelen;	/* Length of name */
146};
147
148struct nfsd_srvargs {
149	struct nfsd	*nsd_nfsd;	/* Pointer to in kernel nfsd struct */
150	uid_t		nsd_uid;	/* Effective uid mapped to cred */
151	u_int32_t	nsd_haddr;	/* Ip address of client */
152	struct ucred	nsd_cr;		/* Cred. uid maps to */
153	int		nsd_authlen;	/* Length of auth string (ret) */
154	u_char		*nsd_authstr;	/* Auth string (ret) */
155	int		nsd_verflen;	/* and the verfier */
156	u_char		*nsd_verfstr;
157	struct timeval	nsd_timestamp;	/* timestamp from verifier */
158	u_int32_t	nsd_ttl;	/* credential ttl (sec) */
159	NFSKERBKEY_T	nsd_key;	/* Session key */
160};
161
162struct nfsd_cargs {
163	char		*ncd_dirp;	/* Mount dir path */
164	uid_t		ncd_authuid;	/* Effective uid */
165	int		ncd_authtype;	/* Type of authenticator */
166	u_int		ncd_authlen;	/* Length of authenticator string */
167	u_char		*ncd_authstr;	/* Authenticator string */
168	u_int		ncd_verflen;	/* and the verifier */
169	u_char		*ncd_verfstr;
170	NFSKERBKEY_T	ncd_key;	/* Session key */
171};
172
173/*
174 * Stats structure
175 */
176struct nfsstats {
177	int	attrcache_hits;
178	int	attrcache_misses;
179	int	lookupcache_hits;
180	int	lookupcache_misses;
181	int	direofcache_hits;
182	int	direofcache_misses;
183	int	biocache_reads;
184	int	read_bios;
185	int	read_physios;
186	int	biocache_writes;
187	int	write_bios;
188	int	write_physios;
189	int	biocache_readlinks;
190	int	readlink_bios;
191	int	biocache_readdirs;
192	int	readdir_bios;
193	int	rpccnt[NFS_NPROCS];
194	int	rpcretries;
195	int	srvrpccnt[NFS_NPROCS];
196	int	srvrpc_errs;
197	int	srv_errs;
198	int	rpcrequests;
199	int	rpctimeouts;
200	int	rpcunexpected;
201	int	rpcinvalid;
202	int	srvcache_inproghits;
203	int	srvcache_idemdonehits;
204	int	srvcache_nonidemdonehits;
205	int	srvcache_misses;
206	int	srvnqnfs_leases;
207	int	srvnqnfs_maxleases;
208	int	srvnqnfs_getleases;
209	int	srvvop_writes;
210};
211
212/*
213 * Flags for nfssvc() system call.
214 */
215#define	NFSSVC_BIOD	0x002
216#define	NFSSVC_NFSD	0x004
217#define	NFSSVC_ADDSOCK	0x008
218#define	NFSSVC_AUTHIN	0x010
219#define	NFSSVC_GOTAUTH	0x040
220#define	NFSSVC_AUTHINFAIL 0x080
221#define	NFSSVC_MNTD	0x100
222
223/*
224 * fs.nfs sysctl(3) identifiers
225 */
226#define	NFS_NFSSTATS	1	/* struct: struct nfsstats */
227#define	NFS_NIOTHREADS	2	/* number of i/o threads */
228#define	NFS_MAXID	3
229
230#define FS_NFS_NAMES { \
231			{ 0, 0 }, \
232			{ "nfsstats", CTLTYPE_STRUCT }, \
233			{ "iothreads", CTLTYPE_INT } \
234}
235
236/*
237 * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts.
238 * What should be in this set is open to debate, but I believe that since
239 * I/O system calls on ufs are never interrupted by signals the set should
240 * be minimal. My reasoning is that many current programs that use signals
241 * such as SIGALRM will not expect file I/O system calls to be interrupted
242 * by them and break.
243 */
244#ifdef _KERNEL
245extern int nfs_niothreads;
246
247struct uio; struct buf; struct vattr; struct nameidata;	/* XXX */
248
249#define	NFSINT_SIGMASK	(sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
250			 sigmask(SIGHUP)|sigmask(SIGQUIT))
251
252/*
253 * Socket errors ignored for connectionless sockets??
254 * For now, ignore them all
255 */
256#define	NFSIGNORE_SOERROR(s, e) \
257		((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
258		((s) & PR_CONNREQUIRED) == 0)
259
260/*
261 * Nfs outstanding request list element
262 */
263struct nfsreq {
264	TAILQ_ENTRY(nfsreq) r_chain;
265	struct mbuf	*r_mreq;
266	struct mbuf	*r_mrep;
267	struct mbuf	*r_md;
268	caddr_t		r_dpos;
269	struct nfsmount *r_nmp;
270	struct vnode	*r_vp;
271	u_int32_t	r_xid;
272	int		r_flags;	/* flags on request, see below */
273	int		r_retry;	/* max retransmission count */
274	int		r_rexmit;	/* current retrans count */
275	int		r_timer;	/* tick counter on reply */
276	int		r_procnum;	/* NFS procedure number */
277	int		r_rtt;		/* RTT for rpc */
278	struct proc	*r_procp;	/* Proc that did I/O system call */
279};
280
281/*
282 * Queue head for nfsreq's
283 */
284TAILQ_HEAD(, nfsreq) nfs_reqq;
285
286/* Flag values for r_flags */
287#define R_TIMING	0x01		/* timing request (in mntp) */
288#define R_SENT		0x02		/* request has been sent */
289#define	R_SOFTTERM	0x04		/* soft mnt, too many retries */
290#define	R_INTR		0x08		/* intr mnt, signal pending */
291#define	R_SOCKERR	0x10		/* Fatal error on socket */
292#define	R_TPRINTFMSG	0x20		/* Did a tprintf msg. */
293#define	R_MUSTRESEND	0x40		/* Must resend request */
294#define	R_GETONEREP	0x80		/* Probe for one reply only */
295
296/*
297 * A list of nfssvc_sock structures is maintained with all the sockets
298 * that require service by the nfsd.
299 * The nfsuid structs hang off of the nfssvc_sock structs in both lru
300 * and uid hash lists.
301 */
302#ifndef NFS_UIDHASHSIZ
303#define	NFS_UIDHASHSIZ	29	/* Tune the size of nfssvc_sock with this */
304#endif
305#define	NUIDHASH(sock, uid) \
306	(&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ])
307#ifndef NFS_WDELAYHASHSIZ
308#define	NFS_WDELAYHASHSIZ 16	/* and with this */
309#endif
310#define	NWDELAYHASH(sock, f) \
311	(&(sock)->ns_wdelayhashtbl[(*((u_int32_t *)(f))) % NFS_WDELAYHASHSIZ])
312#ifndef NFS_MUIDHASHSIZ
313#define NFS_MUIDHASHSIZ	67	/* Tune the size of nfsmount with this */
314#endif
315#define	NMUIDHASH(nmp, uid) \
316	(&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
317#define	NFSNOHASH(fhsum) \
318	(&nfsnodehashtbl[(fhsum) & nfsnodehash])
319
320/*
321 * Network address hash list element
322 */
323union nethostaddr {
324	u_int32_t had_inetaddr;
325	struct mbuf *had_nam;
326};
327
328struct nfsuid {
329	TAILQ_ENTRY(nfsuid) nu_lru;	/* LRU chain */
330	LIST_ENTRY(nfsuid) nu_hash;	/* Hash list */
331	int		nu_flag;	/* Flags */
332	union nethostaddr nu_haddr;	/* Host addr. for dgram sockets */
333	struct ucred	nu_cr;		/* Cred uid mapped to */
334	int		nu_expire;	/* Expiry time (sec) */
335	struct timeval	nu_timestamp;	/* Kerb. timestamp */
336	u_int32_t	nu_nickname;	/* Nickname on server */
337	NFSKERBKEY_T	nu_key;		/* and session key */
338};
339
340#define	nu_inetaddr	nu_haddr.had_inetaddr
341#define	nu_nam		nu_haddr.had_nam
342/* Bits for nu_flag */
343#define	NU_INETADDR	0x1
344#define NU_NAM		0x2
345#define NU_NETFAM(u)	(((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO)
346
347struct nfssvc_sock {
348	TAILQ_ENTRY(nfssvc_sock) ns_chain;	/* List of all nfssvc_sock's */
349	TAILQ_HEAD(, nfsuid) ns_uidlruhead;
350	struct file	*ns_fp;
351	struct socket	*ns_so;
352	struct mbuf	*ns_nam;
353	struct mbuf	*ns_raw;
354	struct mbuf	*ns_rawend;
355	struct mbuf	*ns_rec;
356	struct mbuf	*ns_recend;
357	struct mbuf	*ns_frag;
358	int		ns_flag;
359	int		ns_solock;
360	int		ns_cc;
361	int		ns_reclen;
362	int		ns_numuids;
363	u_int32_t	ns_sref;
364	LIST_HEAD(, nfsrv_descript) ns_tq;	/* Write gather lists */
365	LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ];
366	LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
367};
368
369/* Bits for "ns_flag" */
370#define	SLP_VALID	0x01
371#define	SLP_DOREC	0x02
372#define	SLP_NEEDQ	0x04
373#define	SLP_DISCONN	0x08
374#define	SLP_GETSTREAM	0x10
375#define	SLP_LASTFRAG	0x20
376#define SLP_ALLFLAGS	0xff
377
378TAILQ_HEAD(, nfssvc_sock) nfssvc_sockhead;
379int nfssvc_sockhead_flag;
380#define	SLP_INIT	0x01
381#define	SLP_WANTINIT	0x02
382
383/*
384 * One of these structures is allocated for each nfsd.
385 */
386struct nfsd {
387	TAILQ_ENTRY(nfsd) nfsd_chain;	/* List of all nfsd's */
388	int		nfsd_flag;	/* NFSD_ flags */
389	struct nfssvc_sock *nfsd_slp;	/* Current socket */
390	int		nfsd_authlen;	/* Authenticator len */
391	u_char		nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
392	int		nfsd_verflen;	/* and the Verifier */
393	u_char		nfsd_verfstr[RPCVERF_MAXSIZ];
394	struct proc	*nfsd_procp;	/* Proc ptr */
395	struct nfsrv_descript *nfsd_nd;	/* Associated nfsrv_descript */
396};
397
398/* Bits for "nfsd_flag" */
399#define	NFSD_WAITING	0x01
400#define	NFSD_REQINPROG	0x02
401#define	NFSD_NEEDAUTH	0x04
402#define	NFSD_AUTHFAIL	0x08
403
404/*
405 * This structure is used by the server for describing each request.
406 * Some fields are used only when write request gathering is performed.
407 */
408struct nfsrv_descript {
409	u_quad_t		nd_time;	/* Write deadline (usec) */
410	off_t			nd_off;		/* Start byte offset */
411	off_t			nd_eoff;	/* and end byte offset */
412	LIST_ENTRY(nfsrv_descript) nd_hash;	/* Hash list */
413	LIST_ENTRY(nfsrv_descript) nd_tq;		/* and timer list */
414	LIST_HEAD(,nfsrv_descript) nd_coalesce;	/* coalesced writes */
415	struct mbuf		*nd_mrep;	/* Request mbuf list */
416	struct mbuf		*nd_md;		/* Current dissect mbuf */
417	struct mbuf		*nd_mreq;	/* Reply mbuf list */
418	struct mbuf		*nd_nam;	/* and socket addr */
419	struct mbuf		*nd_nam2;	/* return socket addr */
420	caddr_t			nd_dpos;	/* Current dissect pos */
421	unsigned int		nd_procnum;	/* RPC # */
422	int			nd_stable;	/* storage type */
423	int			nd_flag;	/* nd_flag */
424	int			nd_len;		/* Length of this write */
425	int			nd_repstat;	/* Reply status */
426	u_int32_t		nd_retxid;	/* Reply xid */
427	struct timeval		nd_starttime;	/* Time RPC initiated */
428	fhandle_t		nd_fh;		/* File handle */
429	struct ucred		nd_cr;		/* Credentials */
430};
431
432/* Bits for "nd_flag" */
433#define	ND_READ		LEASE_READ
434#define ND_WRITE	LEASE_WRITE
435#define ND_CHECK	0x04
436#define ND_LEASE	(ND_READ | ND_WRITE | ND_CHECK)
437#define ND_NFSV3	0x08
438#define ND_KERBNICK	0x20
439#define ND_KERBFULL	0x40
440#define ND_KERBAUTH	(ND_KERBNICK | ND_KERBFULL)
441
442TAILQ_HEAD(, nfsd) nfsd_head;
443int nfsd_head_flag;
444#define	NFSD_CHECKSLP	0x01
445
446/*
447 * These macros compare nfsrv_descript structures.
448 */
449#define NFSW_CONTIG(o, n) \
450		((o)->nd_eoff >= (n)->nd_off && \
451		 !bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, NFSX_V3FH))
452
453#define NFSW_SAMECRED(o, n) \
454	(((o)->nd_flag & ND_KERBAUTH) == ((n)->nd_flag & ND_KERBAUTH) && \
455 	 !bcmp((caddr_t)&(o)->nd_cr, (caddr_t)&(n)->nd_cr, \
456		sizeof (struct ucred)))
457
458#endif	/* _KERNEL */
459#endif /* _NFS_NFS_H */
460