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