add unwhiteout system call to delete a whiteout entry
[unix-history] / usr / src / sys / kern / vnode_if.src
#
# Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved.
#
# %sccs.include.redist.sh%
#
# @(#)vnode_if.src 8.6 (Berkeley) %G%
#
#
# Above each of the vop descriptors is a specification of the locking
# protocol used by each vop call. The first column is the name of
# the variable, the remaining three columns are in, out and error
# respectively. The "in" column defines the lock state on input,
# the "out" column defines the state on succesful return, and the
# "error" column defines the locking state on error exit.
#
# The locking value can take the following values:
# L: locked.
# U: unlocked/
# -: not applicable. vnode does not yet (or no longer) exists.
# =: the same on input and output, may be either L or U.
# X: locked if not nil.
#
#
#% lookup dvp L ? ?
#% lookup vpp - L -
#
# XXX - the lookup locking protocol defies simple description and depends
# on the flags and operation fields in the (cnp) structure. Note
# especially that *vpp may equal dvp and both may be locked.
#
vop_lookup {
IN struct vnode *dvp;
INOUT struct vnode **vpp;
IN struct componentname *cnp;
};
#
#% create dvp L U U
#% create vpp - L -
#
vop_create {
IN WILLRELE struct vnode *dvp;
OUT struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
};
#
#% whiteout dvp L L L
#% whiteout cnp - - -
#% whiteout flag - - -
vop_whiteout {
IN WILLRELE struct vnode *dvp;
IN struct componentname *cnp;
IN int flags;
};
#
#% mknod dvp L U U
#% mknod vpp - X -
#
vop_mknod {
IN WILLRELE struct vnode *dvp;
OUT WILLRELE struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
};
#
#% open vp L L L
#
vop_open {
IN struct vnode *vp;
IN int mode;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% close vp U U U
#
vop_close {
IN struct vnode *vp;
IN int fflag;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% access vp L L L
#
vop_access {
IN struct vnode *vp;
IN int mode;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% getattr vp = = =
#
vop_getattr {
IN struct vnode *vp;
IN struct vattr *vap;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% setattr vp L L L
#
vop_setattr {
IN struct vnode *vp;
IN struct vattr *vap;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% read vp L L L
#
vop_read {
IN struct vnode *vp;
INOUT struct uio *uio;
IN int ioflag;
IN struct ucred *cred;
};
#
#% write vp L L L
#
vop_write {
IN struct vnode *vp;
INOUT struct uio *uio;
IN int ioflag;
IN struct ucred *cred;
};
#
#% ioctl vp U U U
#
vop_ioctl {
IN struct vnode *vp;
IN int command;
IN caddr_t data;
IN int fflag;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% select vp U U U
#
# Needs work? (fflags)
vop_select {
IN struct vnode *vp;
IN int which;
IN int fflags;
IN struct ucred *cred;
IN struct proc *p;
};
# XXX - not used
vop_mmap {
IN struct vnode *vp;
IN int fflags;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% fsync vp L L L
#
vop_fsync {
IN struct vnode *vp;
IN struct ucred *cred;
IN int waitfor;
IN struct proc *p;
};
# XXX - not used
# Needs word: Is newoff right? What's it mean?
vop_seek {
IN struct vnode *vp;
IN off_t oldoff;
IN off_t newoff;
IN struct ucred *cred;
};
#
#% remove dvp L U U
#% remove vp L U U
#
vop_remove {
IN WILLRELE struct vnode *dvp;
IN WILLRELE struct vnode *vp;
IN struct componentname *cnp;
};
#
#% link vp L U U
#% link tdvp U U U
#
vop_link {
IN WILLRELE struct vnode *vp;
IN struct vnode *tdvp;
IN struct componentname *cnp;
};
#
#% rename fdvp U U U
#% rename fvp U U U
#% rename tdvp L U U
#% rename tvp X U U
#
vop_rename {
IN WILLRELE struct vnode *fdvp;
IN WILLRELE struct vnode *fvp;
IN struct componentname *fcnp;
IN WILLRELE struct vnode *tdvp;
IN WILLRELE struct vnode *tvp;
IN struct componentname *tcnp;
};
#
#% mkdir dvp L U U
#% mkdir vpp - L -
#
vop_mkdir {
IN WILLRELE struct vnode *dvp;
OUT struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
};
#
#% rmdir dvp L U U
#% rmdir vp L U U
#
vop_rmdir {
IN WILLRELE struct vnode *dvp;
IN WILLRELE struct vnode *vp;
IN struct componentname *cnp;
};
#
#% symlink dvp L U U
#% symlink vpp - U -
# XXX - note that the return vnode has already been VRELE'ed
# by the filesystem layer. To use it you must use vget,
# possibly with a further namei.
#
vop_symlink {
IN WILLRELE struct vnode *dvp;
OUT WILLRELE struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
IN char *target;
};
#
#% readdir vp L L L
#
vop_readdir {
IN struct vnode *vp;
INOUT struct uio *uio;
IN struct ucred *cred;
INOUT int *eofflag;
OUT u_long *cookies;
IN int ncookies;
};
#
#% readlink vp L L L
#
vop_readlink {
IN struct vnode *vp;
INOUT struct uio *uio;
IN struct ucred *cred;
};
#
#% abortop dvp = = =
#
vop_abortop {
IN struct vnode *dvp;
IN struct componentname *cnp;
};
#
#% inactive vp U U U
#
vop_inactive {
IN struct vnode *vp;
};
#
#% reclaim vp U U U
#
vop_reclaim {
IN struct vnode *vp;
};
#
#% lock vp U L U
#
vop_lock {
IN struct vnode *vp;
};
#
#% unlock vp L U L
#
vop_unlock {
IN struct vnode *vp;
};
#
#% bmap vp L L L
#% bmap vpp - U -
#
vop_bmap {
IN struct vnode *vp;
IN daddr_t bn;
OUT struct vnode **vpp;
IN daddr_t *bnp;
OUT int *runp;
};
#vop_strategy {
# IN struct buf *bp;
#};
#
#% print vp = = =
#
vop_print {
IN struct vnode *vp;
};
#
#% islocked vp = = =
#
vop_islocked {
IN struct vnode *vp;
};
#
#% pathconf vp L L L
#
vop_pathconf {
IN struct vnode *vp;
IN int name;
OUT int *retval;
};
#
#% advlock vp U U U
#
vop_advlock {
IN struct vnode *vp;
IN caddr_t id;
IN int op;
IN struct flock *fl;
IN int flags;
};
#
#% blkatoff vp L L L
#
vop_blkatoff {
IN struct vnode *vp;
IN off_t offset;
OUT char **res;
OUT struct buf **bpp;
};
#
#% valloc pvp L L L
#
vop_valloc {
IN struct vnode *pvp;
IN int mode;
IN struct ucred *cred;
OUT struct vnode **vpp;
};
#
#% reallocblks vp L L L
#
vop_reallocblks {
IN struct vnode *vp;
IN struct cluster_save *buflist;
};
#
#% vfree pvp L L L
#
vop_vfree {
IN struct vnode *pvp;
IN ino_t ino;
IN int mode;
};
#
#% truncate vp L L L
#
vop_truncate {
IN struct vnode *vp;
IN off_t length;
IN int flags;
IN struct ucred *cred;
IN struct proc *p;
};
#
#% update vp L L L
#
vop_update {
IN struct vnode *vp;
IN struct timeval *access;
IN struct timeval *modify;
IN int waitfor;
};
# Needs work: no vp?
#vop_bwrite {
# IN struct buf *bp;
#};