home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Portable Patmos / usr / include / sys / vnode.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-08  |  14.2 KB  |  344 lines  |  [TEXT/R*ch]

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    from: @(#)vnode.h    7.39 (Berkeley) 6/27/91
  34.  *    $Id: vnode.h,v 1.11 1993/09/07 15:41:57 ws Exp $
  35.  */
  36.  
  37. #ifndef _SYS_VNODE_H_
  38. #define _SYS_VNODE_H_
  39.  
  40. #ifndef KERNEL
  41. #include <machine/endian.h>
  42. #endif
  43.  
  44. /*
  45.  * The vnode is the focus of all file activity in UNIX.
  46.  * There is a unique vnode allocated for each active file,
  47.  * each current directory, each mounted-on file, text file, and the root.
  48.  */
  49.  
  50. /*
  51.  * vnode types. VNON means no type.
  52.  */
  53. enum vtype     { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VPROC, VBAD };
  54.  
  55. /*
  56.  * Vnode tag types.
  57.  * These are for the benefit of external programs only (e.g., pstat)
  58.  * and should NEVER be inspected inside the kernel.
  59.  */
  60. enum vtagtype    { VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS, VT_ISOFS,
  61.           VT_KERNFS, VT_FDESC, VT_PROCFS };
  62.  
  63. /*
  64.  * This defines the maximum size of the private data area
  65.  * permitted for any file system type. A defined constant 
  66.  * is used rather than a union structure to cut down on the
  67.  * number of header files that must be included.
  68.  */
  69. #define    VN_MAXPRIVATE    188
  70.  
  71. struct vnode {
  72.     u_long        v_flag;            /* vnode flags (see below) */
  73.     short        v_usecount;        /* reference count of users */
  74.     short        v_writecount;        /* reference count of writers */
  75.     long        v_holdcnt;        /* page & buffer references */
  76.     off_t        v_lastr;        /* last read (read-ahead) */
  77.     u_long        v_id;            /* capability identifier */
  78.     struct mount    *v_mount;        /* ptr to vfs we are in */
  79.     struct vnodeops    *v_op;            /* vnode operations */
  80.     struct vnode    *v_freef;        /* vnode freelist forward */
  81.     struct vnode    **v_freeb;        /* vnode freelist back */
  82.     struct vnode    *v_mountf;        /* vnode mountlist forward */
  83.     struct vnode    **v_mountb;        /* vnode mountlist back */
  84.     struct buf    *v_cleanblkhd;        /* clean blocklist head */
  85.     struct buf    *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.         caddr_t        vu_vmdata;    /* private data for vm (VREG) */
  92.         struct specinfo    *vu_specinfo;    /* device (VCHR, VBLK) */
  93.         struct fifoinfo    *vu_fifoinfo;    /* fifo (VFIFO) */
  94.     } v_un;
  95.     enum vtagtype    v_tag;            /* type of underlying data */
  96.     char v_data[VN_MAXPRIVATE];        /* private data for fs */
  97. };
  98. #define    v_mountedhere    v_un.vu_mountedhere
  99. #define    v_socket    v_un.vu_socket
  100. #define    v_vmdata    v_un.vu_vmdata
  101. #define    v_specinfo    v_un.vu_specinfo
  102. #define    v_fifoinfo    v_un.vu_fifoinfo
  103.  
  104. /*
  105.  * vnode flags.
  106.  */
  107. #define    VROOT        0x0001    /* root of its file system */
  108. #define    VTEXT        0x0002    /* vnode is a pure text prototype */
  109. #define    VSYSTEM        0x0004    /* vnode being used by kernel */
  110. #define    VXLOCK        0x0100    /* vnode is locked to change underlying type */
  111. #define    VXWANT        0x0200    /* process is waiting for vnode */
  112. #define    VBWAIT        0x0400    /* waiting for output to complete */
  113. #define    VALIASED    0x0800    /* vnode has an alias */
  114.  
  115. /*
  116.  * Vnode attributes.  A field value of VNOVAL
  117.  * represents a field whose value is unavailable
  118.  * (getattr) or which is not to be changed (setattr).
  119.  */
  120. struct vattr {
  121.     enum vtype    va_type;    /* vnode type (for create) */
  122.     u_short        va_mode;    /* files access mode and type */
  123.     short        va_nlink;    /* number of references to file */
  124.     uid_t        va_uid;        /* owner user id */
  125.     gid_t        va_gid;        /* owner group id */
  126.     long        va_fsid;    /* file system id (dev for now) */
  127.     long        va_fileid;    /* file id */
  128.     u_quad        va_qsize;    /* file size in bytes */
  129.     long        va_blocksize;    /* blocksize preferred for i/o */
  130.     struct timeval    va_atime;    /* time of last access */
  131.     struct timeval    va_mtime;    /* time of last modification */
  132.     struct timeval    va_ctime;    /* time file changed */
  133.     u_long        va_gen;        /* generation number of file */
  134.     u_long        va_flags;    /* flags defined for file */
  135.     /* XXX should be a dev_t */
  136.     u_long        va_rdev;    /* device the special file represents */
  137.     u_quad        va_qbytes;    /* bytes of disk space held by file */
  138. };
  139. #if BYTE_ORDER == LITTLE_ENDIAN
  140. #define    va_size        va_qsize.val[0]
  141. #define    va_size_rsv    va_qsize.val[1]
  142. #define    va_bytes    va_qbytes.val[0]
  143. #define    va_bytes_rsv    va_qbytes.val[1]
  144. #else
  145. #define    va_size        va_qsize.val[1]
  146. #define    va_size_rsv    va_qsize.val[0]
  147. #define    va_bytes    va_qbytes.val[1]
  148. #define    va_bytes_rsv    va_qbytes.val[0]
  149. #endif
  150.  
  151. /*
  152.  * Operations on vnodes.
  153.  */
  154. #ifdef __STDC__
  155. struct flock;
  156. struct nameidata;
  157. #endif
  158.  
  159. struct vnodeops {
  160.     int    (*vop_lookup)    __P((struct vnode *vp, struct nameidata *ndp,
  161.                     struct proc *p));
  162.     int    (*vop_create)    __P((struct nameidata *ndp, struct vattr *vap,
  163.                     struct proc *p));
  164.     int    (*vop_mknod)    __P((struct nameidata *ndp, struct vattr *vap,
  165.                     struct ucred *cred, struct proc *p));
  166.     int    (*vop_open)    __P((struct vnode *vp, int mode,
  167.                     struct ucred *cred, struct proc *p));
  168.     int    (*vop_close)    __P((struct vnode *vp, int fflag,
  169.                     struct ucred *cred, struct proc *p));
  170.     int    (*vop_access)    __P((struct vnode *vp, int mode,
  171.                     struct ucred *cred, struct proc *p));
  172.     int    (*vop_getattr)    __P((struct vnode *vp, struct vattr *vap,
  173.                     struct ucred *cred, struct proc *p));
  174.     int    (*vop_setattr)    __P((struct vnode *vp, struct vattr *vap,
  175.                     struct ucred *cred, struct proc *p));
  176.     int    (*vop_read)    __P((struct vnode *vp, struct uio *uio,
  177.                     int ioflag, struct ucred *cred));
  178.     int    (*vop_write)    __P((struct vnode *vp, struct uio *uio,
  179.                     int ioflag, struct ucred *cred));
  180.     int    (*vop_ioctl)    __P((struct vnode *vp, int command,
  181.                     caddr_t data, int fflag,
  182.                     struct ucred *cred, struct proc *p));
  183.     int    (*vop_select)    __P((struct vnode *vp, int which, int fflags,
  184.                     struct ucred *cred, struct proc *p));
  185.     int    (*vop_mmap)    __P((struct vnode *vp, int fflags,
  186.                     struct ucred *cred, struct proc *p));
  187.     int    (*vop_fsync)    __P((struct vnode *vp, int fflags,
  188.                     struct ucred *cred, int waitfor,
  189.                     struct proc *p));
  190.     int    (*vop_seek)    __P((struct vnode *vp, off_t oldoff,
  191.                     off_t newoff, struct ucred *cred));
  192.     int    (*vop_remove)    __P((struct nameidata *ndp, struct proc *p));
  193.     int    (*vop_link)    __P((struct vnode *vp, struct nameidata *ndp,
  194.                     struct proc *p));
  195.     int    (*vop_rename)    __P((struct nameidata *fndp,
  196.                     struct nameidata *tdnp, struct proc *p));
  197.     int    (*vop_mkdir)    __P((struct nameidata *ndp, struct vattr *vap,
  198.                     struct proc *p));
  199.     int    (*vop_rmdir)    __P((struct nameidata *ndp, struct proc *p));
  200.     int    (*vop_symlink)    __P((struct nameidata *ndp, struct vattr *vap,
  201.                     char *target, struct proc *p));
  202.     int    (*vop_readdir)    __P((struct vnode *vp, struct uio *uio,
  203.                     struct ucred *cred, int *eofflagp,
  204.                     u_int *cookies, int ncookies));
  205.     int    (*vop_readlink)    __P((struct vnode *vp, struct uio *uio,
  206.                     struct ucred *cred));
  207.     int    (*vop_abortop)    __P((struct nameidata *ndp));
  208.     int    (*vop_inactive)    __P((struct vnode *vp, struct proc *p));
  209.     int    (*vop_reclaim)    __P((struct vnode *vp));
  210.     int    (*vop_lock)    __P((struct vnode *vp));
  211.     int    (*vop_unlock)    __P((struct vnode *vp));
  212.     int    (*vop_bmap)    __P((struct vnode *vp, daddr_t bn,
  213.                     struct vnode **vpp, daddr_t *bnp));
  214.     int    (*vop_strategy)    __P((struct buf *bp));
  215.     void    (*vop_print)    __P((struct vnode *vp));
  216.     int    (*vop_islocked)    __P((struct vnode *vp));
  217.     int    (*vop_advlock)    __P((struct vnode *vp, caddr_t id, int op,
  218.                     struct flock *fl, int flags));
  219. };
  220.  
  221. /* Macros to call the vnode ops */
  222. #define    VOP_LOOKUP(v,n,p)    (*((v)->v_op->vop_lookup))(v,n,p)
  223. #define    VOP_CREATE(n,a,p)    (*((n)->ni_dvp->v_op->vop_create))(n,a,p)
  224. #define    VOP_MKNOD(n,a,c,p)    (*((n)->ni_dvp->v_op->vop_mknod))(n,a,c,p)
  225. #define    VOP_OPEN(v,f,c,p)    (*((v)->v_op->vop_open))(v,f,c,p)
  226. #define    VOP_CLOSE(v,f,c,p)    (*((v)->v_op->vop_close))(v,f,c,p)
  227. #define    VOP_ACCESS(v,f,c,p)    (*((v)->v_op->vop_access))(v,f,c,p)
  228. #define    VOP_GETATTR(v,a,c,p)    (*((v)->v_op->vop_getattr))(v,a,c,p)
  229. #define    VOP_SETATTR(v,a,c,p)    (*((v)->v_op->vop_setattr))(v,a,c,p)
  230. #define    VOP_READ(v,u,i,c)    (*((v)->v_op->vop_read))(v,u,i,c)
  231. #define    VOP_WRITE(v,u,i,c)    (*((v)->v_op->vop_write))(v,u,i,c)
  232. #define    VOP_IOCTL(v,o,d,f,c,p)    (*((v)->v_op->vop_ioctl))(v,o,d,f,c,p)
  233. #define    VOP_SELECT(v,w,f,c,p)    (*((v)->v_op->vop_select))(v,w,f,c,p)
  234. #define    VOP_MMAP(v,c,p)        (*((v)->v_op->vop_mmap))(v,c,p)
  235. #define    VOP_FSYNC(v,f,c,w,p)    (*((v)->v_op->vop_fsync))(v,f,c,w,p)
  236. #define    VOP_SEEK(v,p,o,w)    (*((v)->v_op->vop_seek))(v,p,o,w)
  237. #define    VOP_REMOVE(n,p)        (*((n)->ni_dvp->v_op->vop_remove))(n,p)
  238. #define    VOP_LINK(v,n,p)        (*((n)->ni_dvp->v_op->vop_link))(v,n,p)
  239. #define    VOP_RENAME(s,t,p)    (*((s)->ni_dvp->v_op->vop_rename))(s,t,p)
  240. #define    VOP_MKDIR(n,a,p)    (*((n)->ni_dvp->v_op->vop_mkdir))(n,a,p)
  241. #define    VOP_RMDIR(n,p)        (*((n)->ni_dvp->v_op->vop_rmdir))(n,p)
  242. #define    VOP_SYMLINK(n,a,m,p)    (*((n)->ni_dvp->v_op->vop_symlink))(n,a,m,p)
  243. #define    VOP_READDIR(v,u,c,e,k,n)    (*((v)->v_op->vop_readdir))(v,u,c,e,k,n)
  244. #define    VOP_READLINK(v,u,c)    (*((v)->v_op->vop_readlink))(v,u,c)
  245. #define    VOP_ABORTOP(n)        (*((n)->ni_dvp->v_op->vop_abortop))(n)
  246. #define    VOP_INACTIVE(v,p)    (*((v)->v_op->vop_inactive))(v,p)
  247. #define    VOP_RECLAIM(v)        (*((v)->v_op->vop_reclaim))(v)
  248. #define    VOP_LOCK(v)        (*((v)->v_op->vop_lock))(v)
  249. #define    VOP_UNLOCK(v)        (*((v)->v_op->vop_unlock))(v)
  250. #define    VOP_BMAP(v,s,p,n)    (*((v)->v_op->vop_bmap))(v,s,p,n)
  251. #define    VOP_STRATEGY(b)        (*((b)->b_vp->v_op->vop_strategy))(b)
  252. #define    VOP_PRINT(v)        (*((v)->v_op->vop_print))(v)
  253. #define    VOP_ISLOCKED(v)        (((v)->v_flag & VXLOCK) || \
  254.                 (*((v)->v_op->vop_islocked))(v))
  255. #define    VOP_ADVLOCK(v,p,o,l,f)    (*((v)->v_op->vop_advlock))(v,p,o,l,f)
  256.  
  257. /*
  258.  * flags for ioflag
  259.  */
  260. #define    IO_UNIT        0x01        /* do I/O as atomic unit */
  261. #define    IO_APPEND    0x02        /* append write to end */
  262. #define    IO_SYNC        0x04        /* do I/O synchronously */
  263. #define    IO_NODELOCKED    0x08        /* underlying node already locked */
  264. #define    IO_NDELAY    0x10        /* FNDELAY flag set in file table */
  265.  
  266. /*
  267.  *  Modes. Some values same as Ixxx entries from inode.h for now
  268.  */
  269. #define    VSUID    04000        /* set user id on execution */
  270. #define    VSGID    02000        /* set group id on execution */
  271. #define    VSVTX    01000        /* save swapped text even after use */
  272. #define    VREAD    0400        /* read, write, execute permissions */
  273. #define    VWRITE    0200
  274. #define    VEXEC    0100
  275.  
  276. /*
  277.  * Token indicating no attribute value yet assigned
  278.  */
  279. #define    VNOVAL    ((unsigned)0xffffffff)
  280.  
  281. #ifdef KERNEL
  282. /*
  283.  * public vnode manipulation functions
  284.  */
  285. int     vn_open __P((struct nameidata *ndp, struct proc *p, int fmode,
  286.         int cmode));
  287. int     vn_close __P((struct vnode *vp, int flags, struct ucred *cred,
  288.         struct proc *p));
  289. int     vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
  290.         int len, off_t offset, enum uio_seg segflg, int ioflg,
  291.         struct ucred *cred, int *aresid, struct proc *p));
  292. int    vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
  293. int    vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
  294. int    vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p));
  295. int    vn_select __P((struct file *fp, int which, struct proc *p));
  296. int     vn_closefile __P((struct file *fp, struct proc *p));
  297. int     getnewvnode __P((enum vtagtype tag, struct mount *mp,
  298.         struct vnodeops *vops, struct vnode **vpp));
  299. int     bdevvp __P((int dev, struct vnode **vpp));
  300. int     cdevvp __P((int dev, struct vnode **vpp));
  301.     /* check for special device aliases */
  302.     /* XXX nvp_rdev should be type dev_t, not int */
  303. struct     vnode *checkalias __P((struct vnode *vp, int nvp_rdev,
  304.         struct mount *mp));
  305. void     vattr_null __P((struct vattr *vap));
  306. int     vcount __P((struct vnode *vp));    /* total references to a device */
  307. int     vget __P((struct vnode *vp));    /* get first reference to a vnode */
  308. void     vref __P((struct vnode *vp));    /* increase reference to a vnode */
  309. void     vput __P((struct vnode *vp));    /* unlock and release vnode */
  310. void     vrele __P((struct vnode *vp));    /* release vnode */
  311. void     vgone __P((struct vnode *vp));    /* completely recycle vnode */
  312. void     vgoneall __P((struct vnode *vp));/* recycle vnode and all its aliases */
  313.  
  314. /*
  315.  * Flags to various vnode functions.
  316.  */
  317. #define    SKIPSYSTEM    0x0001        /* vflush: skip vnodes marked VSYSTEM */
  318. #define    FORCECLOSE    0x0002        /* vflush: force file closeure */
  319. #define    DOCLOSE        0x0004        /* vclean: close active files */
  320.  
  321. #ifndef DIAGNOSTIC
  322. #define    VREF(vp)    (vp)->v_usecount++    /* increase reference */
  323. #define    VHOLD(vp)    (vp)->v_holdcnt++    /* increase buf or page ref */
  324. #define    HOLDRELE(vp)    (vp)->v_holdcnt--    /* decrease buf or page ref */
  325. #define    VATTR_NULL(vap)    (*(vap) = va_null)    /* initialize a vattr */
  326. #else /* DIAGNOSTIC */
  327. #define    VREF(vp)    vref(vp)
  328. #define    VHOLD(vp)    vhold(vp)
  329. #define    HOLDRELE(vp)    holdrele(vp)
  330. #define    VATTR_NULL(vap)    vattr_null(vap)
  331. #endif
  332.  
  333. #define    NULLVP    ((struct vnode *)NULL)
  334.  
  335. /*
  336.  * Global vnode data.
  337.  */
  338. extern    struct vnode *rootdir;        /* root (i.e. "/") vnode */
  339. extern    long desiredvnodes;        /* number of vnodes desired */
  340. extern    struct vattr va_null;        /* predefined null vattr structure */
  341. #endif
  342.  
  343. #endif /* !_SYS_VNODE_H_ */
  344.