FreeBSD kernel kern code
vfs_vnops.c File Reference
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/kdb.h>
#include <sys/stat.h>
#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/mount.h>
#include <sys/mutex.h>
#include <sys/namei.h>
#include <sys/vnode.h>
#include <sys/bio.h>
#include <sys/buf.h>
#include <sys/filio.h>
#include <sys/resourcevar.h>
#include <sys/sx.h>
#include <sys/sysctl.h>
#include <sys/ttycom.h>
#include <sys/conf.h>
#include <sys/syslog.h>
#include <sys/unistd.h>
#include <security/audit/audit.h>
#include <security/mac/mac_framework.h>
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
Include dependency graph for vfs_vnops.c:

Go to the source code of this file.

Functions

 __FBSDID ("$BSDSUniX$")
 
int vn_open (struct nameidata *ndp, int *flagp, int cmode, struct file *fp)
 
int vn_open_cred (struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct ucred *cred, struct file *fp)
 
int vn_writechk (struct vnode *vp)
 
int vn_close (struct vnode *vp, int flags, struct ucred *file_cred, struct thread *td)
 
static int sequential_heuristic (struct uio *uio, struct file *fp)
 
int vn_rdwr (enum uio_rw rw, struct vnode *vp, void *base, int len, off_t offset, enum uio_seg segflg, int ioflg, struct ucred *active_cred, struct ucred *file_cred, ssize_t *aresid, struct thread *td)
 
int vn_rdwr_inchunks (enum uio_rw rw, struct vnode *vp, void *base, size_t len, off_t offset, enum uio_seg segflg, int ioflg, struct ucred *active_cred, struct ucred *file_cred, size_t *aresid, struct thread *td)
 
off_t foffset_lock (struct file *fp, int flags)
 
void foffset_unlock (struct file *fp, off_t val, int flags)
 
void foffset_lock_uio (struct file *fp, struct uio *uio, int flags)
 
void foffset_unlock_uio (struct file *fp, struct uio *uio, int flags)
 
static int get_advice (struct file *fp, struct uio *uio)
 
static int vn_read (struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td)
 
static int vn_write (struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td)
 
 SYSCTL_INT (_debug, OID_AUTO, vn_io_fault_enable, CTLFLAG_RW,&vn_io_fault_enable, 0,"Enable vn_io_fault lock avoidance")
 
 SYSCTL_ULONG (_debug, OID_AUTO, vn_io_faults, CTLFLAG_RD,&vn_io_faults_cnt, 0,"Count of vn_io_fault lock avoidance triggers")
 
static int vn_io_fault (struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td)
 
int vn_io_fault_uiomove (char *data, int xfersize, struct uio *uio)
 
int vn_io_fault_pgmove (vm_page_t ma[], vm_offset_t offset, int xfersize, struct uio *uio)
 
static int vn_truncate (struct file *fp, off_t length, struct ucred *active_cred, struct thread *td)
 
static int vn_statfile (struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td)
 
int vn_stat (struct vnode *vp, struct stat *sb, struct ucred *active_cred, struct ucred *file_cred, struct thread *td)
 
static int vn_ioctl (struct file *fp, u_long com, void *data, struct ucred *active_cred, struct thread *td)
 
static int vn_poll (struct file *fp, int events, struct ucred *active_cred, struct thread *td)
 
int _vn_lock (struct vnode *vp, int flags, char *file, int line)
 
static int vn_closefile (struct file *fp, struct thread *td)
 
static int vn_start_write_locked (struct mount *mp, int flags)
 
int vn_start_write (struct vnode *vp, struct mount **mpp, int flags)
 
int vn_start_secondary_write (struct vnode *vp, struct mount **mpp, int flags)
 
void vn_finished_write (struct mount *mp)
 
void vn_finished_secondary_write (struct mount *mp)
 
int vfs_write_suspend (struct mount *mp)
 
void vfs_write_resume_flags (struct mount *mp, int flags)
 
void vfs_write_resume (struct mount *mp)
 
static int vn_kqfilter (struct file *fp, struct knote *kn)
 
int vn_extattr_get (struct vnode *vp, int ioflg, int attrnamespace, const char *attrname, int *buflen, char *buf, struct thread *td)
 
