Annotation of Net2/sys/vnode.h, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.