Annotation of kernel/bsd/sys/vnode.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
                     26: /*
                     27:  * Copyright (c) 1989, 1993
                     28:  *     The Regents of the University of California.  All rights reserved.
                     29:  *
                     30:  * Redistribution and use in source and binary forms, with or without
                     31:  * modification, are permitted provided that the following conditions
                     32:  * are met:
                     33:  * 1. Redistributions of source code must retain the above copyright
                     34:  *    notice, this list of conditions and the following disclaimer.
                     35:  * 2. Redistributions in binary form must reproduce the above copyright
                     36:  *    notice, this list of conditions and the following disclaimer in the
                     37:  *    documentation and/or other materials provided with the distribution.
                     38:  * 3. All advertising materials mentioning features or use of this software
                     39:  *    must display the following acknowledgement:
                     40:  *     This product includes software developed by the University of
                     41:  *     California, Berkeley and its contributors.
                     42:  * 4. Neither the name of the University nor the names of its contributors
                     43:  *    may be used to endorse or promote products derived from this software
                     44:  *    without specific prior written permission.
                     45:  *
                     46:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     47:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     48:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     49:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     50:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     51:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     52:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     53:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     54:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     55:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     56:  * SUCH DAMAGE.
                     57:  *
                     58:  *     @(#)vnode.h     8.17 (Berkeley) 5/20/95
                     59:  */
                     60: 
                     61: #ifndef _VNODE_H_
                     62: #define _VNODE_H_
                     63: 
                     64: #include <sys/cdefs.h>
                     65: #include <sys/queue.h>
                     66: #include <sys/lock.h>
                     67: 
                     68: #include <sys/time.h>
                     69: #include <sys/uio.h>
                     70: 
                     71: #include <sys/vm.h>
                     72: 
                     73: /*
                     74:  * The vnode is the focus of all file activity in UNIX.  There is a
                     75:  * unique vnode allocated for each active file, each current directory,
                     76:  * each mounted-on file, text file, and the root.
                     77:  */
                     78: 
                     79: /*
                     80:  * Vnode types.  VNON means no type.
                     81:  */
                     82: enum vtype     { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD, VSTR,
                     83:                          VCPLX };
                     84: 
                     85: /*
                     86:  * Vnode tag types.
                     87:  * These are for the benefit of external programs only (e.g., pstat)
                     88:  * and should NEVER be inspected by the kernel.
                     89:  */
                     90: enum vtagtype  {
                     91:        VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS, VT_LFS, VT_LOFS, VT_FDESC,
                     92:        VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,
                     93:        VT_UNION, VT_HFS, VT_VOLFS, VT_OTHER};
                     94: 
                     95: /*
                     96:  * Each underlying filesystem allocates its own private area and hangs
                     97:  * it from v_data.  If non-null, this area is freed in getnewvnode().
                     98:  */
                     99: LIST_HEAD(buflists, buf);
                    100: 
                    101: /*
                    102:  * Reading or writing any of these items requires holding the appropriate lock.
                    103:  * v_freelist is locked by the global vnode_free_list simple lock.
                    104:  * v_mntvnodes is locked by the global mntvnodes simple lock.
                    105:  * v_flag, v_usecount, v_holdcount and v_writecount are
                    106:  *    locked by the v_interlock simple lock.
                    107:  */
                    108: struct vnode {
                    109:        u_long  v_flag;                         /* vnode flags (see below) */
                    110:        short   v_usecount;                     /* reference count of users */
                    111:        short   v_writecount;                   /* reference count of writers */
                    112:        long    v_holdcnt;                      /* page & buffer references */
                    113:        daddr_t v_lastr;                        /* last read (read-ahead) */
                    114:        u_long  v_id;                           /* capability identifier */
                    115:        struct  mount *v_mount;                 /* ptr to vfs we are in */
                    116:        int     (**v_op)();                     /* vnode operations vector */
                    117:        TAILQ_ENTRY(vnode) v_freelist;          /* vnode freelist */
                    118:        LIST_ENTRY(vnode) v_mntvnodes;          /* vnodes for mount point */
                    119:        struct  buflists v_cleanblkhd;          /* clean blocklist head */
                    120:        struct  buflists v_dirtyblkhd;          /* dirty blocklist head */
                    121:        long    v_numoutput;                    /* num of writes in progress */
                    122:        enum    vtype v_type;                   /* vnode type */
                    123:        union {
                    124:                struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
                    125:                struct socket   *vu_socket;     /* unix ipc (VSOCK) */
                    126:                struct vm_info  *vu_vm_info;    /* private data for vm (VREG) */
                    127:                struct specinfo *vu_specinfo;   /* device (VCHR, VBLK) */
                    128:                struct fifoinfo *vu_fifoinfo;   /* fifo (VFIFO) */
                    129:        } v_un;
                    130:        struct  nqlease *v_lease;               /* Soft reference to lease */
                    131:        daddr_t v_lastw;                        /* last write (write cluster) */
                    132:        daddr_t v_cstart;                       /* start block of cluster */
                    133:        daddr_t v_lasta;                        /* last allocation */
                    134:        int     v_clen;                         /* length of current cluster */
                    135:        int     v_ralen;                        /* Read-ahead length */
                    136:        daddr_t v_maxra;                        /* last readahead block */
                    137:        simple_lock_data_t v_interlock;         /* lock on usecount and flag */
                    138:        struct  lock__bsd__ *v_vnlock;          /* used for non-locking fs's */
                    139:        long    v_spare[5];                     /* round to 128 bytes */
                    140:        enum    vtagtype v_tag;                 /* type of underlying data */
                    141:        void    *v_data;                        /* private data for fs */
                    142:         u_long  v_bread;
                    143:         u_long  v_consumed;
                    144:         u_long  v_trigger;
                    145:         int     v_power;
                    146: };
                    147: #define        v_mountedhere   v_un.vu_mountedhere
                    148: #define        v_socket        v_un.vu_socket
                    149: #define        v_vm_info       v_un.vu_vm_info
                    150: #define        v_specinfo      v_un.vu_specinfo
                    151: #define        v_fifoinfo      v_un.vu_fifoinfo
                    152: 
                    153: /*
                    154:  * Vnode flags.
                    155:  */
                    156: #define        VROOT           0x0001  /* root of its file system */
                    157: #define        VTEXT           0x0002  /* vnode is a pure text prototype */
                    158: #define        VSYSTEM         0x0004  /* vnode being used by kernel */
                    159: #define        VISTTY          0x0008  /* vnode represents a tty */
                    160: #define        VXLOCK          0x0100  /* vnode is locked to change underlying type */
                    161: #define        VXWANT          0x0200  /* process is waiting for vnode */
                    162: #define        VBWAIT          0x0400  /* waiting for output to complete */
                    163: #define        VALIASED        0x0800  /* vnode has an alias */
                    164: #define        VDIROP          0x1000  /* LFS: vnode is involved in a directory op */
                    165: #define VAGE            0x8000  /* Insert vnode at head of free list */
                    166: #define VRAOFF         0x10000  /* read ahead disabled */
                    167: 
                    168: /*
                    169:  * Vnode attributes.  A field value of VNOVAL represents a field whose value
                    170:  * is unavailable (getattr) or which is not to be changed (setattr).
                    171:  */
                    172: struct vattr {
                    173:        enum vtype      va_type;        /* vnode type (for create) */
                    174:        u_short         va_mode;        /* files access mode and type */
                    175:        short           va_nlink;       /* number of references to file */
                    176:        uid_t           va_uid;         /* owner user id */
                    177:        gid_t           va_gid;         /* owner group id */
                    178:        long            va_fsid;        /* file system id (dev for now) */
                    179:        long            va_fileid;      /* file id */
                    180:        u_quad_t        va_size;        /* file size in bytes */
                    181:        long            va_blocksize;   /* blocksize preferred for i/o */
                    182:        struct timespec va_atime;       /* time of last access */
                    183:        struct timespec va_mtime;       /* time of last modification */
                    184:        struct timespec va_ctime;       /* time file changed */
                    185:        u_long          va_gen;         /* generation number of file */
                    186:        u_long          va_flags;       /* flags defined for file */
                    187:        dev_t           va_rdev;        /* device the special file represents */
                    188:        u_quad_t        va_bytes;       /* bytes of disk space held by file */
                    189:        u_quad_t        va_filerev;     /* file modification number */
                    190:        u_int           va_vaflags;     /* operations flags, see below */
                    191:        long            va_spare;       /* remain quad aligned */
                    192: };
                    193: 
                    194: /*
                    195:  * Flags for va_vaflags.
                    196:  */
                    197: #define        VA_UTIMES_NULL  0x01            /* utimes argument was NULL */
                    198: #define VA_EXCLUSIVE   0x02            /* exclusive create request */
                    199: 
                    200: /*
                    201:  * Flags for ioflag.
                    202:  */
                    203: #define        IO_UNIT         0x01            /* do I/O as atomic unit */
                    204: #define        IO_APPEND       0x02            /* append write to end */
                    205: #define        IO_SYNC         0x04            /* do I/O synchronously */
                    206: #define        IO_NODELOCKED   0x08            /* underlying node already locked */
                    207: #define        IO_NDELAY       0x10            /* FNDELAY flag set in file table */
                    208: #define IO_NOZEROFILL   0x20           /* F_SETSIZE fcntl uses to prevent zero filling */
                    209: 
                    210: /*
                    211:  *  Modes.  Some values same as Ixxx entries from inode.h for now.
                    212:  */
                    213: #define        VSUID   04000           /* set user id on execution */
                    214: #define        VSGID   02000           /* set group id on execution */
                    215: #define        VSVTX   01000           /* save swapped text even after use */
                    216: #define        VREAD   00400           /* read, write, execute permissions */
                    217: #define        VWRITE  00200
                    218: #define        VEXEC   00100
                    219: 
                    220: /*
                    221:  * Token indicating no attribute value yet assigned.
                    222:  */
                    223: #define        VNOVAL  (-1)
                    224: 
                    225: #ifdef _KERNEL
                    226: /*
                    227:  * Convert between vnode types and inode formats (since POSIX.1
                    228:  * defines mode word of stat structure in terms of inode formats).
                    229:  */
                    230: extern enum vtype      iftovt_tab[];
                    231: extern int             vttoif_tab[];
                    232: #define IFTOVT(mode)   (iftovt_tab[((mode) & S_IFMT) >> 12])
                    233: #define VTTOIF(indx)   (vttoif_tab[(int)(indx)])
                    234: #define MAKEIMODE(indx, mode)  (int)(VTTOIF(indx) | (mode))
                    235: 
                    236: /*
                    237:  * Flags to various vnode functions.
                    238:  */
                    239: #define        SKIPSYSTEM      0x0001          /* vflush: skip vnodes marked VSYSTEM */
                    240: #define        FORCECLOSE      0x0002          /* vflush: force file closeure */
                    241: #define        WRITECLOSE      0x0004          /* vflush: only close writeable files */
                    242: #define        DOCLOSE         0x0008          /* vclean: close active files */
                    243: #define        V_SAVE          0x0001          /* vinvalbuf: sync file first */
                    244: #define        V_SAVEMETA      0x0002          /* vinvalbuf: leave indirect blocks */
                    245: #define        REVOKEALL       0x0001          /* vop_revoke: revoke all aliases */
                    246: #define PREALLOCATE      0x00000001      /* vop_allocate: preallocate allocation blocks */
                    247: #define ALLOCATECONTIG   0x00000002      /* vop_allocate: allocate contigious space */
                    248: #define ALLOCATEALL      0x00000004    /* vop_allocate: allocate all requested space or no space at all */
                    249: #define FREEREMAINDER    0x00000008      /* vop_allcoate: deallocate allocated but unfilled blocks */
                    250: #define ALLOCATEFROMPEOF 0x00000010      /* vop_allocate: allocate from the physical eof */
                    251: 
                    252: 
                    253: 
                    254: #if DIAGNOSTIC
                    255: #define        HOLDRELE(vp)    holdrele(vp)
                    256: #define        VATTR_NULL(vap) vattr_null(vap)
                    257: #define        VHOLD(vp)       vhold(vp)
                    258: #define        VREF(vp)        vref(vp)
                    259: 
                    260: void   holdrele __P((struct vnode *));
                    261: void   vattr_null __P((struct vattr *));
                    262: void   vhold __P((struct vnode *));
                    263: void   vref __P((struct vnode *));
                    264: #else
                    265: #define        VATTR_NULL(vap) (*(vap) = va_null)      /* initialize a vattr */
                    266: #define        HOLDRELE(vp)    holdrele(vp)            /* decrease buf or page ref */
                    267: extern __inline void holdrele(vp)
                    268:        struct vnode *vp;
                    269: {
                    270:        simple_lock(&vp->v_interlock);
                    271:        vp->v_holdcnt--;
                    272:        simple_unlock(&vp->v_interlock);
                    273: }
                    274: #define        VHOLD(vp)       vhold(vp)               /* increase buf or page ref */
                    275: extern __inline void vhold(vp)
                    276:        struct vnode *vp;
                    277: {
                    278:        simple_lock(&vp->v_interlock);
                    279:        vp->v_holdcnt++;
                    280:        simple_unlock(&vp->v_interlock);
                    281: }
                    282: #define        VREF(vp)        vref(vp)                /* increase reference */
                    283: extern __inline void vref(vp)
                    284:        struct vnode *vp;
                    285: {
                    286:        simple_lock(&vp->v_interlock);
                    287:        vp->v_usecount++;
                    288:        simple_unlock(&vp->v_interlock);
                    289: }
                    290: #endif /* DIAGNOSTIC */
                    291: 
                    292: #define        NULLVP  ((struct vnode *)NULL)
                    293: 
                    294: /*
                    295:  * Global vnode data.
                    296:  */
                    297: extern struct vnode *rootvnode;        /* root (i.e. "/") vnode */
                    298: extern int desiredvnodes;              /* number of vnodes desired */
                    299: extern struct vattr va_null;           /* predefined null vattr structure */
                    300: 
                    301: /*
                    302:  * Macro/function to check for client cache inconsistency w.r.t. leasing.
                    303:  */
                    304: #define        LEASE_READ      0x1             /* Check lease for readers */
                    305: #define        LEASE_WRITE     0x2             /* Check lease for modifiers */
                    306: 
                    307: #endif /* _KERNEL */
                    308: 
                    309: 
                    310: /*
                    311:  * Mods for exensibility.
                    312:  */
                    313: 
                    314: /*
                    315:  * Flags for vdesc_flags:
                    316:  */
                    317: #define VDESC_MAX_VPS          16
                    318: /* Low order 16 flag bits are reserved for willrele flags for vp arguments. */
                    319: #define VDESC_VP0_WILLRELE     0x0001
                    320: #define VDESC_VP1_WILLRELE     0x0002
                    321: #define VDESC_VP2_WILLRELE     0x0004
                    322: #define VDESC_VP3_WILLRELE     0x0008
                    323: #define VDESC_NOMAP_VPP                0x0100
                    324: #define VDESC_VPP_WILLRELE     0x0200
                    325: 
                    326: /*
                    327:  * VDESC_NO_OFFSET is used to identify the end of the offset list
                    328:  * and in places where no such field exists.
                    329:  */
                    330: #define VDESC_NO_OFFSET -1
                    331: 
                    332: /*
                    333:  * This structure describes the vnode operation taking place.
                    334:  */
                    335: struct vnodeop_desc {
                    336:        int     vdesc_offset;           /* offset in vector--first for speed */
                    337:        char    *vdesc_name;            /* a readable name for debugging */
                    338:        int     vdesc_flags;            /* VDESC_* flags */
                    339: 
                    340:        /*
                    341:         * These ops are used by bypass routines to map and locate arguments.
                    342:         * Creds and procs are not needed in bypass routines, but sometimes
                    343:         * they are useful to (for example) transport layers.
                    344:         * Nameidata is useful because it has a cred in it.
                    345:         */
                    346:        int     *vdesc_vp_offsets;      /* list ended by VDESC_NO_OFFSET */
                    347:        int     vdesc_vpp_offset;       /* return vpp location */
                    348:        int     vdesc_cred_offset;      /* cred location, if any */
                    349:        int     vdesc_proc_offset;      /* proc location, if any */
                    350:        int     vdesc_componentname_offset; /* if any */
                    351:        /*
                    352:         * Finally, we've got a list of private data (about each operation)
                    353:         * for each transport layer.  (Support to manage this list is not
                    354:         * yet part of BSD.)
                    355:         */
                    356:        caddr_t *vdesc_transports;
                    357: };
                    358: 
                    359: #ifdef _KERNEL
                    360: /*
                    361:  * A list of all the operation descs.
                    362:  */
                    363: extern struct vnodeop_desc *vnodeop_descs[];
                    364: 
                    365: /*
                    366:  * Interlock for scanning list of vnodes attached to a mountpoint
                    367:  */
                    368: extern struct slock mntvnode_slock;
                    369: 
                    370: /*
                    371:  * This macro is very helpful in defining those offsets in the vdesc struct.
                    372:  *
                    373:  * This is stolen from X11R4.  I ingored all the fancy stuff for
                    374:  * Crays, so if you decide to port this to such a serious machine,
                    375:  * you might want to consult Intrisics.h's XtOffset{,Of,To}.
                    376:  */
                    377: #define VOPARG_OFFSET(p_type,field) \
                    378:         ((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
                    379: #define VOPARG_OFFSETOF(s_type,field) \
                    380:        VOPARG_OFFSET(s_type*,field)
                    381: #define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \
                    382:        ((S_TYPE)(((char*)(STRUCT_P))+(S_OFFSET)))
                    383: 
                    384: 
                    385: /*
                    386:  * This structure is used to configure the new vnodeops vector.
                    387:  */
                    388: struct vnodeopv_entry_desc {
                    389:        struct vnodeop_desc *opve_op;   /* which operation this is */
                    390:        int (*opve_impl)();             /* code implementing this operation */
                    391: };
                    392: struct vnodeopv_desc {
                    393:                        /* ptr to the ptr to the vector where op should go */
                    394:        int (***opv_desc_vector_p)();
                    395:        struct vnodeopv_entry_desc *opv_desc_ops;   /* null terminated list */
                    396: };
                    397: 
                    398: /*
                    399:  * A default routine which just returns an error.
                    400:  */
                    401: int vn_default_error __P((void));
                    402: 
                    403: /*
                    404:  * A generic structure.
                    405:  * This can be used by bypass routines to identify generic arguments.
                    406:  */
                    407: struct vop_generic_args {
                    408:        struct vnodeop_desc *a_desc;
                    409:        /* other random data follows, presumably */
                    410: };
                    411: 
                    412: /*
                    413:  * VOCALL calls an op given an ops vector.  We break it out because BSD's
                    414:  * vclean changes the ops vector and then wants to call ops with the old
                    415:  * vector.
                    416:  */
                    417: #define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP))
                    418: 
                    419: /*
                    420:  * This call works for vnodes in the kernel.
                    421:  */
                    422: #define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP))
                    423: #define VDESC(OP) (& __CONCAT(OP,_desc))
                    424: #define VOFFSET(OP) (VDESC(OP)->vdesc_offset)
                    425: 
                    426: /*
                    427:  * Finally, include the default set of vnode operations.
                    428:  */
                    429: #include <sys/vnode_if.h>
                    430: 
                    431: /*
                    432:  * Public vnode manipulation functions.
                    433:  */
                    434: struct file;
                    435: struct mount;
                    436: struct nameidata;
                    437: struct ostat;
                    438: struct proc;
                    439: struct stat;
                    440: struct ucred;
                    441: struct uio;
                    442: struct vattr;
                    443: struct vnode;
                    444: struct vop_bwrite_args;
                    445: 
                    446: int    bdevvp __P((dev_t dev, struct vnode **vpp));
                    447: void   cvtstat __P((struct stat *st, struct ostat *ost));
                    448: int    getnewvnode __P((enum vtagtype tag,
                    449:            struct mount *mp, int (**vops)(), struct vnode **vpp));
                    450: void   insmntque __P((struct vnode *vp, struct mount *mp));
                    451: void   vattr_null __P((struct vattr *vap));
                    452: int    vcount __P((struct vnode *vp));
                    453: int    vflush __P((struct mount *mp, struct vnode *skipvp, int flags));
                    454: int    vget __P((struct vnode *vp, int lockflag, struct proc *p));
                    455: void   vgone __P((struct vnode *vp));
                    456: int    vinvalbuf __P((struct vnode *vp, int save, struct ucred *cred,
                    457:            struct proc *p, int slpflag, int slptimeo));
                    458: void   vprint __P((char *label, struct vnode *vp));
                    459: int    vrecycle __P((struct vnode *vp, struct slock *inter_lkp,
                    460:            struct proc *p));
                    461: int    vn_bwrite __P((struct vop_bwrite_args *ap));
                    462: int    vn_close __P((struct vnode *vp,
                    463:            int flags, struct ucred *cred, struct proc *p));
                    464: int    vn_closefile __P((struct file *fp, struct proc *p));
                    465: int    vn_ioctl __P((struct file *fp, u_long com, caddr_t data,
                    466:            struct proc *p));
                    467: int    vn_lock __P((struct vnode *vp, int flags, struct proc *p));
                    468: int    vn_open __P((struct nameidata *ndp, int fmode, int cmode));
                    469: int    vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
                    470:            int len, off_t offset, enum uio_seg segflg, int ioflg,
                    471:            struct ucred *cred, int *aresid, struct proc *p));
                    472: int    vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
                    473: int    vn_select __P((struct file *fp, int which, struct proc *p));
                    474: int    vn_stat __P((struct vnode *vp, struct stat *sb, struct proc *p));
                    475: int    vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
                    476: int    vop_noislocked __P((struct vop_islocked_args *));
                    477: int    vop_nolock __P((struct vop_lock_args *));
                    478: int    vop_nounlock __P((struct vop_unlock_args *));
                    479: int    vop_revoke __P((struct vop_revoke_args *));
                    480: struct vnode *
                    481:        checkalias __P((struct vnode *vp, dev_t nvp_rdev, struct mount *mp));
                    482: void   vput __P((struct vnode *vp));
                    483: void   vrele __P((struct vnode *vp));
                    484: int    vaccess __P((mode_t file_mode, uid_t uid, gid_t gid,
                    485:            mode_t acc_mode, struct ucred *cred));
                    486: int    getvnode __P((struct proc *p, int fd, struct file **fpp));
                    487: 
                    488: #endif /* _KERNEL */
                    489: 
                    490: #endif /* !_VNODE_H_ */

unix.superglobalmegacorp.com

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