|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)vnode.h 7.39 (Berkeley) 6/27/91 ! 34: */ ! 35: ! 36: #ifndef KERNEL ! 37: #include <machine/endian.h> ! 38: #endif ! 39: ! 40: /* ! 41: * The vnode is the focus of all file activity in UNIX. ! 42: * There is a unique vnode allocated for each active file, ! 43: * each current directory, each mounted-on file, text file, and the root. ! 44: */ ! 45: ! 46: /* ! 47: * vnode types. VNON means no type. ! 48: */ ! 49: enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD }; ! 50: ! 51: /* ! 52: * Vnode tag types. ! 53: * These are for the benefit of external programs only (e.g., pstat) ! 54: * and should NEVER be inspected inside the kernel. ! 55: */ ! 56: enum vtagtype { VT_NON, VT_UFS, VT_NFS, VT_MFS }; ! 57: ! 58: /* ! 59: * This defines the maximum size of the private data area ! 60: * permitted for any file system type. A defined constant ! 61: * is used rather than a union structure to cut down on the ! 62: * number of header files that must be included. ! 63: */ ! 64: #define VN_MAXPRIVATE 188 ! 65: ! 66: struct vnode { ! 67: u_long v_flag; /* vnode flags (see below) */ ! 68: short v_usecount; /* reference count of users */ ! 69: short v_writecount; /* reference count of writers */ ! 70: long v_holdcnt; /* page & buffer references */ ! 71: off_t v_lastr; /* last read (read-ahead) */ ! 72: u_long v_id; /* capability identifier */ ! 73: struct mount *v_mount; /* ptr to vfs we are in */ ! 74: struct vnodeops *v_op; /* vnode operations */ ! 75: struct vnode *v_freef; /* vnode freelist forward */ ! 76: struct vnode **v_freeb; /* vnode freelist back */ ! 77: struct vnode *v_mountf; /* vnode mountlist forward */ ! 78: struct vnode **v_mountb; /* vnode mountlist back */ ! 79: struct buf *v_cleanblkhd; /* clean blocklist head */ ! 80: struct buf *v_dirtyblkhd; /* dirty blocklist head */ ! 81: long v_numoutput; /* num of writes in progress */ ! 82: enum vtype v_type; /* vnode type */ ! 83: union { ! 84: struct mount *vu_mountedhere;/* ptr to mounted vfs (VDIR) */ ! 85: struct socket *vu_socket; /* unix ipc (VSOCK) */ ! 86: caddr_t vu_vmdata; /* private data for vm (VREG) */ ! 87: struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */ ! 88: struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */ ! 89: } v_un; ! 90: enum vtagtype v_tag; /* type of underlying data */ ! 91: char v_data[VN_MAXPRIVATE]; /* private data for fs */ ! 92: }; ! 93: #define v_mountedhere v_un.vu_mountedhere ! 94: #define v_socket v_un.vu_socket ! 95: #define v_vmdata v_un.vu_vmdata ! 96: #define v_specinfo v_un.vu_specinfo ! 97: #define v_fifoinfo v_un.vu_fifoinfo ! 98: ! 99: /* ! 100: * vnode flags. ! 101: */ ! 102: #define VROOT 0x0001 /* root of its file system */ ! 103: #define VTEXT 0x0002 /* vnode is a pure text prototype */ ! 104: #define VSYSTEM 0x0004 /* vnode being used by kernel */ ! 105: #define VXLOCK 0x0100 /* vnode is locked to change underlying type */ ! 106: #define VXWANT 0x0200 /* process is waiting for vnode */ ! 107: #define VBWAIT 0x0400 /* waiting for output to complete */ ! 108: #define VALIASED 0x0800 /* vnode has an alias */ ! 109: ! 110: /* ! 111: * Vnode attributes. A field value of VNOVAL ! 112: * represents a field whose value is unavailable ! 113: * (getattr) or which is not to be changed (setattr). ! 114: */ ! 115: struct vattr { ! 116: enum vtype va_type; /* vnode type (for create) */ ! 117: u_short va_mode; /* files access mode and type */ ! 118: short va_nlink; /* number of references to file */ ! 119: uid_t va_uid; /* owner user id */ ! 120: gid_t va_gid; /* owner group id */ ! 121: long va_fsid; /* file system id (dev for now) */ ! 122: long va_fileid; /* file id */ ! 123: u_quad va_qsize; /* file size in bytes */ ! 124: long va_blocksize; /* blocksize preferred for i/o */ ! 125: struct timeval va_atime; /* time of last access */ ! 126: struct timeval va_mtime; /* time of last modification */ ! 127: struct timeval va_ctime; /* time file changed */ ! 128: u_long va_gen; /* generation number of file */ ! 129: u_long va_flags; /* flags defined for file */ ! 130: dev_t va_rdev; /* device the special file represents */ ! 131: u_quad va_qbytes; /* bytes of disk space held by file */ ! 132: }; ! 133: #if BYTE_ORDER == LITTLE_ENDIAN ! 134: #define va_size va_qsize.val[0] ! 135: #define va_size_rsv va_qsize.val[1] ! 136: #define va_bytes va_qbytes.val[0] ! 137: #define va_bytes_rsv va_qbytes.val[1] ! 138: #else ! 139: #define va_size va_qsize.val[1] ! 140: #define va_size_rsv va_qsize.val[0] ! 141: #define va_bytes va_qbytes.val[1] ! 142: #define va_bytes_rsv va_qbytes.val[0] ! 143: #endif ! 144: ! 145: /* ! 146: * Operations on vnodes. ! 147: */ ! 148: #ifdef __STDC__ ! 149: struct flock; ! 150: struct nameidata; ! 151: #endif ! 152: ! 153: struct vnodeops { ! 154: int (*vop_lookup) __P((struct vnode *vp, struct nameidata *ndp, ! 155: struct proc *p)); ! 156: int (*vop_create) __P((struct nameidata *ndp, struct vattr *vap, ! 157: struct proc *p)); ! 158: int (*vop_mknod) __P((struct nameidata *ndp, struct vattr *vap, ! 159: struct ucred *cred, struct proc *p)); ! 160: int (*vop_open) __P((struct vnode *vp, int mode, ! 161: struct ucred *cred, struct proc *p)); ! 162: int (*vop_close) __P((struct vnode *vp, int fflag, ! 163: struct ucred *cred, struct proc *p)); ! 164: int (*vop_access) __P((struct vnode *vp, int mode, ! 165: struct ucred *cred, struct proc *p)); ! 166: int (*vop_getattr) __P((struct vnode *vp, struct vattr *vap, ! 167: struct ucred *cred, struct proc *p)); ! 168: int (*vop_setattr) __P((struct vnode *vp, struct vattr *vap, ! 169: struct ucred *cred, struct proc *p)); ! 170: int (*vop_read) __P((struct vnode *vp, struct uio *uio, ! 171: int ioflag, struct ucred *cred)); ! 172: int (*vop_write) __P((struct vnode *vp, struct uio *uio, ! 173: int ioflag, struct ucred *cred)); ! 174: int (*vop_ioctl) __P((struct vnode *vp, int command, ! 175: caddr_t data, int fflag, ! 176: struct ucred *cred, struct proc *p)); ! 177: int (*vop_select) __P((struct vnode *vp, int which, int fflags, ! 178: struct ucred *cred, struct proc *p)); ! 179: int (*vop_mmap) __P((struct vnode *vp, int fflags, ! 180: struct ucred *cred, struct proc *p)); ! 181: int (*vop_fsync) __P((struct vnode *vp, int fflags, ! 182: struct ucred *cred, int waitfor, ! 183: struct proc *p)); ! 184: int (*vop_seek) __P((struct vnode *vp, off_t oldoff, ! 185: off_t newoff, struct ucred *cred)); ! 186: int (*vop_remove) __P((struct nameidata *ndp, struct proc *p)); ! 187: int (*vop_link) __P((struct vnode *vp, struct nameidata *ndp, ! 188: struct proc *p)); ! 189: int (*vop_rename) __P((struct nameidata *fndp, ! 190: struct nameidata *tdnp, struct proc *p)); ! 191: int (*vop_mkdir) __P((struct nameidata *ndp, struct vattr *vap, ! 192: struct proc *p)); ! 193: int (*vop_rmdir) __P((struct nameidata *ndp, struct proc *p)); ! 194: int (*vop_symlink) __P((struct nameidata *ndp, struct vattr *vap, ! 195: char *target, struct proc *p)); ! 196: int (*vop_readdir) __P((struct vnode *vp, struct uio *uio, ! 197: struct ucred *cred, int *eofflagp)); ! 198: int (*vop_readlink) __P((struct vnode *vp, struct uio *uio, ! 199: struct ucred *cred)); ! 200: int (*vop_abortop) __P((struct nameidata *ndp)); ! 201: int (*vop_inactive) __P((struct vnode *vp, struct proc *p)); ! 202: int (*vop_reclaim) __P((struct vnode *vp)); ! 203: int (*vop_lock) __P((struct vnode *vp)); ! 204: int (*vop_unlock) __P((struct vnode *vp)); ! 205: int (*vop_bmap) __P((struct vnode *vp, daddr_t bn, ! 206: struct vnode **vpp, daddr_t *bnp)); ! 207: int (*vop_strategy) __P((struct buf *bp)); ! 208: int (*vop_print) __P((struct vnode *vp)); ! 209: int (*vop_islocked) __P((struct vnode *vp)); ! 210: int (*vop_advlock) __P((struct vnode *vp, caddr_t id, int op, ! 211: struct flock *fl, int flags)); ! 212: }; ! 213: ! 214: /* Macros to call the vnode ops */ ! 215: #define VOP_LOOKUP(v,n,p) (*((v)->v_op->vop_lookup))(v,n,p) ! 216: #define VOP_CREATE(n,a,p) (*((n)->ni_dvp->v_op->vop_create))(n,a,p) ! 217: #define VOP_MKNOD(n,a,c,p) (*((n)->ni_dvp->v_op->vop_mknod))(n,a,c,p) ! 218: #define VOP_OPEN(v,f,c,p) (*((v)->v_op->vop_open))(v,f,c,p) ! 219: #define VOP_CLOSE(v,f,c,p) (*((v)->v_op->vop_close))(v,f,c,p) ! 220: #define VOP_ACCESS(v,f,c,p) (*((v)->v_op->vop_access))(v,f,c,p) ! 221: #define VOP_GETATTR(v,a,c,p) (*((v)->v_op->vop_getattr))(v,a,c,p) ! 222: #define VOP_SETATTR(v,a,c,p) (*((v)->v_op->vop_setattr))(v,a,c,p) ! 223: #define VOP_READ(v,u,i,c) (*((v)->v_op->vop_read))(v,u,i,c) ! 224: #define VOP_WRITE(v,u,i,c) (*((v)->v_op->vop_write))(v,u,i,c) ! 225: #define VOP_IOCTL(v,o,d,f,c,p) (*((v)->v_op->vop_ioctl))(v,o,d,f,c,p) ! 226: #define VOP_SELECT(v,w,f,c,p) (*((v)->v_op->vop_select))(v,w,f,c,p) ! 227: #define VOP_MMAP(v,c,p) (*((v)->v_op->vop_mmap))(v,c,p) ! 228: #define VOP_FSYNC(v,f,c,w,p) (*((v)->v_op->vop_fsync))(v,f,c,w,p) ! 229: #define VOP_SEEK(v,p,o,w) (*((v)->v_op->vop_seek))(v,p,o,w) ! 230: #define VOP_REMOVE(n,p) (*((n)->ni_dvp->v_op->vop_remove))(n,p) ! 231: #define VOP_LINK(v,n,p) (*((n)->ni_dvp->v_op->vop_link))(v,n,p) ! 232: #define VOP_RENAME(s,t,p) (*((s)->ni_dvp->v_op->vop_rename))(s,t,p) ! 233: #define VOP_MKDIR(n,a,p) (*((n)->ni_dvp->v_op->vop_mkdir))(n,a,p) ! 234: #define VOP_RMDIR(n,p) (*((n)->ni_dvp->v_op->vop_rmdir))(n,p) ! 235: #define VOP_SYMLINK(n,a,m,p) (*((n)->ni_dvp->v_op->vop_symlink))(n,a,m,p) ! 236: #define VOP_READDIR(v,u,c,e) (*((v)->v_op->vop_readdir))(v,u,c,e) ! 237: #define VOP_READLINK(v,u,c) (*((v)->v_op->vop_readlink))(v,u,c) ! 238: #define VOP_ABORTOP(n) (*((n)->ni_dvp->v_op->vop_abortop))(n) ! 239: #define VOP_INACTIVE(v,p) (*((v)->v_op->vop_inactive))(v,p) ! 240: #define VOP_RECLAIM(v) (*((v)->v_op->vop_reclaim))(v) ! 241: #define VOP_LOCK(v) (*((v)->v_op->vop_lock))(v) ! 242: #define VOP_UNLOCK(v) (*((v)->v_op->vop_unlock))(v) ! 243: #define VOP_BMAP(v,s,p,n) (*((v)->v_op->vop_bmap))(v,s,p,n) ! 244: #define VOP_STRATEGY(b) (*((b)->b_vp->v_op->vop_strategy))(b) ! 245: #define VOP_PRINT(v) (*((v)->v_op->vop_print))(v) ! 246: #define VOP_ISLOCKED(v) (((v)->v_flag & VXLOCK) || \ ! 247: (*((v)->v_op->vop_islocked))(v)) ! 248: #define VOP_ADVLOCK(v,p,o,l,f) (*((v)->v_op->vop_advlock))(v,p,o,l,f) ! 249: ! 250: /* ! 251: * flags for ioflag ! 252: */ ! 253: #define IO_UNIT 0x01 /* do I/O as atomic unit */ ! 254: #define IO_APPEND 0x02 /* append write to end */ ! 255: #define IO_SYNC 0x04 /* do I/O synchronously */ ! 256: #define IO_NODELOCKED 0x08 /* underlying node already locked */ ! 257: #define IO_NDELAY 0x10 /* FNDELAY flag set in file table */ ! 258: ! 259: /* ! 260: * Modes. Some values same as Ixxx entries from inode.h for now ! 261: */ ! 262: #define VSUID 04000 /* set user id on execution */ ! 263: #define VSGID 02000 /* set group id on execution */ ! 264: #define VSVTX 01000 /* save swapped text even after use */ ! 265: #define VREAD 0400 /* read, write, execute permissions */ ! 266: #define VWRITE 0200 ! 267: #define VEXEC 0100 ! 268: ! 269: /* ! 270: * Token indicating no attribute value yet assigned ! 271: */ ! 272: #define VNOVAL ((unsigned)0xffffffff) ! 273: ! 274: #ifdef KERNEL ! 275: /* ! 276: * public vnode manipulation functions ! 277: */ ! 278: int vn_open __P((struct nameidata *ndp, struct proc *p, int fmode, ! 279: int cmode)); ! 280: int vn_close __P((struct vnode *vp, int flags, struct ucred *cred, ! 281: struct proc *p)); ! 282: int vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base, ! 283: int len, off_t offset, enum uio_seg segflg, int ioflg, ! 284: struct ucred *cred, int *aresid, struct proc *p)); ! 285: int vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); ! 286: int vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); ! 287: int vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); ! 288: int vn_select __P((struct file *fp, int which, struct proc *p)); ! 289: int vn_closefile __P((struct file *fp, struct proc *p)); ! 290: int getnewvnode __P((enum vtagtype tag, struct mount *mp, ! 291: struct vnodeops *vops, struct vnode **vpp)); ! 292: int bdevvp __P((int dev, struct vnode **vpp)); ! 293: /* check for special device aliases */ ! 294: /* XXX nvp_rdev should be type dev_t, not int */ ! 295: struct vnode *checkalias __P((struct vnode *vp, int nvp_rdev, ! 296: struct mount *mp)); ! 297: void vattr_null __P((struct vattr *vap)); ! 298: int vcount __P((struct vnode *vp)); /* total references to a device */ ! 299: int vget __P((struct vnode *vp)); /* get first reference to a vnode */ ! 300: void vref __P((struct vnode *vp)); /* increase reference to a vnode */ ! 301: void vput __P((struct vnode *vp)); /* unlock and release vnode */ ! 302: void vrele __P((struct vnode *vp)); /* release vnode */ ! 303: void vgone __P((struct vnode *vp)); /* completely recycle vnode */ ! 304: void vgoneall __P((struct vnode *vp));/* recycle vnode and all its aliases */ ! 305: ! 306: /* ! 307: * Flags to various vnode functions. ! 308: */ ! 309: #define SKIPSYSTEM 0x0001 /* vflush: skip vnodes marked VSYSTEM */ ! 310: #define FORCECLOSE 0x0002 /* vflush: force file closeure */ ! 311: #define DOCLOSE 0x0004 /* vclean: close active files */ ! 312: ! 313: #ifndef DIAGNOSTIC ! 314: #define VREF(vp) (vp)->v_usecount++ /* increase reference */ ! 315: #define VHOLD(vp) (vp)->v_holdcnt++ /* increase buf or page ref */ ! 316: #define HOLDRELE(vp) (vp)->v_holdcnt-- /* decrease buf or page ref */ ! 317: #define VATTR_NULL(vap) (*(vap) = va_null) /* initialize a vattr */ ! 318: #else /* DIAGNOSTIC */ ! 319: #define VREF(vp) vref(vp) ! 320: #define VHOLD(vp) vhold(vp) ! 321: #define HOLDRELE(vp) holdrele(vp) ! 322: #define VATTR_NULL(vap) vattr_null(vap) ! 323: #endif ! 324: ! 325: #define NULLVP ((struct vnode *)NULL) ! 326: ! 327: /* ! 328: * Global vnode data. ! 329: */ ! 330: extern struct vnode *rootdir; /* root (i.e. "/") vnode */ ! 331: extern long desiredvnodes; /* number of vnodes desired */ ! 332: extern struct vattr va_null; /* predefined null vattr structure */ ! 333: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.