FreeBSD/Linux Kernel Cross Reference
sys/sys/mount.h
1 /* $NetBSD: mount.h,v 1.151 2006/11/17 17:05:18 hannken Exp $ */
2
3 /*
4 * Copyright (c) 1989, 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * @(#)mount.h 8.21 (Berkeley) 5/20/95
32 */
33
34 #ifndef _SYS_MOUNT_H_
35 #define _SYS_MOUNT_H_
36
37 #ifndef _KERNEL
38 #include <sys/featuretest.h>
39 #include <sys/ucred.h>
40 #if defined(_NETBSD_SOURCE)
41 #include <sys/stat.h>
42 #endif /* _NETBSD_SOURCE */
43 #endif
44 #include <sys/fstypes.h>
45 #include <sys/queue.h>
46 #include <sys/lock.h>
47 #include <sys/statvfs.h>
48 #include <sys/specificdata.h>
49
50 /*
51 * file system statistics
52 */
53
54 #define MFSNAMELEN 16 /* length of fs type name, including nul */
55 #define MNAMELEN 90 /* length of buffer for returned name */
56
57 /*
58 * File system types.
59 */
60 #define MOUNT_FFS "ffs" /* UNIX "Fast" Filesystem */
61 #define MOUNT_UFS MOUNT_FFS /* for compatibility */
62 #define MOUNT_NFS "nfs" /* Network Filesystem */
63 #define MOUNT_MFS "mfs" /* Memory Filesystem */
64 #define MOUNT_MSDOS "msdos" /* MSDOS Filesystem */
65 #define MOUNT_LFS "lfs" /* Log-based Filesystem */
66 #define MOUNT_FDESC "fdesc" /* File Descriptor Filesystem */
67 #define MOUNT_PORTAL "portal" /* Portal Filesystem */
68 #define MOUNT_NULL "null" /* Minimal Filesystem Layer */
69 #define MOUNT_OVERLAY "overlay" /* Minimal Overlay Filesystem Layer */
70 #define MOUNT_UMAP "umap" /* User/Group Identifier Remapping Filesystem */
71 #define MOUNT_KERNFS "kernfs" /* Kernel Information Filesystem */
72 #define MOUNT_PROCFS "procfs" /* /proc Filesystem */
73 #define MOUNT_AFS "afs" /* Andrew Filesystem */
74 #define MOUNT_CD9660 "cd9660" /* ISO9660 (aka CDROM) Filesystem */
75 #define MOUNT_UNION "union" /* Union (translucent) Filesystem */
76 #define MOUNT_ADOSFS "adosfs" /* AmigaDOS Filesystem */
77 #define MOUNT_EXT2FS "ext2fs" /* Second Extended Filesystem */
78 #define MOUNT_CFS "coda" /* Coda Filesystem */
79 #define MOUNT_CODA MOUNT_CFS /* Coda Filesystem */
80 #define MOUNT_FILECORE "filecore" /* Acorn Filecore Filesystem */
81 #define MOUNT_NTFS "ntfs" /* Windows/NT Filesystem */
82 #define MOUNT_SMBFS "smbfs" /* CIFS (SMB) */
83 #define MOUNT_PTYFS "ptyfs" /* Pseudo tty filesystem */
84 #define MOUNT_TMPFS "tmpfs" /* Efficient memory file-system */
85 #define MOUNT_UDF "udf" /* UDF CD/DVD filesystem */
86 #define MOUNT_SYSVBFS "sysvbfs" /* System V Boot Filesystem */
87 #define MOUNT_PUFFS "puffs" /* Pass-to-Userspace filesystem */
88
89 /*
90 * Structure per mounted file system. Each mounted file system has an
91 * array of operations and an instance record. The file systems are
92 * put on a doubly linked list.
93 */
94 TAILQ_HEAD(vnodelst, vnode);
95
96 struct mount {
97 CIRCLEQ_ENTRY(mount) mnt_list; /* mount list */
98 struct vfsops *mnt_op; /* operations on fs */
99 struct vnode *mnt_vnodecovered; /* vnode we mounted on */
100 struct vnode *mnt_syncer; /* syncer vnode */
101 struct vnodelst mnt_vnodelist; /* list of vnodes this mount */
102 struct lock mnt_lock; /* mount structure lock */
103 int mnt_flag; /* flags */
104 int mnt_iflag; /* internal flags */
105 int mnt_fs_bshift; /* offset shift for lblkno */
106 int mnt_dev_bshift; /* shift for device sectors */
107 struct statvfs mnt_stat; /* cache of filesystem stats */
108 void *mnt_data; /* private data */
109 int mnt_wcnt; /* count of vfs_busy waiters */
110 struct lwp *mnt_unmounter; /* who is unmounting */
111 int mnt_writeopcountupper; /* upper writeops in progress */
112 int mnt_writeopcountlower; /* lower writeops in progress */
113 struct simplelock mnt_slock; /* mutex for wcnt and
114 writeops counters */
115 struct mount *mnt_leaf; /* leaf fs we mounted on */
116 specificdata_reference
117 mnt_specdataref; /* subsystem specific data */
118 };
119
120 /*
121 * Sysctl CTL_VFS definitions.
122 *
123 * Second level identifier specifies which filesystem. Second level
124 * identifier VFS_GENERIC returns information about all filesystems.
125 *
126 * Note the slightly non-flat nature of these sysctl numbers. Oh for
127 * a better sysctl interface.
128 */
129 #define VFS_GENERIC 0 /* generic filesystem information */
130 #define VFS_MAXTYPENUM 1 /* int: highest defined fs type */
131 #define VFS_CONF 2 /* struct: vfsconf for filesystem given
132 as next argument */
133 #define VFS_USERMOUNT 3 /* enable/disable fs mnt by non-root */
134 #define VFS_MAGICLINKS 4 /* expand 'magic' symlinks */
135 #define VFSGEN_MAXID 5 /* number of valid vfs.generic ids */
136
137 #ifndef _STANDALONE
138 /*
139 * USE THE SAME NAMES AS MOUNT_*!
140 *
141 * Only need to add new entry here if the filesystem actually supports
142 * sysctl(2).
143 */
144 #define CTL_VFS_NAMES { \
145 { "generic", CTLTYPE_NODE }, \
146 { MOUNT_FFS, CTLTYPE_NODE }, \
147 { MOUNT_NFS, CTLTYPE_NODE }, \
148 { MOUNT_MFS, CTLTYPE_NODE }, \
149 { MOUNT_MSDOS, CTLTYPE_NODE }, \
150 { MOUNT_LFS, CTLTYPE_NODE }, \
151 { 0, 0 }, /* MOUNT_LOFS */ \
152 { MOUNT_FDESC, CTLTYPE_NODE }, \
153 { MOUNT_PORTAL, CTLTYPE_NODE }, \
154 { MOUNT_NULL, CTLTYPE_NODE }, \
155 { MOUNT_UMAP, CTLTYPE_NODE }, \
156 { MOUNT_KERNFS, CTLTYPE_NODE }, \
157 { MOUNT_PROCFS, CTLTYPE_NODE }, \
158 { MOUNT_AFS, CTLTYPE_NODE }, \
159 { MOUNT_CD9660, CTLTYPE_NODE }, \
160 { MOUNT_UNION, CTLTYPE_NODE }, \
161 { MOUNT_ADOSFS, CTLTYPE_NODE }, \
162 { MOUNT_EXT2FS, CTLTYPE_NODE }, \
163 { MOUNT_CODA, CTLTYPE_NODE }, \
164 { MOUNT_FILECORE, CTLTYPE_NODE }, \
165 { MOUNT_NTFS, CTLTYPE_NODE }, \
166 }
167
168 #define VFS_MAXID 20 /* number of valid vfs ids */
169
170 #define CTL_VFSGENCTL_NAMES { \
171 { 0, 0 }, \
172 { "maxtypenum", CTLTYPE_INT }, \
173 { "conf", CTLTYPE_NODE }, /* Special */ \
174 { "usermount", CTLTYPE_INT }, \
175 { "magiclinks", CTLTYPE_INT }, \
176 }
177
178 /*
179 * Operations supported on mounted file system.
180 */
181 #ifdef _KERNEL
182
183 #if __STDC__
184 struct nameidata;
185 struct mbuf;
186 struct vnodeopv_desc;
187 struct kauth_cred;
188 #endif
189
190 #define VFS_PROTOS(fsname) \
191 int fsname##_mount(struct mount *, const char *, void *, \
192 struct nameidata *, struct lwp *); \
193 int fsname##_start(struct mount *, int, struct lwp *); \
194 int fsname##_unmount(struct mount *, int, struct lwp *); \
195 int fsname##_root(struct mount *, struct vnode **); \
196 int fsname##_quotactl(struct mount *, int, uid_t, void *, \
197 struct lwp *); \
198 int fsname##_statvfs(struct mount *, struct statvfs *, \
199 struct lwp *); \
200 int fsname##_sync(struct mount *, int, struct kauth_cred *, \
201 struct lwp *); \
202 int fsname##_vget(struct mount *, ino_t, struct vnode **); \
203 int fsname##_fhtovp(struct mount *, struct fid *, struct vnode **); \
204 int fsname##_vptofh(struct vnode *, struct fid *); \
205 void fsname##_init(void); \
206 void fsname##_reinit(void); \
207 void fsname##_done(void); \
208 int fsname##_mountroot(void); \
209 int fsname##_snapshot(struct mount *, struct vnode *, \
210 struct timespec *); \
211 int fsname##_extattrctl(struct mount *, int, struct vnode *, int, \
212 const char *, struct lwp *);
213
214 struct vfsops {
215 const char *vfs_name;
216 int (*vfs_mount) (struct mount *, const char *, void *,
217 struct nameidata *, struct lwp *);
218 int (*vfs_start) (struct mount *, int, struct lwp *);
219 int (*vfs_unmount) (struct mount *, int, struct lwp *);
220 int (*vfs_root) (struct mount *, struct vnode **);
221 int (*vfs_quotactl) (struct mount *, int, uid_t, void *,
222 struct lwp *);
223 int (*vfs_statvfs) (struct mount *, struct statvfs *,
224 struct lwp *);
225 int (*vfs_sync) (struct mount *, int, struct kauth_cred *,
226 struct lwp *);
227 int (*vfs_vget) (struct mount *, ino_t, struct vnode **);
228 int (*vfs_fhtovp) (struct mount *, struct fid *,
229 struct vnode **);
230 int (*vfs_vptofh) (struct vnode *, struct fid *, size_t *);
231 void (*vfs_init) (void);
232 void (*vfs_reinit) (void);
233 void (*vfs_done) (void);
234 int (*vfs_mountroot)(void);
235 int (*vfs_snapshot) (struct mount *, struct vnode *,
236 struct timespec *);
237 int (*vfs_extattrctl) (struct mount *, int,
238 struct vnode *, int, const char *,
239 struct lwp *);
240 const struct vnodeopv_desc * const *vfs_opv_descs;
241 int vfs_refcount;
242 LIST_ENTRY(vfsops) vfs_list;
243 };
244
245 #define VFS_ATTACH(vfs) __link_set_add_data(vfsops, vfs)
246
247 #define VFS_MOUNT(MP, PATH, DATA, NDP, L) \
248 (*(MP)->mnt_op->vfs_mount)(MP, PATH, DATA, NDP, L)
249 #define VFS_START(MP, FLAGS, L) (*(MP)->mnt_op->vfs_start)(MP, FLAGS, L)
250 #define VFS_UNMOUNT(MP, FORCE, L) (*(MP)->mnt_op->vfs_unmount)(MP, FORCE, L)
251 #define VFS_ROOT(MP, VPP) (*(MP)->mnt_op->vfs_root)(MP, VPP)
252 #define VFS_QUOTACTL(MP,C,U,A,L) (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A, L)
253 #define VFS_STATVFS(MP, SBP, L) (*(MP)->mnt_op->vfs_statvfs)(MP, SBP, L)
254 #define VFS_SYNC(MP, WAIT, C, L) (*(MP)->mnt_op->vfs_sync)(MP, WAIT, C, L)
255 #define VFS_VGET(MP, INO, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, VPP)
256 #define VFS_FHTOVP(MP, FIDP, VPP) (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP)
257 #define VFS_VPTOFH(VP, FIDP, FIDSZP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP, FIDSZP)
258 #define VFS_SNAPSHOT(MP, VP, TS) (*(MP)->mnt_op->vfs_snapshot)(MP, VP, TS)
259 #define VFS_EXTATTRCTL(MP, C, VP, AS, AN, L) \
260 (*(MP)->mnt_op->vfs_extattrctl)(MP, C, VP, AS, AN, L)
261
262 struct vfs_hooks {
263 void (*vh_unmount)(struct mount *);
264 };
265 #define VFS_HOOKS_ATTACH(hooks) __link_set_add_data(vfs_hooks, hooks)
266
267 void vfs_hooks_unmount(struct mount *);
268
269 #endif /* _KERNEL */
270
271 /*
272 * Export arguments for local filesystem mount calls.
273 *
274 * This structure is deprecated and is only provided for compatibility
275 * reasons with old binary utilities; several file systems expose an
276 * instance of this structure in their mount arguments structure, thus
277 * needing a padding in place of the old values. This definition cannot
278 * change in the future due to this reason.
279 * XXX: This should be moved to the compat subtree but cannot be done
280 * until we can move the mount args structures themselves.
281 *
282 * The current export_args structure can be found in nfs/nfs.h.
283 */
284 struct export_args30 {
285 int ex_flags; /* export related flags */
286 uid_t ex_root; /* mapping for root uid */
287 struct uucred ex_anon; /* mapping for anonymous user */
288 struct sockaddr *ex_addr; /* net address to which exported */
289 int ex_addrlen; /* and the net address length */
290 struct sockaddr *ex_mask; /* mask of valid bits in saddr */
291 int ex_masklen; /* and the smask length */
292 char *ex_indexfile; /* index file for WebNFS URLs */
293 };
294
295 #ifdef _KERNEL
296 #include <sys/mallocvar.h>
297 MALLOC_DECLARE(M_MOUNT);
298
299 /*
300 * exported VFS interface (see vfssubr(9))
301 */
302 struct mount *vfs_getvfs(fsid_t *); /* return vfs given fsid */
303 int vfs_composefh(struct vnode *, fhandle_t *, size_t *);
304 int vfs_composefh_alloc(struct vnode *, fhandle_t **);
305 void vfs_composefh_free(fhandle_t *);
306 int vfs_fhtovp(fhandle_t *, struct vnode **);
307 int vfs_mountedon(struct vnode *);/* is a vfs mounted on vp */
308 int vfs_mountroot(void);
309 void vfs_shutdown(void); /* unmount and sync file systems */
310 void vfs_unmountall(struct lwp *); /* unmount file systems */
311 int vfs_busy(struct mount *, int, struct simplelock *);
312 int vfs_rootmountalloc(const char *, const char *, struct mount **);
313 void vfs_unbusy(struct mount *);
314 int vfs_attach(struct vfsops *);
315 int vfs_detach(struct vfsops *);
316 void vfs_reinit(void);
317 struct vfsops *vfs_getopsbyname(const char *);
318
319 int vfs_stdextattrctl(struct mount *, int, struct vnode *,
320 int, const char *, struct lwp *);
321
322 extern CIRCLEQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */
323 extern struct vfsops *vfssw[]; /* filesystem type table */
324 extern int nvfssw;
325 extern struct simplelock mountlist_slock;
326 extern struct simplelock spechash_slock;
327 long makefstype(const char *);
328 int dounmount(struct mount *, int, struct lwp *);
329 void vfsinit(void);
330 void vfs_opv_init(const struct vnodeopv_desc * const *);
331 void vfs_opv_free(const struct vnodeopv_desc * const *);
332 #ifdef DEBUG
333 void vfs_bufstats(void);
334 #endif
335
336 int mount_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
337 void mount_specific_key_delete(specificdata_key_t);
338 void mount_initspecific(struct mount *);
339 void mount_finispecific(struct mount *);
340 void * mount_getspecific(struct mount *, specificdata_key_t);
341 void mount_setspecific(struct mount *, specificdata_key_t, void *);
342
343 /*
344 * syscall helpers
345 */
346
347 int vfs_copyinfh_alloc(const void *, size_t, fhandle_t **);
348 void vfs_copyinfh_free(fhandle_t *);
349
350 struct stat;
351 int dofhopen(struct lwp *, const void *, size_t, int, register_t *);
352 int dofhstat(struct lwp *, const void *, size_t, struct stat *, register_t *);
353 int dofhstatvfs(struct lwp *, const void *, size_t, struct statvfs *, int,
354 register_t *);
355
356 LIST_HEAD(vfs_list_head, vfsops);
357 extern struct vfs_list_head vfs_list;
358
359 #else /* _KERNEL */
360
361 #include <sys/cdefs.h>
362
363 __BEGIN_DECLS
364 #if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
365 int getfh(const char *, void *, size_t *)
366 __RENAME(__getfh30);
367 #endif
368
369 int mount(const char *, const char *, int, void *);
370 int unmount(const char *, int);
371 #if defined(_NETBSD_SOURCE)
372 #ifndef __LIBC12_SOURCE__
373 int fhopen(const void *, size_t, int) __RENAME(__fhopen40);
374 int fhstat(const void *, size_t, struct stat *) __RENAME(__fhstat40);
375 #endif
376 #endif /* _NETBSD_SOURCE */
377 __END_DECLS
378
379 #endif /* _KERNEL */
380 #endif /* !_STANDALONE */
381
382 #endif /* !_SYS_MOUNT_H_ */
Cache object: 07e0c2af1e706acb4d153f1213b50f51
|