#ifndef _SYS_MOUNT_H_
#define _SYS_MOUNT_H_
#ifndef _KERNEL
#include <sys/featuretest.h>
#if defined(_NETBSD_SOURCE)
#include <sys/stat.h>
#endif
#endif
#ifndef _STANDALONE
#include <sys/param.h>
#include <sys/time.h>
#include <sys/ucred.h>
#include <sys/fstypes.h>
#include <sys/statvfs.h>
#if defined(_KERNEL) || defined(__EXPOSE_MOUNT)
#include <sys/uio.h>
#include <sys/queue.h>
#include <sys/rwlock.h>
#include <sys/specificdata.h>
#include <sys/condvar.h>
#endif
#endif
#define MNAMELEN 90
#define MOUNT_FFS "ffs"
#define MOUNT_UFS MOUNT_FFS
#define MOUNT_NFS "nfs"
#define MOUNT_MFS "mfs"
#define MOUNT_MSDOS "msdos"
#define MOUNT_LFS "lfs"
#define MOUNT_FDESC "fdesc"
#define MOUNT_NULL "null"
#define MOUNT_OVERLAY "overlay"
#define MOUNT_UMAP "umap"
#define MOUNT_KERNFS "kernfs"
#define MOUNT_PROCFS "procfs"
#define MOUNT_AFS "afs"
#define MOUNT_CD9660 "cd9660"
#define MOUNT_UNION "union"
#define MOUNT_ADOSFS "adosfs"
#define MOUNT_EXT2FS "ext2fs"
#define MOUNT_CFS "coda"
#define MOUNT_CODA MOUNT_CFS
#define MOUNT_FILECORE "filecore"
#define MOUNT_NTFS "ntfs"
#define MOUNT_SMBFS "smbfs"
#define MOUNT_PTYFS "ptyfs"
#define MOUNT_TMPFS "tmpfs"
#define MOUNT_UDF "udf"
#define MOUNT_SYSVBFS "sysvbfs"
#define MOUNT_PUFFS "puffs"
#define MOUNT_HFS "hfs"
#define MOUNT_EFS "efs"
#define MOUNT_ZFS "zfs"
#define MOUNT_NILFS "nilfs"
#define MOUNT_RUMPFS "rumpfs"
#define MOUNT_V7FS "v7fs"
#define MOUNT_AUTOFS "autofs"
#define VFS_GENERIC 0
#define VFS_MAXTYPENUM 1
#define VFS_CONF 2
#define VFS_USERMOUNT 3
#define VFS_MAGICLINKS 4
#define VFS_TIMESTAMP_PRECISION 5
#define VQ_MOUNT 0x0001
#define VQ_UNMOUNT 0x0002
#ifndef _STANDALONE
#if defined(_KERNEL) || defined(__EXPOSE_MOUNT)
struct vnode;
struct vnode_impl;
struct vattr;
struct mount {
kmutex_t *mnt_vnodelock;
struct vfsops *mnt_op;
struct vnode *mnt_vnodecovered;
struct mount *mnt_lower;
void *mnt_data;
kmutex_t *mnt_renamelock;
int mnt_flag;
int mnt_iflag;
int mnt_fs_bshift;
int mnt_dev_bshift;
specificdata_reference
mnt_specdataref;
kmutex_t *mnt_updating;
const struct wapbl_ops
*mnt_wapbl_op;
struct wapbl *mnt_wapbl;
struct wapbl_replay
*mnt_wapbl_replay;
uint64_t mnt_gen;
int mnt_refcnt
__aligned(COHERENCY_UNIT);
int mnt_synclist_slot;
TAILQ_HEAD(, vnode_impl) mnt_vnodelist;
struct statvfs mnt_stat;
};
#endif
#ifdef _KERNEL
struct quotactl_args;
struct quotastat;
struct quotaidtypestat;
struct quotaobjtypestat;
struct quotakcursor;
struct quotakey;
struct quotaval;
struct vfsops {
const char *vfs_name;
size_t vfs_min_mount_data;
int (*vfs_mount) (struct mount *, const char *, void *,
size_t *);
int (*vfs_start) (struct mount *, int);
int (*vfs_unmount) (struct mount *, int);
int (*vfs_root) (struct mount *, int, struct vnode **);
int (*vfs_quotactl) (struct mount *, struct quotactl_args *);
int (*vfs_statvfs) (struct mount *, struct statvfs *);
int (*vfs_sync) (struct mount *, int, struct kauth_cred *);
int (*vfs_vget) (struct mount *, ino_t, int, struct vnode **);
int (*vfs_loadvnode) (struct mount *, struct vnode *,
const void *, size_t, const void **);
int (*vfs_newvnode) (struct mount *, struct vnode *, struct vnode *,
struct vattr *, kauth_cred_t, void *,
size_t *, const void **);
int (*vfs_fhtovp) (struct mount *, struct fid *, int,
struct vnode **);
int (*vfs_vptofh) (struct vnode *, struct fid *, size_t *);
void (*vfs_init) (void);
void (*vfs_reinit) (void);
void (*vfs_done) (void);
int (*vfs_mountroot)(void);
int (*vfs_snapshot) (struct mount *, struct vnode *,
struct timespec *);
int (*vfs_extattrctl) (struct mount *, int,
struct vnode *, int, const char *);
int (*vfs_suspendctl) (struct mount *, int);
int (*vfs_renamelock_enter)(struct mount *);
void (*vfs_renamelock_exit)(struct mount *);
int (*vfs_fsync) (struct vnode *, int);
const struct vnodeopv_desc * const *vfs_opv_descs;
int vfs_refcount;
LIST_ENTRY(vfsops) vfs_list;
};
#define VFS_VGET(MP, INO, LK, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, LK, VPP)
#define VFS_LOADVNODE(MP, VP, KEY, KEY_LEN, NEW_KEY) \
(*(MP)->mnt_op->vfs_loadvnode)(MP, VP, KEY, KEY_LEN, NEW_KEY)
#define VFS_NEWVNODE(MP, DVP, VP, VAP, CRED, EXTRA, NEW_LEN, NEW_KEY) \
(*(MP)->mnt_op->vfs_newvnode)(MP, DVP, VP, VAP, CRED, EXTRA, \
NEW_LEN, NEW_KEY)
#define VFS_RENAMELOCK_ENTER(MP) (*(MP)->mnt_op->vfs_renamelock_enter)(MP)
#define VFS_RENAMELOCK_EXIT(MP) (*(MP)->mnt_op->vfs_renamelock_exit)(MP)
#define VFS_FSYNC(MP, VP, FLG) (*(MP)->mnt_op->vfs_fsync)(VP, FLG)
int VFS_MOUNT(struct mount *, const char *, void *, size_t *);
int VFS_START(struct mount *, int);
int VFS_UNMOUNT(struct mount *, int);
int VFS_ROOT(struct mount *, int, struct vnode **);
int VFS_QUOTACTL(struct mount *, struct quotactl_args *);
int VFS_STATVFS(struct mount *, struct statvfs *);
int VFS_SYNC(struct mount *, int, struct kauth_cred *);
int VFS_FHTOVP(struct mount *, struct fid *, int, struct vnode **);
int VFS_VPTOFH(struct vnode *, struct fid *, size_t *);
int VFS_SNAPSHOT(struct mount *, struct vnode *, struct timespec *);
int VFS_EXTATTRCTL(struct mount *, int, struct vnode *, int, const char *);
int VFS_SUSPENDCTL(struct mount *, int);
struct vnodeopv_desc;
struct kauth_cred;
#define VFS_MAX_MOUNT_DATA 8192
#define VFS_PROTOS(fsname) \
int fsname##_mount(struct mount *, const char *, void *, \
size_t *); \
int fsname##_start(struct mount *, int); \
int fsname##_unmount(struct mount *, int); \
int fsname##_root(struct mount *, int, struct vnode **); \
int fsname##_quotactl(struct mount *, struct quotactl_args *); \
int fsname##_statvfs(struct mount *, struct statvfs *); \
int fsname##_sync(struct mount *, int, struct kauth_cred *); \
int fsname##_vget(struct mount *, ino_t, int, struct vnode **); \
int fsname##_loadvnode(struct mount *, struct vnode *, \
const void *, size_t, const void **); \
int fsname##_newvnode(struct mount *, struct vnode *, \
struct vnode *, struct vattr *, kauth_cred_t, void *, \
size_t *, const void **); \
int fsname##_fhtovp(struct mount *, struct fid *, int, struct vnode **);\
int fsname##_vptofh(struct vnode *, struct fid *, size_t *); \
void fsname##_init(void); \
void fsname##_reinit(void); \
void fsname##_done(void); \
int fsname##_mountroot(void); \
int fsname##_snapshot(struct mount *, struct vnode *, \
struct timespec *); \
int fsname##_extattrctl(struct mount *, int, struct vnode *, int, \
const char *); \
int fsname##_suspendctl(struct mount *, int)
struct wapbl_ops {
void (*wo_wapbl_discard)(struct wapbl *);
int (*wo_wapbl_replay_isopen)(struct wapbl_replay *);
int (*wo_wapbl_replay_can_read)(struct wapbl_replay *, daddr_t, long);
int (*wo_wapbl_replay_read)(struct wapbl_replay *, void *, daddr_t, long);
void (*wo_wapbl_add_buf)(struct wapbl *, struct buf *);
void (*wo_wapbl_remove_buf)(struct wapbl *, struct buf *);
void (*wo_wapbl_resize_buf)(struct wapbl *, struct buf *, long, long);
int (*wo_wapbl_begin)(struct wapbl *, const char *, int);
void (*wo_wapbl_end)(struct wapbl *);
void (*wo_wapbl_junlock_assert)(struct wapbl *);
void (*wo_wapbl_jlock_assert)(struct wapbl *);
void (*wo_wapbl_biodone)(struct buf *);
};
#define WAPBL_DISCARD(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_discard)((MP)->mnt_wapbl)
#define WAPBL_REPLAY_ISOPEN(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_replay_isopen)((MP)->mnt_wapbl_replay)
#define WAPBL_REPLAY_CAN_READ(MP, BLK, LEN) \
(*(MP)->mnt_wapbl_op->wo_wapbl_replay_can_read)((MP)->mnt_wapbl_replay, \
(BLK), (LEN))
#define WAPBL_REPLAY_READ(MP, DATA, BLK, LEN) \
(*(MP)->mnt_wapbl_op->wo_wapbl_replay_read)((MP)->mnt_wapbl_replay, \
(DATA), (BLK), (LEN))
#define WAPBL_ADD_BUF(MP, BP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_add_buf)((MP)->mnt_wapbl, (BP))
#define WAPBL_REMOVE_BUF(MP, BP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_remove_buf)((MP)->mnt_wapbl, (BP))
#define WAPBL_RESIZE_BUF(MP, BP, OLDSZ, OLDCNT) \
(*(MP)->mnt_wapbl_op->wo_wapbl_resize_buf)((MP)->mnt_wapbl, (BP), \
(OLDSZ), (OLDCNT))
#define WAPBL_BEGIN(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_begin)((MP)->mnt_wapbl, \
__FILE__, __LINE__)
#define WAPBL_END(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_end)((MP)->mnt_wapbl)
#define WAPBL_JUNLOCK_ASSERT(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_junlock_assert)((MP)->mnt_wapbl)
#define WAPBL_JLOCK_ASSERT(MP) \
(*(MP)->mnt_wapbl_op->wo_wapbl_jlock_assert)((MP)->mnt_wapbl)
struct vfs_hooks {
LIST_ENTRY(vfs_hooks) vfs_hooks_list;
void (*vh_unmount)(struct mount *);
int (*vh_reexport)(struct mount *, const char *, void *);
void (*vh_future_expansion_1)(void);
void (*vh_future_expansion_2)(void);
void (*vh_future_expansion_3)(void);
void (*vh_future_expansion_4)(void);
void (*vh_future_expansion_5)(void);
};
void vfs_hooks_init(void);
int vfs_hooks_attach(struct vfs_hooks *);
int vfs_hooks_detach(struct vfs_hooks *);
void vfs_hooks_unmount(struct mount *);
int vfs_hooks_reexport(struct mount *, const char *, void *);
#endif
struct export_args30 {
int ex_flags;
uid_t ex_root;
struct uucred ex_anon;
struct sockaddr *ex_addr;
int ex_addrlen;
struct sockaddr *ex_mask;
int ex_masklen;
char *ex_indexfile;
};
struct mnt_export_args30 {
const char *fspec;
struct export_args30 eargs;
};
#ifdef _KERNEL
struct mount *vfs_getvfs(fsid_t *);
int vfs_composefh(struct vnode *, fhandle_t *, size_t *);
int vfs_composefh_alloc(struct vnode *, fhandle_t **);
void vfs_composefh_free(fhandle_t *);
int vfs_fhtovp(fhandle_t *, struct vnode **);
int vfs_mountedon(struct vnode *);
int vfs_mountroot(void);
void vfs_shutdown(void);
void vfs_sync_all(struct lwp *);
bool vfs_unmountall(struct lwp *);
bool vfs_unmountall1(struct lwp *, bool, bool);
bool vfs_unmount_forceone(struct lwp *);
int vfs_busy(struct mount *);
int vfs_trybusy(struct mount *);
int vfs_rootmountalloc(const char *, const char *, struct mount **);
void vfs_unbusy(struct mount *);
int vfs_set_lowermount(struct mount *, struct mount *);
int vfs_attach(struct vfsops *);
int vfs_detach(struct vfsops *);
void vfs_reinit(void);
struct vfsops *vfs_getopsbyname(const char *);
void vfs_delref(struct vfsops *);
void vfs_ref(struct mount *);
void vfs_rele(struct mount *);
struct mount *vfs_mountalloc(struct vfsops *, struct vnode *);
int vfs_stdextattrctl(struct mount *, int, struct vnode *,
int, const char *);
void vfs_insmntque(struct vnode *, struct mount *);
int vfs_quotactl_stat(struct mount *, struct quotastat *);
int vfs_quotactl_idtypestat(struct mount *, int, struct quotaidtypestat *);
int vfs_quotactl_objtypestat(struct mount *,int,struct quotaobjtypestat *);
int vfs_quotactl_get(struct mount *, const struct quotakey *,
struct quotaval *);
int vfs_quotactl_put(struct mount *, const struct quotakey *,
const struct quotaval *);
int vfs_quotactl_del(struct mount *, const struct quotakey *);
int vfs_quotactl_cursoropen(struct mount *, struct quotakcursor *);
int vfs_quotactl_cursorclose(struct mount *, struct quotakcursor *);
int vfs_quotactl_cursorskipidtype(struct mount *, struct quotakcursor *,
int);
int vfs_quotactl_cursorget(struct mount *, struct quotakcursor *,
struct quotakey *, struct quotaval *, unsigned, unsigned *);
int vfs_quotactl_cursoratend(struct mount *, struct quotakcursor *, int *);
int vfs_quotactl_cursorrewind(struct mount *, struct quotakcursor *);
int vfs_quotactl_quotaon(struct mount *, int, const char *);
int vfs_quotactl_quotaoff(struct mount *, int);
struct vnode_iterator;
void vfs_vnode_iterator_init(struct mount *, struct vnode_iterator **);
void vfs_vnode_iterator_destroy(struct vnode_iterator *);
struct vnode *vfs_vnode_iterator_next(struct vnode_iterator *,
bool (*)(void *, struct vnode *), void *);
extern int syncer_maxdelay;
extern time_t syncdelay;
extern time_t filedelay;
extern time_t dirdelay;
extern time_t metadelay;
void vfs_syncer_add_to_worklist(struct mount *);
void vfs_syncer_remove_from_worklist(struct mount *);
extern int vfs_magiclinks;
extern int vfs_timestamp_precision;
extern struct vfsops *vfssw[];
extern int nvfssw;
extern kmutex_t vfs_list_lock;
void vfs_mount_sysinit(void);
long makefstype(const char *);
int mount_domount(struct lwp *, struct vnode **, struct vfsops *,
const char *, int, void *, size_t *);
int dounmount(struct mount *, int, struct lwp *);
int do_sys_mount(struct lwp *, const char *, enum uio_seg, const char *,
int, void *, enum uio_seg, size_t, register_t *);
void vfsinit(void);
void vfs_evfilt_fs_init(void);
void vfs_opv_init(const struct vnodeopv_desc * const *);
void vfs_opv_free(const struct vnodeopv_desc * const *);
#ifdef DEBUG
void vfs_bufstats(void);
#endif
int mount_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
void mount_specific_key_delete(specificdata_key_t);
void mount_initspecific(struct mount *);
void mount_finispecific(struct mount *);
void * mount_getspecific(struct mount *, specificdata_key_t);
void mount_setspecific(struct mount *, specificdata_key_t, void *);
int usermount_common_policy(struct mount *, u_long);
typedef struct mount_iterator mount_iterator_t;
void mountlist_iterator_init(mount_iterator_t **);
void mountlist_iterator_destroy(mount_iterator_t *);
struct mount *mountlist_iterator_next(mount_iterator_t *);
struct mount *mountlist_iterator_trynext(mount_iterator_t *);
struct mount *_mountlist_next(struct mount *);
void mountlist_append(struct mount *);
void mountlist_remove(struct mount *);
LIST_HEAD(vfs_list_head, vfsops);
extern struct vfs_list_head vfs_list;
#else
#include <sys/cdefs.h>
__BEGIN_DECLS
#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
int getfh(const char *, void *, size_t *)
__RENAME(__getfh30);
#endif
int unmount(const char *, int);
#if defined(_NETBSD_SOURCE)
#ifndef __LIBC12_SOURCE__
int mount(const char *, const char *, int, void *, size_t) __RENAME(__mount50);
int fhopen(const void *, size_t, int) __RENAME(__fhopen40);
int fhstat(const void *, size_t, struct stat *) __RENAME(__fhstat50);
#endif
#endif
__END_DECLS
#endif
#endif
#endif