1/* $NetBSD: mount.h,v 1.219 2016/07/07 06:55:44 msaitoh 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#if defined(_NETBSD_SOURCE)
40#include <sys/stat.h>
41#endif /* _NETBSD_SOURCE */
42#endif
43
44#ifndef _STANDALONE
45#include <sys/param.h> /* precautionary upon removal from ucred.h */
46#include <sys/time.h>
47#include <sys/uio.h>
48#include <sys/ucred.h>
49#include <sys/fstypes.h>
50#include <sys/queue.h>
51#include <sys/rwlock.h>
52#include <sys/statvfs.h>
53#include <sys/specificdata.h>
54#include <sys/condvar.h>
55#endif /* !_STANDALONE */
56
57/*
58 * file system statistics
59 */
60
61#define MNAMELEN 90 /* length of buffer for returned name */
62
63/*
64 * File system types.
65 */
66#define MOUNT_FFS "ffs" /* UNIX "Fast" Filesystem */
67#define MOUNT_UFS MOUNT_FFS /* for compatibility */
68#define MOUNT_NFS "nfs" /* Network Filesystem */
69#define MOUNT_MFS "mfs" /* Memory Filesystem */
70#define MOUNT_MSDOS "msdos" /* MSDOS Filesystem */
71#define MOUNT_LFS "lfs" /* Log-based Filesystem */
72#define MOUNT_FDESC "fdesc" /* File Descriptor Filesystem */
73#define MOUNT_NULL "null" /* Minimal Filesystem Layer */
74#define MOUNT_OVERLAY "overlay" /* Minimal Overlay Filesystem Layer */
75#define MOUNT_UMAP "umap" /* User/Group Identifier Remapping Filesystem */
76#define MOUNT_KERNFS "kernfs" /* Kernel Information Filesystem */
77#define MOUNT_PROCFS "procfs" /* /proc Filesystem */
78#define MOUNT_AFS "afs" /* Andrew Filesystem */
79#define MOUNT_CD9660 "cd9660" /* ISO9660 (aka CDROM) Filesystem */
80#define MOUNT_UNION "union" /* Union (translucent) Filesystem */
81#define MOUNT_ADOSFS "adosfs" /* AmigaDOS Filesystem */
82#define MOUNT_EXT2FS "ext2fs" /* Second Extended Filesystem */
83#define MOUNT_CFS "coda" /* Coda Filesystem */
84#define MOUNT_CODA MOUNT_CFS /* Coda Filesystem */
85#define MOUNT_FILECORE "filecore" /* Acorn Filecore Filesystem */
86#define MOUNT_NTFS "ntfs" /* Windows/NT Filesystem */
87#define MOUNT_SMBFS "smbfs" /* CIFS (SMB) */
88#define MOUNT_PTYFS "ptyfs" /* Pseudo tty filesystem */
89#define MOUNT_TMPFS "tmpfs" /* Efficient memory file-system */
90#define MOUNT_UDF "udf" /* UDF CD/DVD filesystem */
91#define MOUNT_SYSVBFS "sysvbfs" /* System V Boot Filesystem */
92#define MOUNT_PUFFS "puffs" /* Pass-to-Userspace filesystem */
93#define MOUNT_HFS "hfs" /* Apple HFS+ Filesystem */
94#define MOUNT_EFS "efs" /* SGI's Extent Filesystem */
95#define MOUNT_ZFS "zfs" /* Sun ZFS */
96#define MOUNT_NILFS "nilfs" /* NTT's NiLFS(2) logging file system */
97#define MOUNT_RUMPFS "rumpfs" /* rump virtual file system */
98#define MOUNT_V7FS "v7fs" /* 7th Edition of Unix Filesystem */
99
100#ifndef _STANDALONE
101
102struct vnode;
103struct vattr;
104
105/*
106 * Structure per mounted file system. Each mounted file system has an
107 * array of operations and an instance record. The file systems are
108 * put on a doubly linked list.
109 */
110struct mount {
111 TAILQ_ENTRY(mount) mnt_list; /* mount list */
112 TAILQ_HEAD(, vnode) mnt_vnodelist; /* list of vnodes this mount */
113 struct vfsops *mnt_op; /* operations on fs */
114 struct vnode *mnt_vnodecovered; /* vnode we mounted on */
115 int mnt_synclist_slot; /* synclist slot index */
116 void *mnt_transinfo; /* for FS-internal use */
117 void *mnt_data; /* private data */
118 kmutex_t mnt_unmounting; /* to prevent new activity */
119 kmutex_t mnt_renamelock; /* per-fs rename lock */
120 int mnt_refcnt; /* ref count on this structure */
121 unsigned int mnt_busynest; /* vfs_busy nestings */
122 int mnt_flag; /* flags */
123 int mnt_iflag; /* internal flags */
124 int mnt_fs_bshift; /* offset shift for lblkno */
125 int mnt_dev_bshift; /* shift for device sectors */
126 struct statvfs mnt_stat; /* cache of filesystem stats */
127 specificdata_reference
128 mnt_specdataref; /* subsystem specific data */
129 kmutex_t mnt_updating; /* to serialize updates */
130 struct wapbl_ops
131 *mnt_wapbl_op; /* logging ops */
132 struct wapbl *mnt_wapbl; /* log info */
133 struct wapbl_replay
134 *mnt_wapbl_replay; /* replay support XXX: what? */
135 uint64_t mnt_gen;
136};
137
138/*
139 * Sysctl CTL_VFS definitions.
140 *
141 * Second level identifier specifies which filesystem. Second level
142 * identifier VFS_GENERIC returns information about all filesystems.
143 *
144 * Note the slightly non-flat nature of these sysctl numbers. Oh for
145 * a better sysctl interface.
146 */
147#define VFS_GENERIC 0 /* generic filesystem information */
148#define VFS_MAXTYPENUM 1 /* int: highest defined fs type */
149#define VFS_CONF 2 /* struct: vfsconf for filesystem given
150 as next argument */
151#define VFS_USERMOUNT 3 /* enable/disable fs mnt by non-root */
152#define VFS_MAGICLINKS 4 /* expand 'magic' symlinks */
153#define VFSGEN_MAXID 5 /* number of valid vfs.generic ids */
154
155/*
156 * USE THE SAME NAMES AS MOUNT_*!
157 *
158 * Only need to add new entry here if the filesystem actually supports
159 * sysctl(2).
160 */
161#define CTL_VFS_NAMES { \
162 { "generic", CTLTYPE_NODE }, \
163 { MOUNT_FFS, CTLTYPE_NODE }, \
164 { MOUNT_NFS, CTLTYPE_NODE }, \
165 { MOUNT_MFS, CTLTYPE_NODE }, \
166 { MOUNT_MSDOS, CTLTYPE_NODE }, \
167 { MOUNT_LFS, CTLTYPE_NODE }, \
168 { 0, 0 }, /* MOUNT_LOFS */ \
169 { MOUNT_FDESC, CTLTYPE_NODE }, \
170 { MOUNT_NULL, CTLTYPE_NODE }, \
171 { MOUNT_UMAP, CTLTYPE_NODE }, \
172 { MOUNT_KERNFS, CTLTYPE_NODE }, \
173 { MOUNT_PROCFS, CTLTYPE_NODE }, \
174 { MOUNT_AFS, CTLTYPE_NODE }, \
175 { MOUNT_CD9660, CTLTYPE_NODE }, \
176 { MOUNT_UNION, CTLTYPE_NODE }, \
177 { MOUNT_ADOSFS, CTLTYPE_NODE }, \
178 { MOUNT_EXT2FS, CTLTYPE_NODE }, \
179 { MOUNT_CODA, CTLTYPE_NODE }, \
180 { MOUNT_FILECORE, CTLTYPE_NODE }, \
181 { MOUNT_NTFS, CTLTYPE_NODE }, \
182}
183
184#define VFS_MAXID 20 /* number of valid vfs ids */
185
186#define CTL_VFSGENCTL_NAMES { \
187 { 0, 0 }, \
188 { "maxtypenum", CTLTYPE_INT }, \
189 { "conf", CTLTYPE_NODE }, /* Special */ \
190 { "usermount", CTLTYPE_INT }, \
191 { "magiclinks", CTLTYPE_INT }, \
192}
193
194#if defined(_KERNEL)
195
196struct quotactl_args; /* in sys/quotactl.h */
197struct quotastat; /* in sys/quotactl.h */
198struct quotaidtypestat; /* in sys/quotactl.h */
199struct quotaobjtypestat; /* in sys/quotactl.h */
200struct quotakcursor; /* in sys/quotactl.h */
201struct quotakey; /* in sys/quota.h */
202struct quotaval; /* in sys/quota.h */
203
204#if __STDC__
205struct nameidata;
206#endif
207
208/*
209 * Operations supported on mounted file system.
210 */
211
212struct vfsops {
213 const char *vfs_name;
214 size_t vfs_min_mount_data;
215 int (*vfs_mount) (struct mount *, const char *, void *,
216 size_t *);
217 int (*vfs_start) (struct mount *, int);
218 int (*vfs_unmount) (struct mount *, int);
219 int (*vfs_root) (struct mount *, struct vnode **);
220 int (*vfs_quotactl) (struct mount *, struct quotactl_args *);
221 int (*vfs_statvfs) (struct mount *, struct statvfs *);
222 int (*vfs_sync) (struct mount *, int, struct kauth_cred *);
223 int (*vfs_vget) (struct mount *, ino_t, struct vnode **);
224 int (*vfs_loadvnode) (struct mount *, struct vnode *,
225 const void *, size_t, const void **);
226 int (*vfs_newvnode) (struct mount *, struct vnode *, struct vnode *,
227 struct vattr *, kauth_cred_t,
228 size_t *, const void **);
229 int (*vfs_fhtovp) (struct mount *, struct fid *,
230 struct vnode **);
231 int (*vfs_vptofh) (struct vnode *, struct fid *, size_t *);
232 void (*vfs_init) (void);
233 void (*vfs_reinit) (void);
234 void (*vfs_done) (void);
235 int (*vfs_mountroot)(void);
236 int (*vfs_snapshot) (struct mount *, struct vnode *,
237 struct timespec *);
238 int (*vfs_extattrctl) (struct mount *, int,
239 struct vnode *, int, const char *);
240 int (*vfs_suspendctl) (struct mount *, int);
241 int (*vfs_renamelock_enter)(struct mount *);
242 void (*vfs_renamelock_exit)(struct mount *);
243 int (*vfs_fsync) (struct vnode *, int);
244 const struct vnodeopv_desc * const *vfs_opv_descs;
245 int vfs_refcount;
246 LIST_ENTRY(vfsops) vfs_list;
247};
248
249/* XXX vget is actually file system internal. */
250#define VFS_VGET(MP, INO, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, VPP)
251#define VFS_LOADVNODE(MP, VP, KEY, KEY_LEN, NEW_KEY) \
252 (*(MP)->mnt_op->vfs_loadvnode)(MP, VP, KEY, KEY_LEN, NEW_KEY)
253#define VFS_NEWVNODE(MP, DVP, VP, VAP, CRED, NEW_LEN, NEW_KEY) \
254 (*(MP)->mnt_op->vfs_newvnode)(MP, DVP, VP, VAP, CRED, NEW_LEN, NEW_KEY)
255
256#define VFS_RENAMELOCK_ENTER(MP) (*(MP)->mnt_op->vfs_renamelock_enter)(MP)
257#define VFS_RENAMELOCK_EXIT(MP) (*(MP)->mnt_op->vfs_renamelock_exit)(MP)
258#define VFS_FSYNC(MP, VP, FLG) (*(MP)->mnt_op->vfs_fsync)(VP, FLG)
259
260int VFS_MOUNT(struct mount *, const char *, void *, size_t *);
261int VFS_START(struct mount *, int);
262int VFS_UNMOUNT(struct mount *, int);
263int VFS_ROOT(struct mount *, struct vnode **);
264int VFS_QUOTACTL(struct mount *, struct quotactl_args *);
265int VFS_STATVFS(struct mount *, struct statvfs *);
266int VFS_SYNC(struct mount *, int, struct kauth_cred *);
267int VFS_FHTOVP(struct mount *, struct fid *, struct vnode **);
268int VFS_VPTOFH(struct vnode *, struct fid *, size_t *);
269int VFS_SNAPSHOT(struct mount *, struct vnode *, struct timespec *);
270int VFS_EXTATTRCTL(struct mount *, int, struct vnode *, int, const char *);
271int VFS_SUSPENDCTL(struct mount *, int);
272
273#endif /* _KERNEL */
274
275#ifdef _KERNEL
276#if __STDC__
277struct mbuf;
278struct vnodeopv_desc;
279struct kauth_cred;
280#endif
281
282#define VFS_MAX_MOUNT_DATA 8192
283
284#define VFS_PROTOS(fsname) \
285int fsname##_mount(struct mount *, const char *, void *, \
286 size_t *); \
287int fsname##_start(struct mount *, int); \
288int fsname##_unmount(struct mount *, int); \
289int fsname##_root(struct mount *, struct vnode **); \
290int fsname##_quotactl(struct mount *, struct quotactl_args *); \
291int fsname##_statvfs(struct mount *, struct statvfs *); \
292int fsname##_sync(struct mount *, int, struct kauth_cred *); \
293int fsname##_vget(struct mount *, ino_t, struct vnode **); \
294int fsname##_loadvnode(struct mount *, struct vnode *, \
295 const void *, size_t, const void **); \
296int fsname##_newvnode(struct mount *, struct vnode *, \
297 struct vnode *, struct vattr *, kauth_cred_t, \
298 size_t *, const void **); \
299int fsname##_fhtovp(struct mount *, struct fid *, struct vnode **); \
300int fsname##_vptofh(struct vnode *, struct fid *, size_t *); \
301void fsname##_init(void); \
302void fsname##_reinit(void); \
303void fsname##_done(void); \
304int fsname##_mountroot(void); \
305int fsname##_snapshot(struct mount *, struct vnode *, \
306 struct timespec *); \
307int fsname##_extattrctl(struct mount *, int, struct vnode *, int, \
308 const char *); \
309int fsname##_suspendctl(struct mount *, int)
310
311/*
312 * This operations vector is so wapbl can be wrapped into a filesystem lkm.
313 * XXX Eventually, we want to move this functionality
314 * down into the filesystems themselves so that this isn't needed.
315 */
316struct wapbl_ops {
317 void (*wo_wapbl_discard)(struct wapbl *);
318 int (*wo_wapbl_replay_isopen)(struct wapbl_replay *);
319 int (*wo_wapbl_replay_can_read)(struct wapbl_replay *, daddr_t, long);
320 int (*wo_wapbl_replay_read)(struct wapbl_replay *, void *, daddr_t, long);
321 void (*wo_wapbl_add_buf)(struct wapbl *, struct buf *);
322 void (*wo_wapbl_remove_buf)(struct wapbl *, struct buf *);
323 void (*wo_wapbl_resize_buf)(struct wapbl *, struct buf *, long, long);
324 int (*wo_wapbl_begin)(struct wapbl *, const char *, int);
325 void (*wo_wapbl_end)(struct wapbl *);
326 void (*wo_wapbl_junlock_assert)(struct wapbl *);
327 void (*wo_wapbl_biodone)(struct buf *);
328};
329#define WAPBL_DISCARD(MP) \
330 (*(MP)->mnt_wapbl_op->wo_wapbl_discard)((MP)->mnt_wapbl)
331#define WAPBL_REPLAY_ISOPEN(MP) \
332 (*(MP)->mnt_wapbl_op->wo_wapbl_replay_isopen)((MP)->mnt_wapbl_replay)
333#define WAPBL_REPLAY_CAN_READ(MP, BLK, LEN) \
334 (*(MP)->mnt_wapbl_op->wo_wapbl_replay_can_read)((MP)->mnt_wapbl_replay, \
335 (BLK), (LEN))
336#define WAPBL_REPLAY_READ(MP, DATA, BLK, LEN) \
337 (*(MP)->mnt_wapbl_op->wo_wapbl_replay_read)((MP)->mnt_wapbl_replay, \
338 (DATA), (BLK), (LEN))
339#define WAPBL_ADD_BUF(MP, BP) \
340 (*(MP)->mnt_wapbl_op->wo_wapbl_add_buf)((MP)->mnt_wapbl, (BP))
341#define WAPBL_REMOVE_BUF(MP, BP) \
342 (*(MP)->mnt_wapbl_op->wo_wapbl_remove_buf)((MP)->mnt_wapbl, (BP))
343#define WAPBL_RESIZE_BUF(MP, BP, OLDSZ, OLDCNT) \
344 (*(MP)->mnt_wapbl_op->wo_wapbl_resize_buf)((MP)->mnt_wapbl, (BP), \
345 (OLDSZ), (OLDCNT))
346#define WAPBL_BEGIN(MP) \
347 (*(MP)->mnt_wapbl_op->wo_wapbl_begin)((MP)->mnt_wapbl, \
348 __FILE__, __LINE__)
349#define WAPBL_END(MP) \
350 (*(MP)->mnt_wapbl_op->wo_wapbl_end)((MP)->mnt_wapbl)
351#define WAPBL_JUNLOCK_ASSERT(MP) \
352 (*(MP)->mnt_wapbl_op->wo_wapbl_junlock_assert)((MP)->mnt_wapbl)
353
354struct vfs_hooks {
355 LIST_ENTRY(vfs_hooks) vfs_hooks_list;
356 void (*vh_unmount)(struct mount *);
357 int (*vh_reexport)(struct mount *, const char *, void *);
358 void (*vh_future_expansion_1)(void);
359 void (*vh_future_expansion_2)(void);
360 void (*vh_future_expansion_3)(void);
361 void (*vh_future_expansion_4)(void);
362 void (*vh_future_expansion_5)(void);
363};
364
365void vfs_hooks_init(void);
366int vfs_hooks_attach(struct vfs_hooks *);
367int vfs_hooks_detach(struct vfs_hooks *);
368void vfs_hooks_unmount(struct mount *);
369int vfs_hooks_reexport(struct mount *, const char *, void *);
370
371#endif /* _KERNEL */
372
373/*
374 * Export arguments for local filesystem mount calls.
375 *
376 * This structure is deprecated and is only provided for compatibility
377 * reasons with old binary utilities; several file systems expose an
378 * instance of this structure in their mount arguments structure, thus
379 * needing a padding in place of the old values. This definition cannot
380 * change in the future due to this reason.
381 * XXX: This should be moved to the compat subtree but cannot be done
382 * until we can move the mount args structures themselves.
383 *
384 * The current export_args structure can be found in nfs/nfs.h.
385 */
386struct export_args30 {
387 int ex_flags; /* export related flags */
388 uid_t ex_root; /* mapping for root uid */
389 struct uucred ex_anon; /* mapping for anonymous user */
390 struct sockaddr *ex_addr; /* net address to which exported */
391 int ex_addrlen; /* and the net address length */
392 struct sockaddr *ex_mask; /* mask of valid bits in saddr */
393 int ex_masklen; /* and the smask length */
394 char *ex_indexfile; /* index file for WebNFS URLs */
395};
396
397struct mnt_export_args30 {
398 const char *fspec; /* Always NULL */
399 struct export_args30 eargs;
400};
401
402#ifdef _KERNEL
403
404/*
405 * exported VFS interface (see vfssubr(9))
406 */
407struct mount *vfs_getvfs(fsid_t *); /* return vfs given fsid */
408int vfs_composefh(struct vnode *, fhandle_t *, size_t *);
409int vfs_composefh_alloc(struct vnode *, fhandle_t **);
410void vfs_composefh_free(fhandle_t *);
411int vfs_fhtovp(fhandle_t *, struct vnode **);
412int vfs_mountedon(struct vnode *);/* is a vfs mounted on vp */
413int vfs_mountroot(void);
414void vfs_shutdown(void); /* unmount and sync file systems */
415void vfs_sync_all(struct lwp *);
416bool vfs_unmountall(struct lwp *); /* unmount file systems */
417bool vfs_unmountall1(struct lwp *, bool, bool);
418bool vfs_unmount_forceone(struct lwp *);
419int vfs_busy(struct mount *, struct mount **);
420int vfs_rootmountalloc(const char *, const char *, struct mount **);
421void vfs_unbusy(struct mount *, bool, struct mount **);
422int vfs_attach(struct vfsops *);
423int vfs_detach(struct vfsops *);
424void vfs_reinit(void);
425struct vfsops *vfs_getopsbyname(const char *);
426void vfs_delref(struct vfsops *);
427void vfs_destroy(struct mount *);
428struct mount *vfs_mountalloc(struct vfsops *, struct vnode *);
429int vfs_stdextattrctl(struct mount *, int, struct vnode *,
430 int, const char *);
431void vfs_insmntque(struct vnode *, struct mount *);
432int vfs_quotactl_stat(struct mount *, struct quotastat *);
433int vfs_quotactl_idtypestat(struct mount *, int, struct quotaidtypestat *);
434int vfs_quotactl_objtypestat(struct mount *,int,struct quotaobjtypestat *);
435int vfs_quotactl_get(struct mount *, const struct quotakey *,
436 struct quotaval *);
437int vfs_quotactl_put(struct mount *, const struct quotakey *,
438 const struct quotaval *);
439int vfs_quotactl_del(struct mount *, const struct quotakey *);
440int vfs_quotactl_cursoropen(struct mount *, struct quotakcursor *);
441int vfs_quotactl_cursorclose(struct mount *, struct quotakcursor *);
442int vfs_quotactl_cursorskipidtype(struct mount *, struct quotakcursor *,
443 int);
444int vfs_quotactl_cursorget(struct mount *, struct quotakcursor *,
445 struct quotakey *, struct quotaval *, unsigned, unsigned *);
446int vfs_quotactl_cursoratend(struct mount *, struct quotakcursor *, int *);
447int vfs_quotactl_cursorrewind(struct mount *, struct quotakcursor *);
448int vfs_quotactl_quotaon(struct mount *, int, const char *);
449int vfs_quotactl_quotaoff(struct mount *, int);
450
451struct vnode_iterator; /* Opaque. */
452void vfs_vnode_iterator_init(struct mount *, struct vnode_iterator **);
453void vfs_vnode_iterator_destroy(struct vnode_iterator *);
454struct vnode *vfs_vnode_iterator_next(struct vnode_iterator *,
455 bool (*)(void *, struct vnode *), void *);
456
457/* Syncer */
458extern int syncer_maxdelay;
459extern kmutex_t syncer_mutex;
460extern time_t syncdelay;
461extern time_t filedelay;
462extern time_t dirdelay;
463extern time_t metadelay;
464void vfs_syncer_add_to_worklist(struct mount *);
465void vfs_syncer_remove_from_worklist(struct mount *);
466
467extern TAILQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */
468extern struct vfsops *vfssw[]; /* filesystem type table */
469extern int nvfssw;
470extern kmutex_t mountlist_lock;
471extern kmutex_t vfs_list_lock;
472
473void vfs_mount_sysinit(void);
474long makefstype(const char *);
475int mount_domount(struct lwp *, struct vnode **, struct vfsops *,
476 const char *, int, void *, size_t *);
477int dounmount(struct mount *, int, struct lwp *);
478int do_sys_mount(struct lwp *, const char *, enum uio_seg, const char *,
479 int, void *, enum uio_seg, size_t, register_t *);
480void vfsinit(void);
481void vfs_opv_init(const struct vnodeopv_desc * const *);
482void vfs_opv_free(const struct vnodeopv_desc * const *);
483#ifdef DEBUG
484void vfs_bufstats(void);
485#endif
486
487int mount_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
488void mount_specific_key_delete(specificdata_key_t);
489void mount_initspecific(struct mount *);
490void mount_finispecific(struct mount *);
491void * mount_getspecific(struct mount *, specificdata_key_t);
492void mount_setspecific(struct mount *, specificdata_key_t, void *);
493
494int usermount_common_policy(struct mount *, u_long);
495void mountlist_append(struct mount *);
496
497LIST_HEAD(vfs_list_head, vfsops);
498extern struct vfs_list_head vfs_list;
499
500#else /* _KERNEL */
501
502#include <sys/cdefs.h>
503
504__BEGIN_DECLS
505#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
506int getfh(const char *, void *, size_t *)
507 __RENAME(__getfh30);
508#endif
509
510int unmount(const char *, int);
511#if defined(_NETBSD_SOURCE)
512#ifndef __LIBC12_SOURCE__
513int mount(const char *, const char *, int, void *, size_t) __RENAME(__mount50);
514int fhopen(const void *, size_t, int) __RENAME(__fhopen40);
515int fhstat(const void *, size_t, struct stat *) __RENAME(__fhstat50);
516#endif
517#endif /* _NETBSD_SOURCE */
518__END_DECLS
519
520#endif /* _KERNEL */
521#endif /* !_STANDALONE */
522
523#endif /* !_SYS_MOUNT_H_ */
524