Annotation of kernel/bsd/sys/vnode.h, revision 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.