int
VFS_MOUNT(
struct mount *mp
const char *path
void *data
size_t *dlen
)
int
VFS_START(
struct mount *mp
, int flags
)
int
VFS_UNMOUNT(
struct mount *mp
, int mntflags
)
int
VFS_ROOT(
struct mount *mp
, struct vnode **vpp
)
int
VFS_QUOTACTL(
struct mount *mp
, int cmds
, uid_t uid
, void *arg
)
int
VFS_STATVFS(
struct mount *mp
, struct statvfs *sbp
)
int
VFS_SYNC(
struct mount *mp
, int waitfor
, kauth_cred_t cred
)
int
VFS_VGET(
struct mount *mp
, ino_t ino
, struct vnode **vpp
)
int
VFS_FHTOVP(
struct mount *mp
, struct fid *fhp
, struct vnode **vpp
)
int
VFS_VPTOFH(
struct vnode *vp
, struct fid *fhp
, size_t *fh_size
)
int
VFS_SNAPSHOT(
struct mount *mp
, struct vnode *vp
, struct timespec *ts
)
int
VFS_SUSPENDCTL(
struct mount *mp
, int cmd
)
All supported file systems in the kernel have an entry in the
vfs_list_initial
table.
This table is generated by
config(1)
and is a
NULL
-terminated
list of
vfsops
structures.
The vfsops structure describes the operations that can be done to a
specific file system type.
The following table lists the elements of the vfsops vector, the
corresponding invocation macro, and a description of the element.
_V_e_c_t_o_r _e_l_e_m_e_n_t _M_a_c_r_o _D_e_s_c_r_i_p_t_i_o_n
int (*vfs_mount)() VFS_MOUNT Mount a file system int (*vfs_start)() VFS_START Make operational int (*vfs_unmount)() VFS_UMOUNT Unmount a file system int (*vfs_root)() VFS_ROOT Get the file system root vnode int (*vfs_quotactl)() VFS_QUOTACTL Query/modify space quotas int (*vfs_statvfs)() VFS_STATVFS Get file system statistics int (*vfs_sync)() VFS_SYNC Flush file system buffers int (*vfs_vget)() VFS_VGET Get vnode from file id int (*vfs_fhtovp)() VFS_FHTOVP NFS file handle to vnode lookup int (*vfs_vptofh)() VFS_VPTOFH Vnode to NFS file handle lookup void (*vfs_init)() - Initialize file system void (*vfs_reinit)() - Reinitialize file system void (*vfs_done)() - Cleanup unmounted file system int (*vfs_mountroot)() - Mount the root file system int (*vfs_snapshot)() VFS_SNAPSHOT Take a snapshot int (*vfs_suspendctl)() VFS_SUSPENDCTL Suspend or resume
Some additional non-function members of the vfsops structure are the
file system name
vfs_name
and a reference count
vfs_refcount.
It is not mandatory for a file system type to support a particular
operation, but it must assign each member function pointer to a
suitable function to do the minimum required of it.
In most cases, such functions either do nothing or return an error
value to the effect that it is not supported.
vfs_reinit,
vfs_mountroot,
vfs_fhtovp,
and
vfs_vptofh
may
be
NULL
.
At system boot, each file system with an entry in vfs_list_initial is established and initialized. Each initialized file system is recorded by the kernel in the list vfs_list and the file system specific initialization function vfs_init in its vfsops vector is invoked. When the file system is no longer needed vfs_done is invoked to run file system specific cleanups and the file system is removed from the kernel list.
At system boot, the root file system is mounted by invoking the file system type specific vfs_mountroot function in the vfsops vector. All file systems that can be mounted as a root file system must define this function. It is responsible for initializing to list of mount structures for all future mounted file systems.
Kernel state which affects a specific file system type can be queried and modified using the sysctl(8) interface.
mp
, path
, data
, dlen
)
mp
on the mount point described by
path
.
The argument
data
contains file system type specific data, while the argument
dlen
points to a location specifying the length of the data.
VFS_MOUNT()
initializes the mount structure for the mounted file system.
This structure records mount-specific information for the file system and
records the list of vnodes associated with the file system.
This function is invoked both to mount new file systems and to change the
attributes of an existing file system.
If the flag MNT_UPDATE is set in
mp->mnt_flag,
the file system should update its state.
This can be used, for instance, to convert a read-only file system to
read-write.
The current attributes for a mounted file system can be fetched by
specifying
MNT_GETARGS
.
If neither
MNT_UPDATE
or
MNT_GETARGS
are specified, a new file system will attempted to be mounted.
mp
, flags
)
mp
operational.
The argument
flags
is a set of flags for controlling the operation of
VFS_START(
).
This function is invoked after
VFS_MOUNT(
)
and before the first access to the file system.
mp
, mntflags
)
mp
.
VFS_UNMOUNT(
)
performs any file system type specific operations required before the
file system is unmounted, such are flushing buffers.
If MNT_FORCE is specified in the flags
mntflags
then open files are forcibly closed.
The function also deallocates space associated with data structure
that were allocated for the file system when it was mounted.
mp
, vpp
)
mp
.
The vnode is returned in the address given by
vpp
.
This function is used by the pathname translation algorithms when a
vnode that has been covered by a mounted file system is encountered.
While resolving the pathname, the pathname translation algorithm will
have to go through the directory tree in the file system associated
with that mount point and therefore requires the root vnode of the
file system.
mp
, cmds
, uid
, arg
)
mp
.
The argument specifies the control command to perform.
The userid is specified in
id
and
arg
allows command-specific data to be returned to the system call
interface.
VFS_QUOTACTL(
)
is the file system type specific implementation of the
quotactl(2)
system call.
mp
, sbp
)
mp
.
A statvfs structure filled with the statistics is returned in
sbp
.
VFS_STATVFS(
)
is the file system type specific implementation of the
statvfs(2)
and
fstatvfs(2)
system calls.
mp
, waitfor
, cred
)
mp
.
The
waitfor
argument indicates whether a partial flush or complete flush should be
performed.
The argument
cred
specifies the calling credentials.
VFS_SYNC(
)
does not provide any return value since the operation can never fail.
mp
, ino
, vpp
)
ino
for the file system specified by the mount structure
mp
.
The vnode is returned in the address specified
vpp
.
The function is optional for file systems which have a unique id
number for every file in the file system.
It is used internally by the UFS file system and also by the NFSv3
server to implement the READDIRPLUS NFS call.
If the file system does not support this function, it should return
EOPNOTSUPP
.
mp
, fhp
, vpp
)
fhp
in the file system specified by the mount structure
mp
.
The locked vnode is returned in
vpp
.
When exporting, the call to
VFS_FHTOVP()
should follow a call to
netexport_check(
),
which checks if the file is accessible to the client.
If file handles are not supported by the file system, this function
must return
EOPNOTSUPP
.
vp
, fhp
, fh_size
)
vp
.
The file handle is returned in
fhp
.
The contents of the file handle are defined by the file system and are
not examined by any other subsystems.
It should contain enough information to uniquely identify a file within
the file system as well as noticing when a file has been removed and
the file system resources have been recycled for a new file.
The parameter
fh_size
points to the container size for the file handle.
This parameter should be updated to the size of the finished file handle.
Note that it is legal to call this function with
fhp
set to
NULL
in case
fh_size
is zero.
In case
fh_size
indicates a storage space too small, the storage space required for
the file handle corresponding to
vp
should be filled in and
E2BIG
should be returned.
If file handles are not supported by the file system, this function
must return
EOPNOTSUPP
.
mp
, vp
, ts
)
mp
and make it accessible through the locked vnode
vp
.
If
ts
is not
NULL
it will receive the time this snapshot was taken.
If the file system does not support this function, it should return
EOPNOTSUPP
.
mp
, cmd
)
cmd
is either
SUSPEND_SUSPEND
to suspend or
SUSPEND_RESUME
to resume operations.
If the file system does not support this function, it should return
EOPNOTSUPP
.
/usr/src
.
The vfs operations are implemented within the files
sys/kern/vfs_subr.c
,
sys/kern/vfs_subr2.c
and
sys/kern/vfs_init.c
.