int vn_extattr_set (struct vnode *vp, int ioflg, int attrnamespace, const char *attrname, int buflen, char *buf, struct thread *td)
 
int vn_extattr_rm (struct vnode *vp, int ioflg, int attrnamespace, const char *attrname, struct thread *td)
 
int vn_vget_ino (struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp)
 
int vn_rlimit_fsize (const struct vnode *vp, const struct uio *uio, const struct thread *td)
 
int vn_chmod (struct file *fp, mode_t mode, struct ucred *active_cred, struct thread *td)
 
int vn_chown (struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, struct thread *td)
 
void vn_pages_remove (struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
 
int vn_bmap_seekhole (struct vnode *vp, u_long cmd, off_t *off, struct ucred *cred)
 

Variables

static fo_rdwr_t vn_read
 
static fo_rdwr_t vn_write
 
static fo_rdwr_t vn_io_fault
 
static fo_truncate_t vn_truncate
 
static fo_ioctl_t vn_ioctl
 
static fo_poll_t vn_poll
 
static fo_kqfilter_t vn_kqfilter
 
static fo_stat_t vn_statfile
 
static fo_close_t vn_closefile
 
struct fileops vnops
 
static const int io_hold_cnt = 16
 
static int vn_io_fault_enable = 0
 
static u_long vn_io_faults_cnt
 

Function Documentation

__FBSDID ( "$BSDSUniX$"  )
int _vn_lock ( struct vnode *  vp,
int  flags,
char *  file,
int  line 
)

Definition at line 1389 of file vfs_vnops.c.

off_t foffset_lock ( struct file *  fp,
int  flags 
)

Definition at line 524 of file vfs_vnops.c.

References mtx_pool_find(), and mtxpool_sleep.

Referenced by foffset_lock_uio(), kern_getdirentries(), and sys_lseek().

Here is the call graph for this function:

Here is the caller graph for this function:

void foffset_lock_uio ( struct file *  fp,
struct uio *  uio,
int  flags 
)

Definition at line 593 of file vfs_vnops.c.

References foffset_lock().

Referenced by vn_io_fault().

Here is the call graph for this function:

Here is the caller graph for this function:

void foffset_unlock ( struct file *  fp,
off_t  val,
int  flags 
)

Definition at line 560 of file vfs_vnops.c.

References mtx_pool_find(), mtxpool_sleep, and wakeup().

Referenced by foffset_unlock_uio(), kern_getdirentries(), and sys_lseek().

Here is the call graph for this function:

Here is the caller graph for this function:

void foffset_unlock_uio ( struct file *  fp,
struct uio *  uio,
int  flags 
)

Definition at line 601 of file vfs_vnops.c.

References foffset_unlock().

Referenced by vn_io_fault().

Here is the call graph for this function:

Here is the caller graph for this function:

static int get_advice ( struct file *  fp,
struct uio *  uio 
)
static

Definition at line 609 of file vfs_vnops.c.

References mtx_pool_find(), and mtxpool_sleep.

Referenced by vn_read(), and vn_write().

Here is the call graph for this function:

Here is the caller graph for this function:

static int sequential_heuristic ( struct uio *  uio,
struct file *  fp 
)
static

Definition at line 337 of file vfs_vnops.c.

Referenced by vn_read(), and vn_write().

Here is the caller graph for this function:

SYSCTL_INT ( _debug  ,
OID_AUTO  ,
vn_io_fault_enable  ,
CTLFLAG_RW  ,
vn_io_fault_enable,
,
"Enable vn_io_fault lock avoidance"   
)
SYSCTL_ULONG ( _debug  ,
OID_AUTO  ,
vn_io_faults  ,
CTLFLAG_RD  ,
vn_io_faults_cnt,
,
"Count of vn_io_fault lock avoidance triggers"   
)
void vfs_write_resume ( struct mount *  mp)

Definition at line 1700 of file vfs_vnops.c.

References vfs_write_resume_flags().

Referenced by vfs_write_suspend().

Here is the call graph for this function:

Here is the caller graph for this function:

void vfs_write_resume_flags ( struct mount *  mp,
int  flags 
)

Definition at line 1672 of file vfs_vnops.c.

References vn_start_write_locked(), and wakeup().

Referenced by vfs_write_resume().

Here is the call graph for this function:

Here is the caller graph for this function:

int vfs_write_suspend ( struct mount *  mp)

Definition at line 1644 of file vfs_vnops.c.

References vfs_write_resume().

Here is the call graph for this function:

int vn_bmap_seekhole ( struct vnode *  vp,
u_long  cmd,
off_t *  off,
struct ucred *  cred 
)

Definition at line 1941 of file vfs_vnops.c.

int vn_chmod ( struct file *  fp,
mode_t  mode,
struct ucred *  active_cred,
struct thread *  td 
)

Definition at line 1891 of file vfs_vnops.c.

References setfmode().

Here is the call graph for this function:

int vn_chown ( struct file *  fp,
uid_t  uid,
gid_t  gid,
struct ucred *  active_cred,
struct thread *  td 
)

Definition at line 1910 of file vfs_vnops.c.

References setfown().

Here is the call graph for this function:

int vn_close ( struct vnode *  vp,
int  flags,
struct ucred *  file_cred,
struct thread *  td 
)

Definition at line 303 of file vfs_vnops.c.

References vn_finished_write(), vn_start_write(), and vput().

Referenced by acct_disable(), alq_shutdown(), coredump(), expand_name(), link_elf_ctf_get(), link_elf_load_file(), linker_hints_lookup(), linker_lookup_file(), sys_acct(), sys_ktrace(), vfs_mountroot_readconf(), vn_closefile(), and vop_stdvptocnp().

Here is the call graph for this function:

Here is the caller graph for this function:

static int vn_closefile ( struct file *  fp,
struct thread *  td 
)
static

Definition at line 1423 of file vfs_vnops.c.

References badfileops, and vn_close().

Here is the call graph for this function:

int vn_extattr_get ( struct vnode *  vp,
int  ioflg,
int  attrnamespace,
const char *  attrname,
int *  buflen,
char *  buf,
struct thread *  td 
)

Definition at line 1728 of file vfs_vnops.c.

References buf.

int vn_extattr_rm ( struct vnode *  vp,
int  ioflg,
int  attrnamespace,
const char *  attrname,
struct thread *  td 
)

Definition at line 1808 of file vfs_vnops.c.

References vn_finished_write(), and vn_start_write().

Here is the call graph for this function:

int vn_extattr_set ( struct vnode *  vp,
int  ioflg,
int  attrnamespace,
const char *  attrname,
int  buflen,
char *  buf,
struct thread *  td 
)

Definition at line 1769 of file vfs_vnops.c.

References buf, vn_finished_write(), and vn_start_write().

Here is the call graph for this function:

void vn_finished_secondary_write ( struct mount *  mp)

Definition at line 1622 of file vfs_vnops.c.

References panic(), and wakeup().

Referenced by vgonel().

Here is the call graph for this function:

Here is the caller graph for this function:

static int vn_io_fault ( struct file *  fp,
struct uio *  uio,
struct ucred *  active_cred,
int  flags,
struct thread *  td 
)
static

Definition at line 883 of file vfs_vnops.c.

References cloneuio(), foffset_lock_uio(), foffset_unlock_uio(), free(), io_hold_cnt, uiomove(), vn_io_fault_enable, vn_io_faults_cnt, vn_read, and vn_write.

Here is the call graph for this function:

int vn_io_fault_pgmove ( vm_page_t  ma[],
vm_offset_t  offset,
int  xfersize,
struct uio *  uio 
)

Definition at line 1094 of file vfs_vnops.c.

int vn_io_fault_uiomove ( char *  data,
int  xfersize,
struct uio *  uio 
)

Definition at line 1038 of file vfs_vnops.c.

References uiomove().

Here is the call graph for this function:

static int vn_ioctl ( struct file *  fp,
u_long  com,
void *  data,
struct ucred *  active_cred,
struct thread *  td 
)
static

Definition at line 1319 of file vfs_vnops.c.

static int vn_kqfilter ( struct file *  fp,
struct knote kn 
)
static

Definition at line 1710 of file vfs_vnops.c.

int vn_open ( struct nameidata *  ndp,
int *  flagp,
int  cmode,
struct file *  fp 
)

Definition at line 106 of file vfs_vnops.c.

References vn_open_cred().

Referenced by expand_name(), kern_openat(), link_elf_ctf_get(), link_elf_load_file(), linker_hints_lookup(), linker_lookup_file(), sys_acct(), sys_ktrace(), and vfs_mountroot_readconf().

Here is the call graph for this function:

Here is the caller graph for this function:

int vn_open_cred ( struct nameidata *  ndp,
int *  flagp,
int  cmode,
u_int  vn_open_flags,
struct ucred *  cred,
struct file *  fp 
)

Definition at line 124 of file vfs_vnops.c.

References accmode, bwillwrite(), namei(), NDFREE(), vn_finished_write(), vn_start_write(), vn_writechk(), vput(), and vrele().

Referenced by alq_open_flags(), coredump(), vn_open(), and vop_stdvptocnp().

Here is the call graph for this function:

Here is the caller graph for this function:

void vn_pages_remove ( struct vnode *  vp,
vm_pindex_t  start,
vm_pindex_t  end 
)

Definition at line 1929 of file vfs_vnops.c.

static int vn_poll ( struct file *  fp,
int  events,
struct ucred *  active_cred,
struct thread *  td 
)
static

Definition at line 1360 of file vfs_vnops.c.

int vn_rdwr ( enum uio_rw  rw,
struct vnode *  vp,
void *  base,
int  len,
off_t  offset,
enum uio_seg  segflg,
int  ioflg,
struct ucred *  active_cred,
struct ucred *  file_cred,
ssize_t *  aresid,
struct thread *  td 
)

Definition at line 379 of file vfs_vnops.c.

References vn_finished_write(), and vn_start_write().

Referenced by acct_process(), gz_open(), kern_sendfile(), link_elf_ctf_get(), link_elf_load_file(), linker_hints_lookup(), putU32(), vfs_mountroot_readconf(), and vn_rdwr_inchunks().

Here is the call graph for this function:

Here is the caller graph for this function:

int vn_rdwr_inchunks ( enum uio_rw  rw,
struct vnode *  vp,
void *  base,
size_t  len,
off_t  offset,
enum uio_seg  segflg,
int  ioflg,
struct ucred *  active_cred,
struct ucred *  file_cred,
size_t *  aresid,
struct thread *  td 
)

Definition at line 474 of file vfs_vnops.c.

References bwillwrite(), kern_yield(), and vn_rdwr().

Referenced by core_output(), do_flush(), gzwrite(), and sbuf_drain_core_output().

Here is the call graph for this function:

Here is the caller graph for this function:

static int vn_read ( struct file *  fp,
struct uio *  uio,
struct ucred *  active_cred,
int  flags,
struct thread *  td 
)
static

Definition at line 631 of file vfs_vnops.c.

References get_advice(), mtx_pool_find(), mtxpool_sleep, sequential_heuristic(), and start.

Here is the call graph for this function:

int vn_rlimit_fsize ( const struct vnode *  vp,
const struct uio *  uio,
const struct thread *  td 
)

Definition at line 1873 of file vfs_vnops.c.

References kern_psignal(), and lim_cur().

Here is the call graph for this function:

int vn_start_secondary_write ( struct vnode *  vp,
struct mount **  mpp,
int  flags 
)

Definition at line 1537 of file vfs_vnops.c.

References vfs_rel().

Referenced by vgonel().

Here is the call graph for this function:

Here is the caller graph for this function:

static int vn_start_write_locked ( struct mount *  mp,
int  flags 
)
static

Definition at line 1457 of file vfs_vnops.c.

Referenced by vfs_write_resume_flags(), and vn_start_write().

Here is the caller graph for this function:

int vn_stat ( struct vnode *  vp,
struct stat *  sb,
struct ucred *  active_cred,
struct ucred *  file_cred,
struct thread *  td 
)

Definition at line 1209 of file vfs_vnops.c.

References mode, and priv_check().

Referenced by kern_statat_vnhook(), kern_unlinkat(), sys_fhstat(), and vn_statfile().

Here is the call graph for this function:

Here is the caller graph for this function:

static int vn_statfile ( struct file *  fp,
struct stat *  sb,
struct ucred *  active_cred,
struct thread *  td 
)
static

Definition at line 1186 of file vfs_vnops.c.

References vn_stat().

Here is the call graph for this function:

static int vn_truncate ( struct file *  fp,
off_t  length,
struct ucred *  active_cred,
struct thread *  td 
)
static

Definition at line 1136 of file vfs_vnops.c.

References vn_finished_write(), vn_start_write(), and vn_writechk().

Here is the call graph for this function:

int vn_vget_ino ( struct vnode *  vp,
ino_t  ino,
int  lkflags,
struct vnode **  rvp 
)

Definition at line 1837 of file vfs_vnops.c.

References vfs_busy(), vfs_ref(), vfs_rel(), vfs_unbusy(), and vput().

Here is the call graph for this function:

static int vn_write ( struct file *  fp,
struct uio *  uio,
struct ucred *  active_cred,
int  flags,
struct thread *  td 
)
static

Definition at line 718 of file vfs_vnops.c.

References bwillwrite(), get_advice(), mtx_pool_find(), mtxpool_sleep, sequential_heuristic(), start, vn_finished_write(), and vn_start_write().

Here is the call graph for this function:

int vn_writechk ( struct vnode *  vp)

Definition at line 283 of file vfs_vnops.c.

Referenced by kern_truncate(), sys_fhopen(), vn_access(), vn_open_cred(), and vn_truncate().

Here is the caller graph for this function:

Variable Documentation

const int io_hold_cnt = 16
static

Definition at line 841 of file vfs_vnops.c.

Referenced by vn_io_fault().

fo_close_t vn_closefile
static

Definition at line 89 of file vfs_vnops.c.

fo_rdwr_t vn_io_fault
static

Definition at line 83 of file vfs_vnops.c.

int vn_io_fault_enable = 0
static

Definition at line 842 of file vfs_vnops.c.

Referenced by vn_io_fault().

u_long vn_io_faults_cnt
static

Definition at line 845 of file vfs_vnops.c.

Referenced by vn_io_fault().

fo_ioctl_t vn_ioctl
static

Definition at line 85 of file vfs_vnops.c.

fo_kqfilter_t vn_kqfilter
static

Definition at line 87 of file vfs_vnops.c.

fo_poll_t vn_poll
static

Definition at line 86 of file vfs_vnops.c.

fo_rdwr_t vn_read
static

Definition at line 81 of file vfs_vnops.c.

Referenced by vn_io_fault().

fo_stat_t vn_statfile
static

Definition at line 88 of file vfs_vnops.c.

fo_truncate_t vn_truncate
static

Definition at line 84 of file vfs_vnops.c.

fo_rdwr_t vn_write
static

Definition at line 82 of file vfs_vnops.c.

Referenced by vn_io_fault().

struct fileops vnops
Initial value:
= {
.fo_read = vn_io_fault,
.fo_write = vn_io_fault,
.fo_truncate = vn_truncate,
.fo_ioctl = vn_ioctl,
.fo_poll = vn_poll,
.fo_kqfilter = vn_kqfilter,
.fo_stat = vn_statfile,
.fo_close = vn_closefile,
.fo_chmod = vn_chmod,
.fo_chown = vn_chown,
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE
}
static fo_close_t vn_closefile
Definition: vfs_vnops.c:89
static fo_rdwr_t vn_io_fault
Definition: vfs_vnops.c:83
int vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, struct thread *td)
Definition: vfs_vnops.c:1910
static fo_truncate_t vn_truncate
Definition: vfs_vnops.c:84
int vn_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, struct thread *td)
Definition: vfs_vnops.c:1891
static fo_poll_t vn_poll
Definition: vfs_vnops.c:86
static fo_ioctl_t vn_ioctl
Definition: vfs_vnops.c:85
static fo_stat_t vn_statfile
Definition: vfs_vnops.c:88
static fo_kqfilter_t vn_kqfilter
Definition: vfs_vnops.c:87

Definition at line 91 of file vfs_vnops.c.

Referenced by kern_openat(), ptsdev_close(), and sys_fhopen().