Commit | Line | Data |
---|---|---|
15637ed4 RG |
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 | * | |
1eb58e01 | 33 | * from: @(#)inode.h 7.17 (Berkeley) 5/8/91 |
4c45483e | 34 | * $Id: inode.h,v 1.4 1993/11/07 17:53:38 wollman Exp $ |
15637ed4 RG |
35 | */ |
36 | ||
bbc3f849 GW |
37 | #ifndef _UFS_INODE_H_ |
38 | #define _UFS_INODE_H_ 1 | |
39 | ||
15637ed4 RG |
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 | ||
ef7ff598 JH |
74 | #define FASTLINK(ip) (DFASTLINK((ip)->i_din)) |
75 | #define i_symlink i_din.di_symlink | |
15637ed4 RG |
76 | #define i_mode i_din.di_mode |
77 | #define i_nlink i_din.di_nlink | |
78 | #define i_uid i_din.di_uid | |
79 | #define i_gid i_din.di_gid | |
80 | #if BYTE_ORDER == LITTLE_ENDIAN || defined(tahoe) /* ugh! -- must be fixed */ | |
81 | #define i_size i_din.di_qsize.val[0] | |
82 | #else /* BYTE_ORDER == BIG_ENDIAN */ | |
83 | #define i_size i_din.di_qsize.val[1] | |
84 | #endif | |
85 | #define i_db i_din.di_db | |
86 | #define i_ib i_din.di_ib | |
87 | #define i_atime i_din.di_atime | |
88 | #define i_mtime i_din.di_mtime | |
89 | #define i_ctime i_din.di_ctime | |
90 | #define i_blocks i_din.di_blocks | |
91 | #define i_rdev i_din.di_db[0] | |
92 | #define i_flags i_din.di_flags | |
93 | #define i_gen i_din.di_gen | |
94 | #define i_forw i_chain[0] | |
95 | #define i_back i_chain[1] | |
ef7ff598 | 96 | #define i_di_spare i_din.di_spare |
15637ed4 RG |
97 | |
98 | /* flags */ | |
99 | #define ILOCKED 0x0001 /* inode is locked */ | |
100 | #define IWANT 0x0002 /* some process waiting on lock */ | |
101 | #define IRENAME 0x0004 /* inode is being renamed */ | |
102 | #define IUPD 0x0010 /* file has been modified */ | |
103 | #define IACC 0x0020 /* inode access time to be updated */ | |
104 | #define ICHG 0x0040 /* inode has been changed */ | |
105 | #define IMOD 0x0080 /* inode has been modified */ | |
106 | #define ISHLOCK 0x0100 /* file has shared lock */ | |
107 | #define IEXLOCK 0x0200 /* file has exclusive lock */ | |
108 | #define ILWAIT 0x0400 /* someone waiting on file lock */ | |
109 | ||
110 | #ifdef KERNEL | |
111 | /* | |
112 | * Convert between inode pointers and vnode pointers | |
113 | */ | |
114 | #define VTOI(vp) ((struct inode *)(vp)->v_data) | |
115 | #define ITOV(ip) ((ip)->i_vnode) | |
116 | ||
117 | /* | |
118 | * Convert between vnode types and inode formats | |
119 | */ | |
120 | extern enum vtype iftovt_tab[]; | |
121 | extern int vttoif_tab[]; | |
122 | #define IFTOVT(mode) (iftovt_tab[((mode) & IFMT) >> 12]) | |
123 | #define VTTOIF(indx) (vttoif_tab[(int)(indx)]) | |
124 | ||
125 | #define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode)) | |
126 | ||
bbc3f849 | 127 | extern u_long nextgennumber; /* next generation number to assign */ |
15637ed4 RG |
128 | |
129 | extern ino_t dirpref(); | |
130 | ||
131 | /* | |
132 | * Lock and unlock inodes. | |
133 | */ | |
134 | #ifdef notdef | |
135 | #define ILOCK(ip) { \ | |
136 | while ((ip)->i_flag & ILOCKED) { \ | |
137 | (ip)->i_flag |= IWANT; \ | |
138 | (void) sleep((caddr_t)(ip), PINOD); \ | |
139 | } \ | |
140 | (ip)->i_flag |= ILOCKED; \ | |
141 | } | |
142 | ||
143 | #define IUNLOCK(ip) { \ | |
144 | (ip)->i_flag &= ~ILOCKED; \ | |
145 | if ((ip)->i_flag&IWANT) { \ | |
146 | (ip)->i_flag &= ~IWANT; \ | |
147 | wakeup((caddr_t)(ip)); \ | |
148 | } \ | |
149 | } | |
150 | #else | |
151 | #define ILOCK(ip) ilock(ip) | |
152 | #define IUNLOCK(ip) iunlock(ip) | |
153 | #endif | |
154 | ||
155 | #define IUPDAT(ip, t1, t2, waitfor) { \ | |
156 | if (ip->i_flag&(IUPD|IACC|ICHG|IMOD)) \ | |
157 | (void) iupdat(ip, t1, t2, waitfor); \ | |
158 | } | |
159 | ||
160 | #define ITIMES(ip, t1, t2) { \ | |
161 | if ((ip)->i_flag&(IUPD|IACC|ICHG)) { \ | |
162 | (ip)->i_flag |= IMOD; \ | |
163 | if ((ip)->i_flag&IACC) \ | |
164 | (ip)->i_atime = (t1)->tv_sec; \ | |
165 | if ((ip)->i_flag&IUPD) \ | |
166 | (ip)->i_mtime = (t2)->tv_sec; \ | |
167 | if ((ip)->i_flag&ICHG) \ | |
168 | (ip)->i_ctime = time.tv_sec; \ | |
169 | (ip)->i_flag &= ~(IACC|IUPD|ICHG); \ | |
170 | } \ | |
171 | } | |
172 | ||
173 | /* | |
174 | * This overlays the fid sturcture (see mount.h) | |
175 | */ | |
176 | struct ufid { | |
177 | u_short ufid_len; /* length of structure */ | |
178 | u_short ufid_pad; /* force long alignment */ | |
179 | ino_t ufid_ino; /* file number (ino) */ | |
180 | long ufid_gen; /* generation number */ | |
181 | }; | |
182 | ||
183 | /* | |
184 | * Prototypes for UFS vnode operations | |
185 | */ | |
186 | int ufs_lookup __P((struct vnode *vp, struct nameidata *ndp, struct proc *p)); | |
187 | int ufs_create __P((struct nameidata *ndp, struct vattr *vap, struct proc *p)); | |
188 | int ufs_mknod __P((struct nameidata *ndp, struct vattr *vap, struct ucred *cred, | |
189 | struct proc *p)); | |
190 | int ufs_open __P((struct vnode *vp, int mode, struct ucred *cred, | |
191 | struct proc *p)); | |
192 | int ufs_close __P((struct vnode *vp, int fflag, struct ucred *cred, | |
193 | struct proc *p)); | |
194 | int ufs_access __P((struct vnode *vp, int mode, struct ucred *cred, | |
195 | struct proc *p)); | |
196 | int ufs_getattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred, | |
197 | struct proc *p)); | |
198 | int ufs_setattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred, | |
199 | struct proc *p)); | |
200 | int ufs_read __P((struct vnode *vp, struct uio *uio, int ioflag, | |
201 | struct ucred *cred)); | |
202 | int ufs_write __P((struct vnode *vp, struct uio *uio, int ioflag, | |
203 | struct ucred *cred)); | |
204 | int ufs_ioctl __P((struct vnode *vp, int command, caddr_t data, int fflag, | |
205 | struct ucred *cred, struct proc *p)); | |
206 | int ufs_select __P((struct vnode *vp, int which, int fflags, struct ucred *cred, | |
207 | struct proc *p)); | |
208 | int ufs_mmap __P((struct vnode *vp, int fflags, struct ucred *cred, | |
209 | struct proc *p)); | |
210 | int ufs_fsync __P((struct vnode *vp, int fflags, struct ucred *cred, | |
211 | int waitfor, struct proc *p)); | |
212 | int ufs_seek __P((struct vnode *vp, off_t oldoff, off_t newoff, | |
213 | struct ucred *cred)); | |
214 | int ufs_remove __P((struct nameidata *ndp, struct proc *p)); | |
215 | int ufs_link __P((struct vnode *vp, struct nameidata *ndp, struct proc *p)); | |
216 | int ufs_rename __P((struct nameidata *fndp, struct nameidata *tdnp, | |
217 | struct proc *p)); | |
218 | int ufs_mkdir __P((struct nameidata *ndp, struct vattr *vap, struct proc *p)); | |
219 | int ufs_rmdir __P((struct nameidata *ndp, struct proc *p)); | |
220 | int ufs_symlink __P((struct nameidata *ndp, struct vattr *vap, char *target, | |
221 | struct proc *p)); | |
222 | int ufs_readdir __P((struct vnode *vp, struct uio *uio, struct ucred *cred, | |
223 | int *eofflagp)); | |
224 | int ufs_readlink __P((struct vnode *vp, struct uio *uio, struct ucred *cred)); | |
225 | int ufs_abortop __P((struct nameidata *ndp)); | |
226 | int ufs_inactive __P((struct vnode *vp, struct proc *p)); | |
227 | int ufs_reclaim __P((struct vnode *vp)); | |
228 | int ufs_lock __P((struct vnode *vp)); | |
229 | int ufs_unlock __P((struct vnode *vp)); | |
230 | int ufs_bmap __P((struct vnode *vp, daddr_t bn, struct vnode **vpp, | |
231 | daddr_t *bnp)); | |
232 | int ufs_strategy __P((struct buf *bp)); | |
4c45483e | 233 | void ufs_print __P((struct vnode *vp)); |
15637ed4 RG |
234 | int ufs_islocked __P((struct vnode *vp)); |
235 | int ufs_advlock __P((struct vnode *vp, caddr_t id, int op, struct flock *fl, | |
236 | int flags)); | |
4c45483e GW |
237 | |
238 | extern void blkfree(struct inode *, daddr_t, off_t); | |
239 | extern void ifree(struct inode *, ino_t, int); | |
240 | extern void iput(struct inode *); | |
241 | extern void ilock(struct inode *); | |
242 | extern void iunlock(struct inode *); | |
243 | extern void dirbad(struct inode *, off_t, char *); | |
244 | ||
15637ed4 | 245 | #endif /* KERNEL */ |
bbc3f849 | 246 | #endif /* _UFS_INODE_H_ */ |