[BACK]Return to vnode.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/vnode.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: vnode.h,v 1.88 2007/06/14 20:36:34 otto Exp $ */
                      2: /*     $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $   */
                      3:
                      4: /*
                      5:  * Copyright (c) 1989, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. Neither the name of the University nor the names of its contributors
                     17:  *    may be used to endorse or promote products derived from this software
                     18:  *    without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     @(#)vnode.h     8.11 (Berkeley) 11/21/94
                     33:  */
                     34:
                     35: #include <sys/types.h>
                     36: #include <sys/queue.h>
                     37: #include <sys/lock.h>
                     38: #include <sys/selinfo.h>
                     39:
                     40: #include <uvm/uvm.h>
                     41: #include <uvm/uvm_vnode.h>
                     42:
                     43: /*
                     44:  * The vnode is the focus of all file activity in UNIX.  There is a
                     45:  * unique vnode allocated for each active file, each current directory,
                     46:  * each mounted-on file, text file, and the root.
                     47:  */
                     48:
                     49: /*
                     50:  * Vnode types.  VNON means no type.
                     51:  */
                     52: enum vtype     { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
                     53:
                     54: #define        VTYPE_NAMES \
                     55:     "VNON", "VREG", "VDIR", "VBLK", "VCHR", "VLNK", "VSOCK", "VFIFO", "VBAD"
                     56:
                     57: /*
                     58:  * Vnode tag types.
                     59:  * These are for the benefit of external programs only (e.g., pstat)
                     60:  * and should NEVER be inspected by the kernel.
                     61:  *
                     62:  * Note that v_tag is actually used to tell MFS from FFS, and EXT2FS from
                     63:  * the rest, so don't believe the above comment!
                     64:  */
                     65: enum vtagtype  {
                     66:        VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS,
                     67:        VT_PORTAL, VT_PROCFS, VT_AFS, VT_ISOFS, VT_ADOSFS,
                     68:        VT_EXT2FS, VT_VFS, VT_XFS, VT_NTFS, VT_UDF
                     69: };
                     70:
                     71: #define        VTAG_NAMES \
                     72:     "NON", "UFS", "NFS", "MFS", "MSDOSFS",                     \
                     73:     "PORTAL", "PROCFS", "AFS", "ISOFS", "ADOSFS",              \
                     74:     "EXT2FS", "VFS", "XFS", "NTFS", "UDF"
                     75:
                     76: /*
                     77:  * Each underlying filesystem allocates its own private area and hangs
                     78:  * it from v_data.  If non-null, this area is freed in getnewvnode().
                     79:  */
                     80: LIST_HEAD(buflists, buf);
                     81:
                     82: struct vnode {
                     83:        struct uvm_vnode v_uvm;                 /* uvm data */
                     84:        int     (**v_op)(void *);               /* vnode operations vector */
                     85:        enum    vtype v_type;                   /* vnode type */
                     86:        u_int   v_flag;                         /* vnode flags (see below) */
                     87:        u_int   v_usecount;                     /* reference count of users */
                     88:        /* reference count of writers */
                     89:        u_int   v_writecount;
                     90:        /* Flags that can be read/written in interrupts */
                     91:        u_int   v_bioflag;
                     92:        u_int   v_holdcnt;                      /* buffer references */
                     93:        u_int   v_id;                           /* capability identifier */
                     94:        struct  mount *v_mount;                 /* ptr to vfs we are in */
                     95:        TAILQ_ENTRY(vnode) v_freelist;          /* vnode freelist */
                     96:        LIST_ENTRY(vnode) v_mntvnodes;          /* vnodes for mount point */
                     97:        struct  buflists v_cleanblkhd;          /* clean blocklist head */
                     98:        struct  buflists v_dirtyblkhd;          /* dirty blocklist head */
                     99:        u_int   v_numoutput;                    /* num of writes in progress */
                    100:        LIST_ENTRY(vnode) v_synclist;           /* vnode with dirty buffers */
                    101:        union {
                    102:                struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
                    103:                struct socket   *vu_socket;     /* unix ipc (VSOCK) */
                    104:                struct specinfo *vu_specinfo;   /* device (VCHR, VBLK) */
                    105:                struct fifoinfo *vu_fifoinfo;   /* fifo (VFIFO) */
                    106:        } v_un;
                    107:
                    108:        enum    vtagtype v_tag;                 /* type of underlying data */
                    109:        void    *v_data;                        /* private data for fs */
                    110:        struct  selinfo v_selectinfo;           /* identity of poller(s) */
                    111: };
                    112: #define        v_mountedhere   v_un.vu_mountedhere
                    113: #define        v_socket        v_un.vu_socket
                    114: #define        v_specinfo      v_un.vu_specinfo
                    115: #define        v_fifoinfo      v_un.vu_fifoinfo
                    116:
                    117: /*
                    118:  * Vnode flags.
                    119:  */
                    120: #define        VROOT           0x0001  /* root of its file system */
                    121: #define        VTEXT           0x0002  /* vnode is a pure text prototype */
                    122: #define        VSYSTEM         0x0004  /* vnode being used by kernel */
                    123: #define        VISTTY          0x0008  /* vnode represents a tty */
                    124: #define        VXLOCK          0x0100  /* vnode is locked to change underlying type */
                    125: #define        VXWANT          0x0200  /* process is waiting for vnode */
                    126: #define        VCLONED         0x0400  /* vnode was cloned */
                    127: #define        VALIASED        0x0800  /* vnode has an alias */
                    128: #define        VLOCKSWORK      0x4000  /* FS supports locking discipline */
                    129: #define        VBITS   "\010\001ROOT\002TEXT\003SYSTEM\004ISTTY\010XLOCK" \
                    130:     "\011XWANT\013ALIASED\016LOCKSWORK"
                    131:
                    132: /*
                    133:  * (v_bioflag) Flags that may be manipulated by interrupt handlers
                    134:  */
                    135: #define        VBIOWAIT        0x0001  /* waiting for output to complete */
                    136: #define VBIOONSYNCLIST 0x0002  /* Vnode is on syncer worklist */
                    137: #define VBIOONFREELIST  0x0004  /* Vnode is on a free list */
                    138:
                    139: /*
                    140:  * Vnode attributes.  A field value of VNOVAL represents a field whose value
                    141:  * is unavailable (getattr) or which is not to be changed (setattr).
                    142:  */
                    143: struct vattr {
                    144:        enum vtype      va_type;        /* vnode type (for create) */
                    145:        mode_t          va_mode;        /* files access mode and type */
                    146:        nlink_t         va_nlink;       /* number of references to file */
                    147:        uid_t           va_uid;         /* owner user id */
                    148:        gid_t           va_gid;         /* owner group id */
                    149:        long            va_fsid;        /* file system id (dev for now) */
                    150:        long            va_fileid;      /* file id */
                    151:        u_quad_t        va_size;        /* file size in bytes */
                    152:        long            va_blocksize;   /* blocksize preferred for i/o */
                    153:        struct timespec va_atime;       /* time of last access */
                    154:        struct timespec va_mtime;       /* time of last modification */
                    155:        struct timespec va_ctime;       /* time file changed */
                    156:        u_long          va_gen;         /* generation number of file */
                    157:        u_long          va_flags;       /* flags defined for file */
                    158:        dev_t           va_rdev;        /* device the special file represents */
                    159:        u_quad_t        va_bytes;       /* bytes of disk space held by file */
                    160:        u_quad_t        va_filerev;     /* file modification number */
                    161:        u_int           va_vaflags;     /* operations flags, see below */
                    162:        long            va_spare;       /* remain quad aligned */
                    163: };
                    164:
                    165: /*
                    166:  * Flags for va_cflags.
                    167:  */
                    168: #define        VA_UTIMES_NULL  0x01            /* utimes argument was NULL */
                    169: #define VA_EXCLUSIVE    0x02           /* exclusive create request */
                    170: /*
                    171:  * Flags for ioflag.
                    172:  */
                    173: #define        IO_UNIT         0x01            /* do I/O as atomic unit */
                    174: #define        IO_APPEND       0x02            /* append write to end */
                    175: #define        IO_SYNC         0x04            /* do I/O synchronously */
                    176: #define        IO_NODELOCKED   0x08            /* underlying node already locked */
                    177: #define        IO_NDELAY       0x10            /* FNDELAY flag set in file table */
                    178: #define        IO_NOLIMIT      0x20            /* don't enforce limits on i/o */
                    179:
                    180: /*
                    181:  *  Modes.  Some values same as Ixxx entries from inode.h for now.
                    182:  */
                    183: #define        VSUID   04000           /* set user id on execution */
                    184: #define        VSGID   02000           /* set group id on execution */
                    185: #define        VSVTX   01000           /* save swapped text even after use */
                    186: #define        VREAD   00400           /* read, write, execute permissions */
                    187: #define        VWRITE  00200
                    188: #define        VEXEC   00100
                    189:
                    190: /*
                    191:  * Token indicating no attribute value yet assigned.
                    192:  */
                    193: #define        VNOVAL  (-1)
                    194:
                    195: /*
                    196:  * Structure returned by the KERN_VNODE sysctl
                    197:  */
                    198: struct e_vnode {
                    199:        struct vnode *vptr;
                    200:        struct vnode vnode;
                    201: };
                    202:
                    203: #ifdef _KERNEL
                    204: /*
                    205:  * Convert between vnode types and inode formats (since POSIX.1
                    206:  * defines mode word of stat structure in terms of inode formats).
                    207:  */
                    208: extern enum vtype      iftovt_tab[];
                    209: extern int             vttoif_tab[];
                    210: #define IFTOVT(mode)   (iftovt_tab[((mode) & S_IFMT) >> 12])
                    211: #define VTTOIF(indx)   (vttoif_tab[(int)(indx)])
                    212: #define MAKEIMODE(indx, mode)  (int)(VTTOIF(indx) | (mode))
                    213:
                    214: /*
                    215:  * Flags to various vnode functions.
                    216:  */
                    217: #define        SKIPSYSTEM      0x0001          /* vflush: skip vnodes marked VSYSTEM */
                    218: #define        FORCECLOSE      0x0002          /* vflush: force file closeure */
                    219: #define        WRITECLOSE      0x0004          /* vflush: only close writeable files */
                    220: #define        DOCLOSE         0x0008          /* vclean: close active files */
                    221: #define        V_SAVE          0x0001          /* vinvalbuf: sync file first */
                    222: #define        V_SAVEMETA      0x0002          /* vinvalbuf: leave indirect blocks */
                    223:
                    224: #define REVOKEALL      0x0001          /* vop_revoke: revoke all aliases */
                    225:
                    226:
                    227: TAILQ_HEAD(freelst, vnode);
                    228: extern struct freelst vnode_hold_list; /* free vnodes referencing buffers */
                    229: extern struct freelst vnode_free_list; /* vnode free list */
                    230:
                    231: #define        VATTR_NULL(vap) vattr_null(vap)
                    232: #define        VREF(vp)        vref(vp)                /* increase reference */
                    233: #define        NULLVP  ((struct vnode *)NULL)
                    234: #define        VN_KNOTE(vp, b)                                 \
                    235:        KNOTE(&vp->v_selectinfo.si_note, (b))
                    236:
                    237: /*
                    238:  * Global vnode data.
                    239:  */
                    240: extern struct vnode *rootvnode;        /* root (i.e. "/") vnode */
                    241: extern int desiredvnodes;              /* XXX number of vnodes desired */
                    242: extern int maxvnodes;                  /* XXX number of vnodes to allocate */
                    243: extern time_t syncdelay;               /* time to delay syncing vnodes */
                    244: extern int rushjob;                    /* # of slots syncer should run ASAP */
                    245: #endif /* _KERNEL */
                    246:
                    247:
                    248: /*
                    249:  * Mods for exensibility.
                    250:  */
                    251:
                    252: /*
                    253:  * Flags for vdesc_flags:
                    254:  */
                    255: #define VDESC_MAX_VPS          16
                    256: /* Low order 16 flag bits are reserved for willrele flags for vp arguments. */
                    257: #define VDESC_VP0_WILLRELE      0x00000001
                    258: #define VDESC_VP1_WILLRELE      0x00000002
                    259: #define VDESC_VP2_WILLRELE      0x00000004
                    260: #define VDESC_VP3_WILLRELE      0x00000008
                    261: #define VDESC_VP0_WILLUNLOCK    0x00000100
                    262: #define VDESC_VP1_WILLUNLOCK    0x00000200
                    263: #define VDESC_VP2_WILLUNLOCK    0x00000400
                    264: #define VDESC_VP3_WILLUNLOCK    0x00000800
                    265: #define VDESC_VP0_WILLPUT       0x00000101
                    266: #define VDESC_VP1_WILLPUT       0x00000202
                    267: #define VDESC_VP2_WILLPUT       0x00000404
                    268: #define VDESC_VP3_WILLPUT       0x00000808
                    269: #define VDESC_NOMAP_VPP         0x00010000
                    270: #define VDESC_VPP_WILLRELE      0x00020000
                    271:
                    272: /*
                    273:  * VDESC_NO_OFFSET is used to identify the end of the offset list
                    274:  * and in places where no such field exists.
                    275:  */
                    276: #define VDESC_NO_OFFSET -1
                    277:
                    278: /*
                    279:  * This structure describes the vnode operation taking place.
                    280:  */
                    281: struct vnodeop_desc {
                    282:        int     vdesc_offset;           /* offset in vector--first for speed */
                    283:        char    *vdesc_name;            /* a readable name for debugging */
                    284:        int     vdesc_flags;            /* VDESC_* flags */
                    285:
                    286:        /*
                    287:         * These ops are used by bypass routines to map and locate arguments.
                    288:         * Creds and procs are not needed in bypass routines, but sometimes
                    289:         * they are useful to (for example) transport layers.
                    290:         * Nameidata is useful because it has a cred in it.
                    291:         */
                    292:        int     *vdesc_vp_offsets;      /* list ended by VDESC_NO_OFFSET */
                    293:        int     vdesc_vpp_offset;       /* return vpp location */
                    294:        int     vdesc_cred_offset;      /* cred location, if any */
                    295:        int     vdesc_proc_offset;      /* proc location, if any */
                    296:        int     vdesc_componentname_offset; /* if any */
                    297:        /*
                    298:         * Finally, we've got a list of private data (about each operation)
                    299:         * for each transport layer.  (Support to manage this list is not
                    300:         * yet part of BSD.)
                    301:         */
                    302:        caddr_t *vdesc_transports;
                    303: };
                    304:
                    305: #ifdef _KERNEL
                    306: /*
                    307:  * A list of all the operation descs.
                    308:  */
                    309: extern struct vnodeop_desc *vnodeop_descs[];
                    310:
                    311:
                    312: /*
                    313:  * This macro is very helpful in defining those offsets in the vdesc struct.
                    314:  *
                    315:  * This is stolen from X11R4.  I ingored all the fancy stuff for
                    316:  * Crays, so if you decide to port this to such a serious machine,
                    317:  * you might want to consult Intrisics.h's XtOffset{,Of,To}.
                    318:  */
                    319: #define VOPARG_OFFSET(p_type,field) \
                    320:        ((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
                    321: #define VOPARG_OFFSETOF(s_type,field) \
                    322:        VOPARG_OFFSET(s_type*,field)
                    323: #define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \
                    324:        ((S_TYPE)(((char *)(STRUCT_P))+(S_OFFSET)))
                    325:
                    326:
                    327: /*
                    328:  * This structure is used to configure the new vnodeops vector.
                    329:  */
                    330: struct vnodeopv_entry_desc {
                    331:        struct vnodeop_desc *opve_op;   /* which operation this is */
                    332:        int (*opve_impl)(void *);       /* code implementing this operation */
                    333: };
                    334: struct vnodeopv_desc {
                    335:                        /* ptr to the ptr to the vector where op should go */
                    336:        int (***opv_desc_vector_p)(void *);
                    337:        struct vnodeopv_entry_desc *opv_desc_ops;   /* null terminated list */
                    338: };
                    339:
                    340: /*
                    341:  * A default routine which just returns an error.
                    342:  */
                    343: int vn_default_error(void *);
                    344:
                    345: /*
                    346:  * A generic structure.
                    347:  * This can be used by bypass routines to identify generic arguments.
                    348:  */
                    349: struct vop_generic_args {
                    350:        struct vnodeop_desc *a_desc;
                    351:        /* other random data follows, presumably */
                    352: };
                    353:
                    354: /*
                    355:  * VOCALL calls an op given an ops vector.  We break it out because BSD's
                    356:  * vclean changes the ops vector and then wants to call ops with the old
                    357:  * vector.
                    358:  */
                    359: #define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP))
                    360:
                    361: /*
                    362:  * This call works for vnodes in the kernel.
                    363:  */
                    364: #define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP))
                    365: #define VDESC(OP) (& __CONCAT(OP,_desc))
                    366: #define VOFFSET(OP) (VDESC(OP)->vdesc_offset)
                    367:
                    368: /*
                    369:  * Finally, include the default set of vnode operations.
                    370:  */
                    371: #include <sys/vnode_if.h>
                    372:
                    373: /*
                    374:  * Public vnode manipulation functions.
                    375:  */
                    376: struct file;
                    377: struct filedesc;
                    378: struct mount;
                    379: struct nameidata;
                    380: struct proc;
                    381: struct stat;
                    382: struct ucred;
                    383: struct uio;
                    384: struct vattr;
                    385: struct vnode;
                    386:
                    387: /* vfs_subr */
                    388: int    bdevvp(dev_t, struct vnode **);
                    389: int    cdevvp(dev_t, struct vnode **);
                    390: struct vnode *checkalias(struct vnode *, dev_t, struct mount *);
                    391: int    getnewvnode(enum vtagtype, struct mount *, int (**vops)(void *),
                    392:            struct vnode **);
                    393: int    vaccess(mode_t, uid_t, gid_t, mode_t, struct ucred *);
                    394: void   vattr_null(struct vattr *);
                    395: void   vdevgone(int, int, int, enum vtype);
                    396: int    vcount(struct vnode *);
                    397: int    vfinddev(dev_t, enum vtype, struct vnode **);
                    398: void   vflushbuf(struct vnode *, int);
                    399: int    vflush(struct mount *, struct vnode *, int);
                    400: int    vget(struct vnode *, int, struct proc *);
                    401: void   vgone(struct vnode *);
                    402: void   vgonel(struct vnode *, struct proc *);
                    403: int    vinvalbuf(struct vnode *, int, struct ucred *, struct proc *,
                    404:            int, int);
                    405: void   vntblinit(void);
                    406: int    vwaitforio(struct vnode *, int, char *, int);
                    407: void   vwakeup(struct vnode *);
                    408: void   vput(struct vnode *);
                    409: int    vrecycle(struct vnode *, struct proc *);
                    410: void   vrele(struct vnode *);
                    411: void   vref(struct vnode *);
                    412: void   vprint(char *, struct vnode *);
                    413:
                    414: /* vfs_getcwd.c */
                    415: int vfs_getcwd_scandir(struct vnode **, struct vnode **, char **, char *,
                    416:     struct proc *);
                    417: int vfs_getcwd_common(struct vnode *, struct vnode *, char **, char *, int,
                    418:     int, struct proc *);
                    419: int vfs_getcwd_getcache(struct vnode **, struct vnode **, char **, char *);
                    420:
                    421: /* vfs_default.c */
                    422: int    vop_generic_abortop(void *);
                    423: int    vop_generic_bwrite(void *);
                    424: int    vop_generic_islocked(void *);
                    425: int    vop_generic_lock(void *);
                    426: int    vop_generic_unlock(void *);
                    427: int    vop_generic_revoke(void *);
                    428: int    vop_generic_kqfilter(void *);
                    429:
                    430: /* vfs_vnops.c */
                    431: int    vn_isunder(struct vnode *, struct vnode *, struct proc *);
                    432: int    vn_close(struct vnode *, int, struct ucred *, struct proc *);
                    433: int    vn_open(struct nameidata *, int, int);
                    434: int    vn_rdwr(enum uio_rw, struct vnode *, caddr_t, int, off_t,
                    435:            enum uio_seg, int, struct ucred *, size_t *, struct proc *);
                    436: int    vn_stat(struct vnode *, struct stat *, struct proc *);
                    437: int    vn_statfile(struct file *, struct stat *, struct proc *);
                    438: int    vn_lock(struct vnode *, int, struct proc *);
                    439: int    vn_writechk(struct vnode *);
                    440: int    vn_ioctl(struct file *, u_long, caddr_t, struct proc *);
                    441: void   vn_marktext(struct vnode *);
                    442:
                    443: /* vfs_sync.c */
                    444: void   sched_sync(struct proc *);
                    445: void   vn_initialize_syncerd(void);
                    446: void   vn_syncer_add_to_worklist(struct vnode *, int);
                    447:
                    448: /* misc */
                    449: int    vn_isdisk(struct vnode *, int *);
                    450: int    softdep_fsync(struct vnode *);
                    451: int    getvnode(struct filedesc *, int, struct file **);
                    452:
                    453: #endif /* _KERNEL */

CVSweb