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

  1. /*
  2.  * Copyright (c) 1982, 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: @(#)inode.h    7.17 (Berkeley) 5/8/91
  34.  *    $Id: inode.h,v 1.9 1993/09/07 15:42:02 ws Exp $
  35.  */
  36.  
  37. #ifndef _UFS_INODE_H_
  38. #define _UFS_INODE_H_
  39.  
  40. #ifdef KERNEL
  41. #include "../ufs/dinode.h"
  42. #else
  43. #include <ufs/dinode.h>
  44. #endif
  45.  
  46. /*
  47.  * The inode is used to describe each active (or recently active)
  48.  * file in the UFS filesystem. It is composed of two types of
  49.  * information. The first part is the information that is needed
  50.  * only while the file is active (such as the identity of the file
  51.  * and linkage to speed its lookup). The second part is the 
  52.  * permannent meta-data associated with the file which is read
  53.  * in from the permanent dinode from long term storage when the
  54.  * file becomes active, and is put back when the file is no longer
  55.  * being used.
  56.  */
  57. struct inode {
  58.     struct    inode *i_chain[2]; /* hash chain, MUST be first */
  59.     struct    vnode *i_vnode;    /* vnode associated with this inode */
  60.     struct    vnode *i_devvp;    /* vnode for block I/O */
  61.     u_long    i_flag;        /* see below */
  62.     dev_t    i_dev;        /* device where inode resides */
  63.     ino_t    i_number;    /* the identity of the inode */
  64.     struct    fs *i_fs;    /* filesystem associated with this inode */
  65.     struct    dquot *i_dquot[MAXQUOTAS]; /* pointer to dquot structures */
  66.     struct    lockf *i_lockf;    /* head of byte-level lock list */
  67.     long    i_diroff;    /* offset in dir, where we found last entry */
  68.     off_t    i_endoff;    /* end of useful stuff in directory */
  69.     long    i_spare0;
  70.     long    i_spare1;
  71.     struct    dinode i_din;    /* the on-disk dinode */
  72. };
  73.  
  74. #define    i_mode        i_din.di_mode
  75. #define    i_nlink        i_din.di_nlink
  76. #define    i_uid        i_din.di_uid
  77. #define    i_gid        i_din.di_gid
  78. #if BYTE_ORDER == LITTLE_ENDIAN || defined(tahoe) /* ugh! -- must be fixed */
  79. #define    i_size        i_din.di_qsize.val[0]
  80. #else /* BYTE_ORDER == BIG_ENDIAN */
  81. #define    i_size        i_din.di_qsize.val[1]
  82. #endif
  83. #define    i_db        i_din.di_db
  84. #define    i_ib        i_din.di_ib
  85. #define    i_atime        i_din.di_atime
  86. #define    i_mtime        i_din.di_mtime
  87. #define    i_ctime        i_din.di_ctime
  88. #define i_blocks    i_din.di_blocks
  89. #define    i_rdev        i_din.di_rdev
  90. #define i_flags        i_din.di_flags
  91. #define i_gen        i_din.di_gen
  92. #define    i_forw        i_chain[0]
  93. #define    i_back        i_chain[1]
  94. #define    FASTLINK(ip)    (DFASTLINK((ip)->i_din))
  95. #define    i_fsize        i_din.di_fsize
  96. #define    i_symlink    i_din.di_symlink
  97. #define    i_di_spare    i_din.di_spare
  98.  
  99. /* flags */
  100. #define    ILOCKED        0x0001        /* inode is locked */
  101. #define    IWANT        0x0002        /* some process waiting on lock */
  102. #define    IRENAME        0x0004        /* inode is being renamed */
  103. #define    IUPD        0x0010        /* file has been modified */
  104. #define    IACC        0x0020        /* inode access time to be updated */
  105. #define    ICHG        0x0040        /* inode has been changed */
  106. #define    IMOD        0x0080        /* inode has been modified */
  107. #define    ISHLOCK        0x0100        /* file has shared lock */
  108. #define    IEXLOCK        0x0200        /* file has exclusive lock */
  109. #define    ILWAIT        0x0400        /* someone waiting on file lock */
  110.  
  111. #ifdef KERNEL
  112. /*
  113.  * Convert between inode pointers and vnode pointers
  114.  */
  115. #define VTOI(vp)    ((struct inode *)(vp)->v_data)
  116. #define ITOV(ip)    ((ip)->i_vnode)
  117.  
  118. /*
  119.  * Convert between vnode types and inode formats
  120.  */
  121. extern enum vtype    iftovt_tab[];
  122. extern int        vttoif_tab[];
  123. #define IFTOVT(mode)    (iftovt_tab[((mode) & IFMT) >> 12])
  124. #define VTTOIF(indx)    (vttoif_tab[(int)(indx)])
  125.  
  126. #define MAKEIMODE(indx, mode)    (int)(VTTOIF(indx) | (mode))
  127.  
  128. u_long    nextgennumber;        /* next generation number to assign */
  129.  
  130. extern ino_t    dirpref();
  131.  
  132. /*
  133.  * Lock and unlock inodes.
  134.  */
  135. #ifdef notdef
  136. #define    ILOCK(ip) { \
  137.     while ((ip)->i_flag & ILOCKED) { \
  138.         (ip)->i_flag |= IWANT; \
  139.         (void) tsleep((caddr_t)(ip), PINOD, "ILOCK", 0); \
  140.     } \
  141.     (ip)->i_flag |= ILOCKED; \
  142. }
  143.  
  144. #define    IUNLOCK(ip) { \
  145.     (ip)->i_flag &= ~ILOCKED; \
  146.     if ((ip)->i_flag&IWANT) { \
  147.         (ip)->i_flag &= ~IWANT; \
  148.         wakeup((caddr_t)(ip)); \
  149.     } \
  150. }
  151. #else
  152. #define ILOCK(ip)    ilock(ip)
  153. #define IUNLOCK(ip)    iunlock(ip)
  154. #endif
  155.  
  156. #define    IUPDAT(ip, t1, t2, waitfor) { \
  157.     if (ip->i_flag&(IUPD|IACC|ICHG|IMOD)) \
  158.         (void) iupdat(ip, t1, t2, waitfor); \
  159. }
  160.  
  161. #define    ITIMES(ip, t1, t2) { \
  162.     if ((ip)->i_flag&(IUPD|IACC|ICHG)) { \
  163.         (ip)->i_flag |= IMOD; \
  164.         if ((ip)->i_flag&IACC) \
  165.             (ip)->i_atime = (t1)->tv_sec; \
  166.         if ((ip)->i_flag&IUPD) \
  167.             (ip)->i_mtime = (t2)->tv_sec; \
  168.         if ((ip)->i_flag&ICHG) \
  169.             (ip)->i_ctime = time.tv_sec; \
  170.         (ip)->i_flag &= ~(IACC|IUPD|ICHG); \
  171.     } \
  172. }
  173.  
  174. /*
  175.  * This overlays the fid sturcture (see mount.h)
  176.  */
  177. struct ufid {
  178.     u_short    ufid_len;    /* length of structure */
  179.     u_short    ufid_pad;    /* force long alignment */
  180.     ino_t    ufid_ino;    /* file number (ino) */
  181.     long    ufid_gen;    /* generation number */
  182. };
  183.  
  184. /*
  185.  * Prototypes for UFS vnode operations
  186.  */
  187. int ufs_lookup __P((struct vnode *vp, struct nameidata *ndp, struct proc *p));
  188. int ufs_create __P((struct nameidata *ndp, struct vattr *vap, struct proc *p));
  189. int ufs_mknod __P((struct nameidata *ndp, struct vattr *vap, struct ucred *cred,
  190.     struct proc *p));
  191. int ufs_open __P((struct vnode *vp, int mode, struct ucred *cred,
  192.     struct proc *p));
  193. int ufs_close __P((struct vnode *vp, int fflag, struct ucred *cred,
  194.     struct proc *p));
  195. int ufs_access __P((struct vnode *vp, int mode, struct ucred *cred,
  196.     struct proc *p));
  197. int ufs_getattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred,
  198.     struct proc *p));
  199. int ufs_setattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred,
  200.     struct proc *p));
  201. int ufs_read __P((struct vnode *vp, struct uio *uio, int ioflag,
  202.     struct ucred *cred));
  203. int ufs_write __P((struct vnode *vp, struct uio *uio, int ioflag,
  204.     struct ucred *cred));
  205. int ufs_ioctl __P((struct vnode *vp, int command, caddr_t data, int fflag,
  206.     struct ucred *cred, struct proc *p));
  207. int ufs_select __P((struct vnode *vp, int which, int fflags, struct ucred *cred,
  208.     struct proc *p));
  209. int ufs_mmap __P((struct vnode *vp, int fflags, struct ucred *cred,
  210.     struct proc *p));
  211. int ufs_fsync __P((struct vnode *vp, int fflags, struct ucred *cred,
  212.     int waitfor, struct proc *p));
  213. int ufs_seek __P((struct vnode *vp, off_t oldoff, off_t newoff,
  214.     struct ucred *cred));
  215. int ufs_remove __P((struct nameidata *ndp, struct proc *p));
  216. int ufs_link __P((struct vnode *vp, struct nameidata *ndp, struct proc *p));
  217. int ufs_rename __P((struct nameidata *fndp, struct nameidata *tdnp,
  218.     struct proc *p));
  219. int ufs_mkdir __P((struct nameidata *ndp, struct vattr *vap, struct proc *p));
  220. int ufs_rmdir __P((struct nameidata *ndp, struct proc *p));
  221. int ufs_symlink __P((struct nameidata *ndp, struct vattr *vap, char *target,
  222.     struct proc *p));
  223. int ufs_readdir __P((struct vnode *vp, struct uio *uio, struct ucred *cred,
  224.     int *eofflagp, u_int *cookies, int ncookies));
  225. int ufs_readlink __P((struct vnode *vp, struct uio *uio, struct ucred *cred));
  226. int ufs_abortop __P((struct nameidata *ndp));
  227. int ufs_inactive __P((struct vnode *vp, struct proc *p));
  228. int ufs_reclaim __P((struct vnode *vp));
  229. int ufs_lock __P((struct vnode *vp));
  230. int ufs_unlock __P((struct vnode *vp));
  231. int ufs_bmap __P((struct vnode *vp, daddr_t bn, struct vnode **vpp,
  232.     daddr_t *bnp));
  233. int ufs_strategy __P((struct buf *bp));
  234. void ufs_print __P((struct vnode *vp));
  235. int ufs_islocked __P((struct vnode *vp));
  236. int ufs_advlock __P((struct vnode *vp, caddr_t id, int op, struct flock *fl,
  237.     int flags));
  238. #endif /* KERNEL */
  239.  
  240. #endif /* !_UFS_INODE_H_ */
  241.