| 1 | /*	$NetBSD: nfsmount.h,v 1.53 2015/07/15 03:28:55 manu Exp $	*/ | 
| 2 |  | 
| 3 | /* | 
| 4 |  * Copyright (c) 1989, 1993 | 
| 5 |  *	The Regents of the University of California.  All rights reserved. | 
| 6 |  * | 
| 7 |  * This code is derived from software contributed to Berkeley by | 
| 8 |  * Rick Macklem at The University of Guelph. | 
| 9 |  * | 
| 10 |  * Redistribution and use in source and binary forms, with or without | 
| 11 |  * modification, are permitted provided that the following conditions | 
| 12 |  * are met: | 
| 13 |  * 1. Redistributions of source code must retain the above copyright | 
| 14 |  *    notice, this list of conditions and the following disclaimer. | 
| 15 |  * 2. Redistributions in binary form must reproduce the above copyright | 
| 16 |  *    notice, this list of conditions and the following disclaimer in the | 
| 17 |  *    documentation and/or other materials provided with the distribution. | 
| 18 |  * 3. Neither the name of the University nor the names of its contributors | 
| 19 |  *    may be used to endorse or promote products derived from this software | 
| 20 |  *    without specific prior written permission. | 
| 21 |  * | 
| 22 |  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | 
| 23 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 24 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
| 25 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | 
| 26 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
| 27 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
| 28 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
| 29 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
| 30 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
| 31 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
| 32 |  * SUCH DAMAGE. | 
| 33 |  * | 
| 34 |  *	@(#)nfsmount.h	8.3 (Berkeley) 3/30/95 | 
| 35 |  */ | 
| 36 |  | 
| 37 |  | 
| 38 | #ifndef _NFS_NFSMOUNT_H_ | 
| 39 | #define _NFS_NFSMOUNT_H_ | 
| 40 |  | 
| 41 | #if defined(_KERNEL) && !defined(NFS_ARGS_ONLY) | 
| 42 | #include <sys/condvar.h> | 
| 43 | #include <sys/rwlock.h> | 
| 44 | #include <sys/mutex.h> | 
| 45 | #include <sys/disk.h> | 
| 46 | #endif | 
| 47 |  | 
| 48 | /* | 
| 49 |  * Arguments to mount NFS | 
| 50 |  */ | 
| 51 | #define NFS_ARGSVERSION	3		/* change when nfs_args changes */ | 
| 52 | struct nfs_args { | 
| 53 | 	int		version;	/* args structure version number */ | 
| 54 | 	struct sockaddr	*addr;		/* file server address */ | 
| 55 | 	int		addrlen;	/* length of address */ | 
| 56 | 	int		sotype;		/* Socket type */ | 
| 57 | 	int		proto;		/* and Protocol */ | 
| 58 | 	u_char		*fh;		/* File handle to be mounted */ | 
| 59 | 	int		fhsize;		/* Size, in bytes, of fh */ | 
| 60 | 	int		flags;		/* flags */ | 
| 61 | 	int		wsize;		/* write size in bytes */ | 
| 62 | 	int		rsize;		/* read size in bytes */ | 
| 63 | 	int		readdirsize;	/* readdir size in bytes */ | 
| 64 | 	int		timeo;		/* initial timeout in .1 secs */ | 
| 65 | 	int		retrans;	/* times to retry send */ | 
| 66 | 	int		maxgrouplist;	/* Max. size of group list */ | 
| 67 | 	int		readahead;	/* # of blocks to readahead */ | 
| 68 | 	int		leaseterm;	/* Ignored; Term (sec) of lease */ | 
| 69 | 	int		deadthresh;	/* Retrans threshold */ | 
| 70 | 	char		*hostname;	/* server's name */ | 
| 71 | }; | 
| 72 |  | 
| 73 | /* | 
| 74 |  * NFS mount option flags (nm_flag) | 
| 75 |  */ | 
| 76 | #define	NFSMNT_SOFT		0x00000001  /* soft mount (hard is default) */ | 
| 77 | #define	NFSMNT_WSIZE		0x00000002  /* set write size */ | 
| 78 | #define	NFSMNT_RSIZE		0x00000004  /* set read size */ | 
| 79 | #define	NFSMNT_TIMEO		0x00000008  /* set initial timeout */ | 
| 80 | #define	NFSMNT_RETRANS		0x00000010  /* set number of request retries */ | 
| 81 | #define	NFSMNT_MAXGRPS		0x00000020  /* set maximum grouplist size */ | 
| 82 | #define	NFSMNT_INT		0x00000040  /* allow interrupts on hard mount */ | 
| 83 | #define	NFSMNT_NOCONN		0x00000080  /* Don't Connect the socket */ | 
| 84 | #define	NFSMNT_NQNFS		0x00000100  /* Use Nqnfs protocol */ | 
| 85 | #define	NFSMNT_NFSV3		0x00000200  /* Use NFS Version 3 protocol */ | 
| 86 | #define	NFSMNT_KERB		0x00000400  /* Use Kerberos authentication */ | 
| 87 | #define	NFSMNT_DUMBTIMR		0x00000800  /* Don't estimate rtt dynamically */ | 
| 88 | #define	NFSMNT_LEASETERM	0x00001000  /* Ignored; lease term (nqnfs) */ | 
| 89 | #define	NFSMNT_READAHEAD	0x00002000  /* set read ahead */ | 
| 90 | #define	NFSMNT_DEADTHRESH	0x00004000  /* set dead server retry thresh */ | 
| 91 | #define	NFSMNT_RESVPORT		0x00008000  /* Allocate a reserved port */ | 
| 92 | #define	NFSMNT_RDIRPLUS		0x00010000  /* Use Readdirplus for V3 */ | 
| 93 | #define	NFSMNT_READDIRSIZE	0x00020000  /* Set readdir size */ | 
| 94 | #define NFSMNT_XLATECOOKIE	0x00040000  /* 32<->64 dir cookie xlation */ | 
| 95 | #define	NFSMNT_NOAC		0x00080000  /* Turn off attribute cache */ | 
| 96 |  | 
| 97 | #define NFSMNT_BITS	"\177\20" \ | 
| 98 |     "b\00soft\0b\01wsize\0b\02rsize\0b\03timeo\0" \ | 
| 99 |     "b\04retrans\0b\05maxgrps\0b\06intr\0b\07noconn\0" \ | 
| 100 |     "b\10nqnfs\0b\11nfsv3\0b\12kerb\0b\13dumbtimr\0" \ | 
| 101 |     "b\14leaseterm\0b\15readahead\0b\16deadthresh\0b\17resvport\0" \ | 
| 102 |     "b\20rdirplus\0b\21readdirsize\0b\22xlatecookie\0b\23noac\0" | 
| 103 |  | 
| 104 | /* | 
| 105 |  * NFS internal flags (nm_iflag) */ | 
| 106 |  | 
| 107 | #define NFSMNT_HASWRITEVERF	0x00000001  /* Has write verifier for V3 */ | 
| 108 | #define NFSMNT_GOTPATHCONF	0x00000002  /* Got the V3 pathconf info */ | 
| 109 | #define NFSMNT_GOTFSINFO	0x00000004  /* Got the V3 fsinfo */ | 
| 110 | #define	NFSMNT_MNTD		0x00000008  /* Mnt server for mnt point */ | 
| 111 | #define	NFSMNT_DISMNT		0x00000020  /* Dismounted */ | 
| 112 | #define	NFSMNT_SNDLOCK		0x00000040  /* Send socket lock */ | 
| 113 | #define	NFSMNT_WANTSND		0x00000080  /* Want above */ | 
| 114 | #define	NFSMNT_RCVLOCK		0x00000100  /* Rcv socket lock */ | 
| 115 | #define	NFSMNT_WANTRCV		0x00000200  /* Want above */ | 
| 116 | #define	NFSMNT_WAITAUTH		0x00000400  /* Wait for authentication */ | 
| 117 | #define	NFSMNT_HASAUTH		0x00000800  /* Has authenticator */ | 
| 118 | #define	NFSMNT_WANTAUTH		0x00001000  /* Wants an authenticator */ | 
| 119 | #define	NFSMNT_AUTHERR		0x00002000  /* Authentication error */ | 
| 120 | #define NFSMNT_SWAPCOOKIE	0x00004000  /* XDR encode dir cookies */ | 
| 121 | #define NFSMNT_STALEWRITEVERF	0x00008000  /* Write verifier is changing */ | 
| 122 | #define NFSMNT_WCCKLUDGE	0x00010000  /* see nfs_check_wccdata() */ | 
| 123 | #define NFSMNT_DISMNTFORCE	0x00020000  /* force unmount requested */ | 
| 124 |  | 
| 125 | #if defined(_KERNEL) && !defined(NFS_ARGS_ONLY) | 
| 126 | /* | 
| 127 |  * Mount structure. | 
| 128 |  * One allocated on every NFS mount. | 
| 129 |  * Holds NFS specific information for mount. | 
| 130 |  */ | 
| 131 | struct	nfsmount { | 
| 132 | 	kmutex_t nm_lock;		/* Lock for this structure */ | 
| 133 | 	kcondvar_t nm_rcvcv; | 
| 134 | 	kcondvar_t nm_sndcv; | 
| 135 | 	int	nm_flag;		/* Flags for soft/hard... */ | 
| 136 | 	struct	mount *nm_mountp;	/* Vfs structure for this filesystem */ | 
| 137 | 	int	nm_numgrps;		/* Max. size of groupslist */ | 
| 138 | 	struct	vnode *nm_vnode; | 
| 139 | 	struct	socket *nm_so;		/* Rpc socket */ | 
| 140 | 	int	nm_sotype;		/* Type of socket */ | 
| 141 | 	int	nm_soproto;		/* and protocol */ | 
| 142 | 	int	nm_soflags;		/* pr_flags for socket protocol */ | 
| 143 | 	struct	mbuf *nm_nam;		/* Addr of server */ | 
| 144 | 	int	nm_timeo;		/* Init timer for NFSMNT_DUMBTIMR */ | 
| 145 | 	int	nm_retry;		/* Max retries */ | 
| 146 | 	int	nm_srtt[4];		/* Timers for rpcs */ | 
| 147 | 	int	nm_sdrtt[4]; | 
| 148 | 	int	nm_sent;		/* Request send count */ | 
| 149 | 	int	nm_cwnd;		/* Request send window */ | 
| 150 | 	int	nm_timeouts;		/* Request timeouts */ | 
| 151 | 	int	nm_deadthresh;		/* Threshold of timeouts-->dead server*/ | 
| 152 | 	int	nm_rsize;		/* Max size of read rpc */ | 
| 153 | 	int	nm_wsize;		/* Max size of write rpc */ | 
| 154 | 	int	nm_readdirsize;		/* Size of a readdir rpc */ | 
| 155 | 	int	nm_readahead;		/* Num. of blocks to readahead */ | 
| 156 | 	uid_t	nm_authuid;		/* Uid for authenticator */ | 
| 157 | 	int	nm_authtype;		/* Authenticator type */ | 
| 158 | 	int	nm_authlen;		/* and length */ | 
| 159 | 	char	*nm_authstr;		/* Authenticator string */ | 
| 160 | 	char	*nm_verfstr;		/* and the verifier */ | 
| 161 | 	int	nm_verflen; | 
| 162 | 	krwlock_t nm_writeverflock;	/* lock for below */ | 
| 163 | 	u_char	nm_writeverf[NFSX_V3WRITEVERF]; /* V3 write verifier */ | 
| 164 | 	NFSKERBKEY_T nm_key;		/* and the session key */ | 
| 165 | 	int	nm_numuids;		/* Number of nfsuid mappings */ | 
| 166 | 	TAILQ_HEAD(, nfsuid) nm_uidlruhead; /* Lists of nfsuid mappings */ | 
| 167 | 	LIST_HEAD(, nfsuid) nm_uidhashtbl[NFS_MUIDHASHSIZ]; | 
| 168 | 	TAILQ_HEAD(, buf) nm_bufq;      /* async io buffer queue */ | 
| 169 | 	int	nm_bufqlen;		/* number of buffers in queue */ | 
| 170 | 	kcondvar_t nm_aiocv; | 
| 171 | 	int	nm_bufqiods;		/* number of iods processing queue */ | 
| 172 | 	u_int64_t nm_maxfilesize;	/* maximum file size */ | 
| 173 | 	int	nm_iflag;		/* internal flags */ | 
| 174 | 	int	nm_waiters;		/* number of waiting listeners.. */ | 
| 175 | 	kcondvar_t nm_disconcv; | 
| 176 | 	long	nm_wcckludgetime;	/* see nfs_check_wccdata() */ | 
| 177 | 	struct io_stats *nm_stats;	/* per nfs mount statistics */ | 
| 178 | }; | 
| 179 |  | 
| 180 | /* | 
| 181 |  * Convert mount ptr to nfsmount ptr. | 
| 182 |  */ | 
| 183 | #define VFSTONFS(mp)	((struct nfsmount *)((mp)->mnt_data)) | 
| 184 |  | 
| 185 | /* | 
| 186 |  * Prototypes for NFS mount operations | 
| 187 |  */ | 
| 188 | VFS_PROTOS(nfs); | 
| 189 |  | 
| 190 | int	mountnfs(struct nfs_args *argp, struct mount *mp, | 
| 191 | 		struct mbuf *nam, const char *pth, const char *hst, | 
| 192 | 		struct vnode **vpp, struct lwp *p); | 
| 193 | void	nfs_decode_args(struct nfsmount *, struct nfs_args *, | 
| 194 | 		struct lwp *l); | 
| 195 | int	nfs_fsinfo(struct nfsmount *, struct vnode *, kauth_cred_t, | 
| 196 | 			struct lwp *); | 
| 197 |  | 
| 198 | void	nfs_vfs_init(void); | 
| 199 | void	nfs_vfs_done(void); | 
| 200 |  | 
| 201 | #endif /* _KERNEL */ | 
| 202 |  | 
| 203 | #endif | 
| 204 |  |