Commit | Line | Data |
---|---|---|
cf1f89fc WJ |
1 | /* |
2 | * Copyright (c) 1989 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by the University of | |
16 | * California, Berkeley and its contributors. | |
17 | * 4. Neither the name of the University nor the names of its contributors | |
18 | * may be used to endorse or promote products derived from this software | |
19 | * without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
32 | * | |
33 | * @(#)mount.h 7.22 (Berkeley) 6/3/91 | |
34 | */ | |
35 | ||
36 | typedef quad fsid_t; /* file system id type */ | |
37 | ||
38 | /* | |
39 | * File identifier. | |
40 | * These are unique per filesystem on a single machine. | |
41 | */ | |
42 | #define MAXFIDSZ 16 | |
43 | ||
44 | struct fid { | |
45 | u_short fid_len; /* length of data in bytes */ | |
46 | u_short fid_reserved; /* force longword alignment */ | |
47 | char fid_data[MAXFIDSZ]; /* data (variable length) */ | |
48 | }; | |
49 | ||
50 | /* | |
51 | * file system statistics | |
52 | */ | |
53 | ||
54 | #define MNAMELEN 90 /* length of buffer for returned name */ | |
55 | ||
56 | struct statfs { | |
57 | short f_type; /* type of filesystem (see below) */ | |
58 | short f_flags; /* copy of mount flags */ | |
59 | long f_fsize; /* fundamental file system block size */ | |
60 | long f_bsize; /* optimal transfer block size */ | |
61 | long f_blocks; /* total data blocks in file system */ | |
62 | long f_bfree; /* free blocks in fs */ | |
63 | long f_bavail; /* free blocks avail to non-superuser */ | |
64 | long f_files; /* total file nodes in file system */ | |
65 | long f_ffree; /* free file nodes in fs */ | |
66 | fsid_t f_fsid; /* file system id */ | |
67 | long f_spare[9]; /* spare for later */ | |
68 | char f_mntonname[MNAMELEN]; /* directory on which mounted */ | |
69 | char f_mntfromname[MNAMELEN];/* mounted filesystem */ | |
70 | }; | |
71 | ||
72 | /* | |
73 | * File system types. | |
74 | */ | |
75 | #define MOUNT_NONE 0 | |
76 | #define MOUNT_UFS 1 /* UNIX "Fast" Filesystem */ | |
77 | #define MOUNT_NFS 2 /* Network Filesystem */ | |
78 | #define MOUNT_MFS 3 /* Memory Filesystem */ | |
79 | #define MOUNT_MSDOS 4 /* MSDOS Filesystem */ | |
80 | #define MOUNT_ISOFS 5 /* iso9660 cdrom */ | |
81 | #define MOUNT_MAXTYPE 5 | |
82 | ||
83 | /* | |
84 | * Structure per mounted file system. | |
85 | * Each mounted file system has an array of | |
86 | * operations and an instance record. | |
87 | * The file systems are put on a doubly linked list. | |
88 | */ | |
89 | struct mount { | |
90 | struct mount *mnt_next; /* next in mount list */ | |
91 | struct mount *mnt_prev; /* prev in mount list */ | |
92 | struct vfsops *mnt_op; /* operations on fs */ | |
93 | struct vnode *mnt_vnodecovered; /* vnode we mounted on */ | |
94 | struct vnode *mnt_mounth; /* list of vnodes this mount */ | |
95 | int mnt_flag; /* flags */ | |
96 | uid_t mnt_exroot; /* exported mapping for uid 0 */ | |
97 | struct statfs mnt_stat; /* cache of filesystem stats */ | |
98 | qaddr_t mnt_data; /* private data */ | |
99 | }; | |
100 | ||
101 | /* | |
102 | * Mount flags. | |
103 | */ | |
104 | #define MNT_RDONLY 0x00000001 /* read only filesystem */ | |
105 | #define MNT_SYNCHRONOUS 0x00000002 /* file system written synchronously */ | |
106 | #define MNT_NOEXEC 0x00000004 /* can't exec from filesystem */ | |
107 | #define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */ | |
108 | #define MNT_NODEV 0x00000010 /* don't interpret special files */ | |
109 | ||
110 | /* | |
111 | * exported mount flags. | |
112 | */ | |
113 | #define MNT_EXPORTED 0x00000100 /* file system is exported */ | |
114 | #define MNT_EXRDONLY 0x00000200 /* exported read only */ | |
115 | ||
116 | /* | |
117 | * Flags set by internal operations. | |
118 | */ | |
119 | #define MNT_LOCAL 0x00001000 /* filesystem is stored locally */ | |
120 | #define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */ | |
121 | ||
122 | /* | |
123 | * Mask of flags that are visible to statfs() | |
124 | */ | |
125 | #define MNT_VISFLAGMASK 0x0000ffff | |
126 | ||
127 | /* | |
128 | * filesystem control flags. | |
129 | * | |
130 | * MNT_MLOCK lock the mount entry so that name lookup cannot proceed | |
131 | * past the mount point. This keeps the subtree stable during mounts | |
132 | * and unmounts. | |
133 | */ | |
134 | #define MNT_UPDATE 0x00010000 /* not a real mount, just an update */ | |
135 | #define MNT_MLOCK 0x00100000 /* lock so that subtree is stable */ | |
136 | #define MNT_MWAIT 0x00200000 /* someone is waiting for lock */ | |
137 | #define MNT_MPBUSY 0x00400000 /* scan of mount point in progress */ | |
138 | #define MNT_MPWANT 0x00800000 /* waiting for mount point */ | |
139 | #define MNT_UNMOUNT 0x01000000 /* unmount in progress */ | |
140 | ||
141 | /* | |
142 | * Operations supported on mounted file system. | |
143 | */ | |
144 | #ifdef KERNEL | |
145 | #ifdef __STDC__ | |
146 | struct nameidata; | |
147 | #endif | |
148 | ||
149 | struct vfsops { | |
150 | int (*vfs_mount) __P((struct mount *mp, char *path, caddr_t data, | |
151 | struct nameidata *ndp, struct proc *p)); | |
152 | int (*vfs_start) __P((struct mount *mp, int flags, | |
153 | struct proc *p)); | |
154 | int (*vfs_unmount) __P((struct mount *mp, int mntflags, | |
155 | struct proc *p)); | |
156 | int (*vfs_root) __P((struct mount *mp, struct vnode **vpp)); | |
157 | /* int uid, should be uid_t */ | |
158 | int (*vfs_quotactl) __P((struct mount *mp, int cmds, int uid, | |
159 | caddr_t arg, struct proc *p)); | |
160 | int (*vfs_statfs) __P((struct mount *mp, struct statfs *sbp, | |
161 | struct proc *p)); | |
162 | int (*vfs_sync) __P((struct mount *mp, int waitfor)); | |
163 | int (*vfs_fhtovp) __P((struct mount *mp, struct fid *fhp, | |
164 | struct vnode **vpp)); | |
165 | int (*vfs_vptofh) __P((struct vnode *vp, struct fid *fhp)); | |
166 | int (*vfs_init) __P(()); | |
167 | }; | |
168 | ||
169 | #define VFS_MOUNT(MP, PATH, DATA, NDP, P) \ | |
170 | (*(MP)->mnt_op->vfs_mount)(MP, PATH, DATA, NDP, P) | |
171 | #define VFS_START(MP, FLAGS, P) (*(MP)->mnt_op->vfs_start)(MP, FLAGS, P) | |
172 | #define VFS_UNMOUNT(MP, FORCE, P) (*(MP)->mnt_op->vfs_unmount)(MP, FORCE, P) | |
173 | #define VFS_ROOT(MP, VPP) (*(MP)->mnt_op->vfs_root)(MP, VPP) | |
174 | #define VFS_QUOTACTL(MP,C,U,A,P) (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A, P) | |
175 | #define VFS_STATFS(MP, SBP, P) (*(MP)->mnt_op->vfs_statfs)(MP, SBP, P) | |
176 | #define VFS_SYNC(MP, WAITFOR) (*(MP)->mnt_op->vfs_sync)(MP, WAITFOR) | |
177 | #define VFS_FHTOVP(MP, FIDP, VPP) (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP) | |
178 | #define VFS_VPTOFH(VP, FIDP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP) | |
179 | #endif /* KERNEL */ | |
180 | ||
181 | /* | |
182 | * Flags for various system call interfaces. | |
183 | * | |
184 | * forcibly flags for vfs_umount(). | |
185 | * waitfor flags to vfs_sync() and getfsstat() | |
186 | */ | |
187 | #define MNT_FORCE 1 | |
188 | #define MNT_NOFORCE 2 | |
189 | #define MNT_WAIT 1 | |
190 | #define MNT_NOWAIT 2 | |
191 | ||
192 | /* | |
193 | * Generic file handle | |
194 | */ | |
195 | struct fhandle { | |
196 | fsid_t fh_fsid; /* File system id of mount point */ | |
197 | struct fid fh_fid; /* Id of file */ | |
198 | }; | |
199 | typedef struct fhandle fhandle_t; | |
200 | ||
201 | /* | |
202 | * Arguments to mount UFS | |
203 | */ | |
204 | struct ufs_args { | |
205 | char *fspec; /* block special device to mount */ | |
206 | int exflags; /* export related flags */ | |
207 | uid_t exroot; /* mapping for root uid */ | |
208 | }; | |
209 | ||
210 | #ifdef MFS | |
211 | /* | |
212 | * Arguments to mount MFS | |
213 | */ | |
214 | struct mfs_args { | |
215 | char *name; /* name to export for statfs */ | |
216 | caddr_t base; /* base address of file system in memory */ | |
217 | u_long size; /* size of file system */ | |
218 | }; | |
219 | #endif MFS | |
220 | ||
221 | #ifdef NFS | |
222 | /* | |
223 | * File Handle (32 bytes for version 2), variable up to 1024 for version 3 | |
224 | */ | |
225 | union nfsv2fh { | |
226 | fhandle_t fh_generic; | |
227 | u_char fh_bytes[32]; | |
228 | }; | |
229 | typedef union nfsv2fh nfsv2fh_t; | |
230 | ||
231 | /* | |
232 | * Arguments to mount NFS | |
233 | */ | |
234 | struct nfs_args { | |
235 | struct sockaddr *addr; /* file server address */ | |
236 | int sotype; /* Socket type */ | |
237 | int proto; /* and Protocol */ | |
238 | nfsv2fh_t *fh; /* File handle to be mounted */ | |
239 | int flags; /* flags */ | |
240 | int wsize; /* write size in bytes */ | |
241 | int rsize; /* read size in bytes */ | |
242 | int timeo; /* initial timeout in .1 secs */ | |
243 | int retrans; /* times to retry send */ | |
244 | char *hostname; /* server's name */ | |
245 | }; | |
246 | /* | |
247 | * NFS mount option flags | |
248 | */ | |
249 | #define NFSMNT_SOFT 0x0001 /* soft mount (hard is default) */ | |
250 | #define NFSMNT_WSIZE 0x0002 /* set write size */ | |
251 | #define NFSMNT_RSIZE 0x0004 /* set read size */ | |
252 | #define NFSMNT_TIMEO 0x0008 /* set initial timeout */ | |
253 | #define NFSMNT_RETRANS 0x0010 /* set number of request retrys */ | |
254 | #define NFSMNT_HOSTNAME 0x0020 /* set hostname for error printf */ | |
255 | #define NFSMNT_INT 0x0040 /* allow interrupts on hard mount */ | |
256 | #define NFSMNT_NOCONN 0x0080 /* Don't Connect the socket */ | |
257 | #define NFSMNT_SCKLOCK 0x0100 /* Lock socket against others */ | |
258 | #define NFSMNT_WANTSCK 0x0200 /* Want a socket lock */ | |
259 | #define NFSMNT_SPONGY 0x0400 /* spongy mount (soft for stat and lookup) */ | |
260 | #define NFSMNT_COMPRESS 0x0800 /* Compress nfs rpc xdr */ | |
261 | #define NFSMNT_LOCKBITS (NFSMNT_SCKLOCK | NFSMNT_WANTSCK) | |
262 | #endif NFS | |
263 | ||
264 | #ifdef KERNEL | |
265 | /* | |
266 | * exported vnode operations | |
267 | */ | |
268 | void vfs_remove __P((struct mount *mp)); /* remove a vfs from mount list */ | |
269 | int vfs_lock __P((struct mount *mp)); /* lock a vfs */ | |
270 | void vfs_unlock __P((struct mount *mp)); /* unlock a vfs */ | |
271 | struct mount *getvfs __P((fsid_t *fsid)); /* return vfs given fsid */ | |
272 | struct mount *rootfs; /* ptr to root mount structure */ | |
273 | struct vfsops *vfssw[]; /* mount filesystem type table */ | |
274 | ||
275 | #else /* KERNEL */ | |
276 | ||
277 | #include <sys/cdefs.h> | |
278 | ||
279 | __BEGIN_DECLS | |
280 | int fstatfs __P((int, struct statfs *)); | |
281 | int getfh __P((const char *, fhandle_t *)); | |
282 | int getfsstat __P((struct statfs *, long, int)); | |
283 | int getmntinfo __P((struct statfs **, int)); | |
284 | int mount __P((int, const char *, int, void *)); | |
285 | int statfs __P((const char *, struct statfs *)); | |
286 | int unmount __P((const char *, int)); | |
287 | __END_DECLS | |
288 | ||
289 | #endif /* KERNEL */ |