1 /*        $NetBSD: nfsmount.h,v 1.54 2024/12/07 02:05:55 riastradh 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 #ifndef _NFS_NFSMOUNT_H_
38 #define   _NFS_NFSMOUNT_H_
39 
40 #if defined(_KERNEL) && !defined(NFS_ARGS_ONLY)
41 #include <sys/condvar.h>
42 #include <sys/rwlock.h>
43 #include <sys/mutex.h>
44 #include <sys/disk.h>
45 #endif
46 
47 /*
48  * Arguments to mount NFS
49  */
50 #define NFS_ARGSVERSION       3                   /* change when nfs_args changes */
51 struct nfs_args {
52           int                 version;  /* args structure version number */
53           struct sockaddr     *addr;              /* file server address */
54           int                 addrlen;  /* length of address */
55           int                 sotype;             /* Socket type */
56           int                 proto;              /* and Protocol */
57           u_char              *fh;                /* File handle to be mounted */
58           int                 fhsize;             /* Size, in bytes, of fh */
59           int                 flags;              /* flags */
60           int                 wsize;              /* write size in bytes */
61           int                 rsize;              /* read size in bytes */
62           int                 readdirsize;        /* readdir size in bytes */
63           int                 timeo;              /* initial timeout in .1 secs */
64           int                 retrans;  /* times to retry send */
65           int                 maxgrouplist;       /* Max. size of group list */
66           int                 readahead;          /* # of blocks to readahead */
67           int                 leaseterm;          /* Ignored; Term (sec) of lease */
68           int                 deadthresh;         /* Retrans threshold */
69           char                *hostname;          /* server's name */
70 };
71 
72 /*
73  * NFS mount option flags (nm_flag)
74  */
75 #define   NFSMNT_SOFT                   0x00000001  /* soft mount (hard is default) */
76 #define   NFSMNT_WSIZE                  0x00000002  /* set write size */
77 #define   NFSMNT_RSIZE                  0x00000004  /* set read size */
78 #define   NFSMNT_TIMEO                  0x00000008  /* set initial timeout */
79 #define   NFSMNT_RETRANS                0x00000010  /* set number of request retries */
80 #define   NFSMNT_MAXGRPS                0x00000020  /* set maximum grouplist size */
81 #define   NFSMNT_INT                    0x00000040  /* allow interrupts on hard mount */
82 #define   NFSMNT_NOCONN                 0x00000080  /* Don't Connect the socket */
83 #define   NFSMNT_NQNFS                  0x00000100  /* Use Nqnfs protocol */
84 #define   NFSMNT_NFSV3                  0x00000200  /* Use NFS Version 3 protocol */
85 #define   NFSMNT_KERB                   0x00000400  /* Use Kerberos authentication */
86 #define   NFSMNT_DUMBTIMR               0x00000800  /* Don't estimate rtt dynamically */
87 #define   NFSMNT_LEASETERM    0x00001000  /* Ignored; lease term (nqnfs) */
88 #define   NFSMNT_READAHEAD    0x00002000  /* set read ahead */
89 #define   NFSMNT_DEADTHRESH   0x00004000  /* set dead server retry thresh */
90 #define   NFSMNT_RESVPORT               0x00008000  /* Allocate a reserved port */
91 #define   NFSMNT_RDIRPLUS               0x00010000  /* Use Readdirplus for V3 */
92 #define   NFSMNT_READDIRSIZE  0x00020000  /* Set readdir size */
93 #define NFSMNT_XLATECOOKIE    0x00040000  /* 32<->64 dir cookie xlation */
94 #define   NFSMNT_NOAC                   0x00080000  /* Turn off attribute cache */
95 
96 #define NFSMNT_BITS "\177\20" \
97     "b\00soft\0b\01wsize\0b\02rsize\0b\03timeo\0" \
98     "b\04retrans\0b\05maxgrps\0b\06intr\0b\07noconn\0" \
99     "b\10nqnfs\0b\11nfsv3\0b\12kerb\0b\13dumbtimr\0" \
100     "b\14leaseterm\0b\15readahead\0b\16deadthresh\0b\17resvport\0" \
101     "b\20rdirplus\0b\21readdirsize\0b\22xlatecookie\0b\23noac\0"
102 
103 /*
104  * NFS internal flags (nm_iflag) */
105 
106 #define NFSMNT_HASWRITEVERF   0x00000001  /* Has write verifier for V3 */
107 #define NFSMNT_GOTPATHCONF    0x00000002  /* Got the V3 pathconf info */
108 #define NFSMNT_GOTFSINFO      0x00000004  /* Got the V3 fsinfo */
109 #define   NFSMNT_MNTD                   0x00000008  /* Mnt server for mnt point */
110 #define   NFSMNT_DISMNT                 0x00000020  /* Dismounted */
111 #define   NFSMNT_SNDLOCK                0x00000040  /* Send socket lock */
112 #define   NFSMNT_WANTSND                0x00000080  /* Want above */
113 #define   NFSMNT_RCVLOCK                0x00000100  /* Rcv socket lock */
114 #define   NFSMNT_WANTRCV                0x00000200  /* Want above */
115 #define   NFSMNT_WAITAUTH               0x00000400  /* Wait for authentication */
116 #define   NFSMNT_HASAUTH                0x00000800  /* Has authenticator */
117 #define   NFSMNT_WANTAUTH               0x00001000  /* Wants an authenticator */
118 #define   NFSMNT_AUTHERR                0x00002000  /* Authentication error */
119 #define NFSMNT_SWAPCOOKIE     0x00004000  /* XDR encode dir cookies */
120 #define NFSMNT_STALEWRITEVERF 0x00008000  /* Write verifier is changing */
121 #define NFSMNT_WCCKLUDGE      0x00010000  /* see nfs_check_wccdata() */
122 #define NFSMNT_DISMNTFORCE    0x00020000  /* force unmount requested */
123 
124 #if defined(_KERNEL) && !defined(NFS_ARGS_ONLY)
125 /*
126  * Mount structure.
127  * One allocated on every NFS mount.
128  * Holds NFS specific information for mount.
129  */
130 struct    nfsmount {
131           kmutex_t nm_lock;             /* Lock for this structure */
132           kcondvar_t nm_rcvcv;
133           kcondvar_t nm_sndcv;
134           int       nm_flag;            /* Flags for soft/hard... */
135           struct    mount *nm_mountp;   /* Vfs structure for this filesystem */
136           int       nm_numgrps;                   /* Max. size of groupslist */
137           struct    vnode *nm_vnode;
138           struct    socket *nm_so;                /* Rpc socket */
139           int       nm_sotype;                    /* Type of socket */
140           int       nm_soproto;                   /* and protocol */
141           int       nm_soflags;                   /* pr_flags for socket protocol */
142           struct    mbuf *nm_nam;                 /* Addr of server */
143           int       nm_timeo;           /* Init timer for NFSMNT_DUMBTIMR */
144           int       nm_retry;           /* Max retries */
145           int       nm_srtt[4];                   /* Timers for rpcs */
146           int       nm_sdrtt[4];
147           int       nm_sent;            /* Request send count */
148           int       nm_cwnd;            /* Request send window */
149           int       nm_timeouts;                  /* Request timeouts */
150           int       nm_deadthresh;                /* Threshold of timeouts-->dead server*/
151           int       nm_rsize;           /* Max size of read rpc */
152           int       nm_wsize;           /* Max size of write rpc */
153           int       nm_readdirsize;               /* Size of a readdir rpc */
154           int       nm_readahead;                 /* Num. of blocks to readahead */
155           uid_t     nm_authuid;                   /* Uid for authenticator */
156           int       nm_authtype;                  /* Authenticator type */
157           int       nm_authlen;                   /* and length */
158           char      *nm_authstr;                  /* Authenticator string */
159           char      *nm_verfstr;                  /* and the verifier */
160           int       nm_verflen;
161           krwlock_t nm_writeverflock;   /* lock for below */
162           u_char    nm_writeverf[NFSX_V3WRITEVERF]; /* V3 write verifier */
163           NFSKERBKEY_T nm_key;                    /* and the session key */
164           int       nm_numuids;                   /* Number of nfsuid mappings */
165           TAILQ_HEAD(, nfsuid) nm_uidlruhead; /* Lists of nfsuid mappings */
166           LIST_HEAD(, nfsuid) nm_uidhashtbl[NFS_MUIDHASHSIZ];
167           TAILQ_HEAD(, buf) nm_bufq;      /* async io buffer queue */
168           int       nm_bufqlen;                   /* number of buffers in queue */
169           kcondvar_t nm_aiocv;
170           int       nm_bufqiods;                  /* number of iods processing queue */
171           u_int64_t nm_maxfilesize;     /* maximum file size */
172           int       nm_iflag;           /* internal flags */
173           int       nm_waiters;                   /* number of waiting listeners.. */
174           kcondvar_t nm_disconcv;
175           long      nm_wcckludgetime;   /* see nfs_check_wccdata() */
176           struct io_stats *nm_stats;    /* per nfs mount statistics */
177 };
178 
179 /*
180  * Convert mount ptr to nfsmount ptr.
181  */
182 #define VFSTONFS(mp)          ((struct nfsmount *)((mp)->mnt_data))
183 
184 /*
185  * Prototypes for NFS mount operations
186  */
187 VFS_PROTOS(nfs);
188 
189 int       mountnfs(struct nfs_args *argp, struct mount *mp,
190                     struct mbuf *nam, const char *pth, const char *hst,
191                     struct vnode **vpp, struct lwp *p);
192 void      nfs_decode_args(struct nfsmount *, struct nfs_args *,
193                     struct lwp *l);
194 int       nfs_fsinfo(struct nfsmount *, struct vnode *, kauth_cred_t,
195                               struct lwp *);
196 
197 void      nfs_vfs_init(void);
198 void      nfs_vfs_done(void);
199 
200 #endif /* _KERNEL */
201 
202 #endif    /* _NFS_NFSMOUNT_H_ */
203