Each file system type known to the kernel has a vfsconf structure that contains the information required
to create a new mount of that file systems type.
struct vfsconf {
struct vfsops *vfc_vfsops; /* file system operations vector */
char vfc_name[MFSNAMELEN]; /* file system type name */
int vfc_typenum; /* historic file system type number */
int vfc_refcount; /* number mounted of this type */
int vfc_flags; /* permanent flags */
struct vfsconf *vfc_next; /* next in list */
};
When a new file system is mounted, mount(2) does a lookup of the vfsconf structure by its name, and if it
is not already registered, attempts to load a kernel module for it. The file system operations for the
new mount point are taken from vfc_vfsops, and mnt_vfc in the mount structure is made to point directly
at the vfsconf structure for the file system type. The file system type number is taken from vfc_typenum
which was assigned in vfs_register(), and the mount flags are taken from a mask of vfc_flags. Each time
a file system of a given type is mounted, vfc_refcount is incremented.
vfs_register() takes a new vfsconf structure and adds it to the list of existing file systems. If the
type has not already been registered, it is initialized by calling the vfs_init() function in the file
system operations vector. vfs_register() also updates the oid's of any sysctl nodes for this file system
type to be the same as the newly assigned type number.
vfs_unregister() unlinks vfc from the list of registered file system types if there are currently no
mounted instances. If the vfs_uninit() function in the file systems initialization vector is defined, it
is called.
vfs_modevent() is registered by VFS_SET() to handle the loading and unloading of file system kernel
modules. In the case of MOD_LOAD, vfs_register() is called. In the case of MOD_UNLOAD, vfs_unregister()
is called.