Loading...
--- xnu/xnu-12377.121.6/bsd/vfs/vnode_if.src
+++ xnu/xnu-201/bsd/vfs/vnode_if.src
@@ -35,5 +35,683 @@
#
#
-# Needs to be updated for KPI changes...
-#
+# 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.
+#
+
+# If a vnode operation if likely to generate buffer cache IO
+# for file data, add the word "UBC" on the line containing the
+# name of the vnode operation. The word "UBC" must be the third
+# word on the line, right after "{".
+
+
+#
+#% 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
+# ebly that *vpp may equal dvp and both may be locked.
+#
+vop_lookup {
+ IN struct vnode *dvp;
+ INOUT struct vnode **vpp;
+ IN struct componentname *cnp;
+};
+
+#
+#% cachedlookup dvp L ? ?
+#% cachedlookup vpp - L -
+#
+# This must be an exact copy of lookup. See kern/vfs_cache.c for details.
+#
+vop_cachedlookup {
+ IN struct vnode *dvp;
+ INOUT struct vnode **vpp;
+ IN struct componentname *cnp;
+};
+
+#
+#% create dvp L L L
+#% 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;
+};
+
+#
+#% mkcomplex dvp L U U
+#% mkcomplex vpp - X -
+#
+vop_mkcomplex {
+ IN WILLRELE struct vnode *dvp;
+ OUT WILLRELE struct vnode **vpp;
+ IN struct componentname *cnp;
+ IN struct vattr *vap;
+ IN u_long type;
+};
+
+#
+#% 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;
+};
+
+#
+#% getattrlist vp = = =
+#
+vop_getattrlist {
+ IN struct vnode *vp;
+ IN struct attrlist *alist;
+ INOUT struct uio *uio;
+ IN struct ucred *cred;
+ IN struct proc *p;
+};
+
+#
+#% setattrlist vp L L L
+#
+vop_setattrlist {
+ IN struct vnode *vp;
+ IN struct attrlist *alist;
+ INOUT struct uio *uio;
+ IN struct ucred *cred;
+ IN struct proc *p;
+};
+
+#
+#% read vp L L L
+#
+vop_read { UBC
+ IN struct vnode *vp;
+ INOUT struct uio *uio;
+ IN int ioflag;
+ IN struct ucred *cred;
+};
+
+#
+#% write vp L L L
+#
+vop_write { UBC
+ IN struct vnode *vp;
+ INOUT struct uio *uio;
+ IN int ioflag;
+ IN struct ucred *cred;
+};
+
+#
+#% lease vp = = =
+#
+vop_lease {
+ IN struct vnode *vp;
+ IN struct proc *p;
+ IN struct ucred *cred;
+ IN int flag;
+};
+
+#
+#% ioctl vp U U U
+#
+vop_ioctl {
+ IN struct vnode *vp;
+ IN u_long 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 void * wql;
+ IN struct proc *p;
+};
+
+#
+#% exchange fvp L L L
+#% exchange tvp L L L
+#
+vop_exchange {
+ IN struct vnode *fvp;
+ IN struct vnode *tvp;
+ IN struct ucred *cred;
+ IN struct proc *p;
+};
+
+#
+#% revoke vp U U U
+#
+vop_revoke {
+ IN struct vnode *vp;
+ IN int flags;
+};
+
+#
+# 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 { UBC
+ IN struct vnode *vp;
+ IN struct ucred *cred;
+ IN int waitfor;
+ IN struct proc *p;
+};
+
+#
+# XXX - not used
+# Needs work: 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 U U U
+#% link tdvp L 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 int *ncookies;
+ INOUT u_long **cookies;
+};
+
+#
+#% readdirattr vp L L L
+#
+vop_readdirattr {
+ IN struct vnode *vp;
+ IN struct attrlist *alist;
+ INOUT struct uio *uio;
+ IN u_long maxcount;
+ IN u_long options;
+ OUT u_long *newstate;
+ OUT int *eofflag;
+ OUT u_long *actualcount;
+ OUT u_long **cookies;
+ IN struct ucred *cred;
+};
+
+#
+#% 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 L U U
+#
+vop_inactive {
+ IN struct vnode *vp;
+ IN struct proc *p;
+};
+
+#
+#% reclaim vp U U U
+#
+vop_reclaim {
+ IN struct vnode *vp;
+ IN struct proc *p;
+};
+
+#
+#% lock vp U L U
+#
+vop_lock {
+ IN struct vnode *vp;
+ IN int flags;
+ IN struct proc *p;
+};
+
+#
+#% unlock vp L U L
+#
+vop_unlock {
+ IN struct vnode *vp;
+ IN int flags;
+ IN struct proc *p;
+};
+
+#
+#% 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;
+};
+
+#
+# Needs work: no vp?
+#
+#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 register_t *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 { UBC
+ IN struct vnode *vp;
+ IN off_t length;
+ IN int flags;
+ IN struct ucred *cred;
+ IN struct proc *p;
+};
+
+#
+#% allocate vp L L L
+#
+vop_allocate {
+ IN struct vnode *vp;
+ IN off_t length;
+ IN u_int32_t flags;
+ OUT off_t *bytesallocated;
+ IN off_t offset;
+ 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;
+};
+
+#
+#% pgrd vp L L L
+#
+vop_pgrd {
+ IN struct vnode *vp;
+ INOUT struct uio *uio;
+ IN struct ucred *cred;
+};
+
+#
+#% pgwr vp L L L
+#
+vop_pgwr {
+ IN struct vnode *vp;
+ INOUT struct uio *uio;
+ IN struct ucred *cred;
+ IN vm_offset_t offset;
+};
+
+#
+# Needs work: no vp?
+#
+#vop_bwrite {
+# IN struct buf *bp;
+#};
+
+#
+#% pagein vp = = =
+#
+vop_pagein {
+ IN struct vnode *vp;
+ IN upl_t pl;
+ IN vm_offset_t pl_offset;
+ IN off_t f_offset;
+ IN size_t size;
+ IN struct ucred *cred;
+ IN int flags;
+};
+
+#
+#% pageout vp = = =
+#
+vop_pageout {
+ IN struct vnode *vp;
+ IN upl_t pl;
+ IN vm_offset_t pl_offset;
+ IN off_t f_offset;
+ IN size_t size;
+ IN struct ucred *cred;
+ IN int flags;
+};
+
+#
+#% devblocksize vp = = =
+#
+vop_devblocksize {
+ IN struct vnode *vp;
+ OUT register_t *retval;
+};
+
+#
+#% searchfs vp L L L
+#
+vop_searchfs {
+ IN struct vnode *vp;
+ IN void *searchparams1;
+ IN void *searchparams2;
+ IN struct attrlist *searchattrs;
+ IN u_long maxmatches;
+ IN struct timeval *timelimit;
+ OUT struct attrlist *returnattrs;
+ OUT u_long *nummatches;
+ IN u_long scriptcode;
+ IN u_long options;
+ INOUT struct uio *uio;
+ INOUT struct searchstate *searchstate;
+};
+
+#
+#% copyfile fvp U U U
+#% copyfile tdvp L U U
+#% copyfile tvp X U U
+#
+vop_copyfile {
+ IN WILLRELE struct vnode *fvp;
+ IN WILLRELE struct vnode *tdvp;
+ IN WILLRELE struct vnode *tvp;
+ IN struct componentname *tcnp;
+ IN int mode;
+ IN int flags;
+};
+
+#
+#% blktooff vp = = =
+#
+# Given a logical block number for a vnode
+# return file offset
+#
+vop_blktooff {
+ IN struct vnode *vp;
+ IN daddr_t lblkno;
+ OUT off_t *offset;
+};
+
+#
+#% offtoblk vp = = =
+#
+# Given a file offset for a vnode
+# return logical block number
+#
+vop_offtoblk {
+ IN struct vnode *vp;
+ IN off_t offset;
+ OUT daddr_t *lblkno;
+};
+
+#
+#% cmap vp L L L
+#
+# Given a file offset and size of IO for a vnode
+# return physical block number and bytes physically
+# contiguous at that physical block.
+#
+# An offset into the physical block may be returned [optional]
+# This is needed to support 4K/1K UFS on the devices with 2K
+# sector size.
+vop_cmap {
+ IN struct vnode *vp;
+ IN off_t foffset;
+ IN size_t size;
+ OUT daddr_t *bpn;
+ OUT size_t *run;
+ OUT void *poff;
+};
+