VFSOPS(9) | Kernel Developer's Manual | VFSOPS(9) |
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
—
#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);
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.
VFS_MOUNT
(mp,
path, data,
dlen)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.
VFS_START
(mp,
flags)VFS_START
(). This function is invoked
after VFS_MOUNT
() and before the first access to
the file system.VFS_UNMOUNT
(mp,
mntflags)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.VFS_ROOT
(mp,
vpp)VFS_QUOTACTL
(mp,
args)VFS_STATVFS
(mp,
sbp)VFS_STATVFS
() is the file system type specific
implementation of the
statvfs(2) and
fstatvfs(2) system
calls.VFS_SYNC
(mp,
waitfor, cred)VFS_SYNC
() does not provide any
return value since the operation can never fail.VFS_VGET
(mp,
ino, vpp)EOPNOTSUPP
.VFS_LOADVNODE
(mp,
vp, key,
key_len, new_key)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)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)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
.
VFS_VPTOFH
(vp,
fhp, fh_size)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
.
VFS_SNAPSHOT
(mp,
vp, ts)NULL
it will receive the time this snapshot was
taken. If the file system does not support this function, it should return
EOPNOTSUPP
.VFS_SUSPENDCTL
(mp,
cmd)SUSPEND_SUSPEND
to suspend or
SUSPEND_RESUME
to resume operations. If the file
system does not support this function, it should return
EOPNOTSUPP
.January 1, 2019 | NetBSD 9.0 |