NAME
vfsops
, VFS_MOUNT
,
VFS_START
, VFS_UNMOUNT
,
VFS_ROOT
, VFS_QUOTACTL
,
VFS_STATVFS
, VFS_SYNC
,
VFS_VGET
, VFS_LOADVNODE
,
VFS_NEWVNODE
, VFS_FHTOVP
,
VFS_VPTOFH
, VFS_SNAPSHOT
,
VFS_SUSPENDCTL
—
kernel file system interface
SYNOPSIS
#include
<sys/param.h>
#include <sys/mount.h>
#include <sys/vnode.h>
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, struct
quotactl_args *args);
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_LOADVNODE
(struct
mount *mp, struct vnode
*vp, const void
*key, size_t
key_len, const void
**new_key);
int
VFS_NEWVNODE
(struct
mount *mp, struct vnode
*dvp, struct vnode
*vp, struct vattr
*vap, kauth_cred_t
cred, void *extra,
size_t *key_len,
const void
**new_key);
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);
DESCRIPTION
In a similar fashion to the vnode(9) interface, all operations that are done on a file system are conducted through a single interface that allows the system to carry out operations on a file system without knowing its construction or type.
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.
Vector element | Macro | Description |
int (*vfs_mount)() | VFS_MOUNT |
Mount a file system |
int (*vfs_start)() | VFS_START |
Make operational |
int (*vfs_unmount)() | VFS_UNMOUNT |
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_loadvnode)() | VFS_LOADVNODE |
Initialze vnode with file |
int (*vfs_loadvnode)() | VFS_NEWVNODE |
Initialze vnode with new file |
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.
FUNCTIONS
VFS_MOUNT
(mp, path, data, dlen)- Mount a file system specified by the mount structure
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 flagMNT_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 specifyingMNT_GETARGS
. If neitherMNT_UPDATE
orMNT_GETARGS
are specified, a new file system will attempted to be mounted. VFS_START
(mp, flags)- Make the file system specified by the mount structure
mp operational. The argument
flags is a set of flags for controlling the
operation of
VFS_START
(). This function is invoked afterVFS_MOUNT
() and before the first access to the file system. VFS_UNMOUNT
(mp, mntflags)- Unmount a file system specified by the mount structure
mp.
VFS_UNMOUNT
() performs any file system type specific operations required before the file system is unmounted, such are flushing buffers. IfMNT_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. VFS_ROOT
(mp, vpp)- Get the root vnode of the file system specified by the mount structure 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.
VFS_QUOTACTL
(mp, args)- Query/modify user space quotas for the file system specified by the mount structure mp. The argument structure provides the operation ID and arguments to perform. This is the same interface as documented in __quotactl(2) except that the file system argument has been resolved. All copyin(9) and copyout(9) processing is handled by code above the file system.
VFS_STATVFS
(mp, sbp)- Get file system statistics for the file system specified by the mount
structure 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. VFS_SYNC
(mp, waitfor, cred)- Flush file system I/O buffers for the file system specified by the mount
structure 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. VFS_VGET
(mp, ino, vpp)- Get vnode for a file system type specific file id
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
. VFS_LOADVNODE
(mp, vp, key, key_len, new_key)- Initialise the vnode vp with the file identified by
the arguments key and key_len
for the file system specified by the mount structure
mp.
The new key is returned in the address specified by new_key.
Caller of this function assures no other thread will try to load this file.
VFS_NEWVNODE
(mp, dvp, vp, vap, cred, key_len, new_key)- Initialise the vnode vp with a new file for the file
system specified by the mount structure mp.
The argument dvp points to the directory to create the file in.
The argument vap points to the attributes for the file to create.
The argument cred holds the credentials for the file to create.
The argument extra allows the caller to pass more information about the file to create.
The key for the file is returned in the addresses specified by key_len and new_key.
VFS_FHTOVP
(mp, fhp, vpp)- Get the vnode for the file handle 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 tonetexport_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
. VFS_VPTOFH
(vp, fhp, fh_size)- Get a file handle for the vnode specified by 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 andE2BIG
should be returned.If file handles are not supported by the file system, this function must return
EOPNOTSUPP
. VFS_SNAPSHOT
(mp, vp, ts)- Take a snapshot of the file system specified by the mount structure
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 returnEOPNOTSUPP
. VFS_SUSPENDCTL
(mp, cmd)- Suspend or resume all operations on this file system.
cmd is either
SUSPEND_SUSPEND
to suspend orSUSPEND_RESUME
to resume operations. If the file system does not support this function, it should returnEOPNOTSUPP
.
CODE REFERENCES
The vfs operations are implemented within the files sys/kern/vfs_subr.c and sys/kern/vfs_init.c.
SEE ALSO
intro(9), namei(9), vfs(9), vfssubr(9), vnode(9), vnodeops(9)
HISTORY
The vfs operations vector, its functions and the corresponding macros appeared in 4.3BSD.