The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/vnode.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 1c746610ae5566133cad4cc192c49163


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.