1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/buf.h>
41 #include <sys/lock.h>
42 #include <ufs/ufs/dinode.h>
43 #include <ufs/ufs/dir.h>
44 #include <ufs/ext2fs/ext2fs_dinode.h>
45
46
47
48
49 struct ext2fs_inode_ext {
50 int32_t ext2fs_last_lblk;
51 int32_t ext2fs_last_blk;
52 u_int32_t ext2fs_effective_uid;
53 u_int32_t ext2fs_effective_gid;
54 };
55
56
57
58
59
60
61
62
63
64
65 struct inode {
66 LIST_ENTRY(inode) i_hash;
67 struct vnode *i_vnode;
68 struct ufsmount *i_ump;
69 u_int32_t i_flag;
70 dev_t i_dev;
71 ino_t i_number;
72 int i_effnlink;
73
74 union {
75 struct fs *fs;
76 struct m_ext2fs *e2fs;
77 } inode_u;
78
79 #define i_fs inode_u.fs
80 #define i_e2fs inode_u.e2fs
81
82 struct cluster_info i_ci;
83 struct dquot *i_dquot[MAXQUOTAS];
84 u_quad_t i_modrev;
85 struct lockf *i_lockf;
86 struct lock i_lock;
87
88
89
90
91 int32_t i_count;
92 doff_t i_endoff;
93 doff_t i_diroff;
94 doff_t i_offset;
95 ino_t i_ino;
96 u_int32_t i_reclen;
97
98
99
100 union {
101
102 struct ext2fs_inode_ext e2fs;
103 struct dirhash *dirhash;
104 } inode_ext;
105
106 #define i_e2fs_last_lblk inode_ext.e2fs.ext2fs_last_lblk
107 #define i_e2fs_last_blk inode_ext.e2fs.ext2fs_last_blk
108 #define i_e2fs_uid inode_ext.e2fs.ext2fs_effective_uid
109 #define i_e2fs_gid inode_ext.e2fs.ext2fs_effective_gid
110 #define i_dirhash inode_ext.dirhash
111
112
113
114
115 union {
116 struct ufs1_dinode *ffs1_din;
117 struct ufs2_dinode *ffs2_din;
118 struct ext2fs_dinode *e2fs_din;
119 } dinode_u;
120
121 #define i_din1 dinode_u.ffs1_din
122 #define i_din2 dinode_u.ffs2_din
123 #define i_e2din dinode_u.e2fs_din
124
125 struct inode_vtbl *i_vtbl;
126 };
127
128 struct inode_vtbl {
129 int (* iv_truncate)(struct inode *, off_t, int,
130 struct ucred *);
131 int (* iv_update)(struct inode *, struct timespec *, struct timespec *,
132 int waitfor);
133 int (* iv_inode_alloc)(struct inode *, mode_t mode,
134 struct ucred *, struct vnode **);
135 int (* iv_inode_free)(struct inode *, ino_t ino, mode_t mode);
136 int (* iv_buf_alloc)(struct inode *, off_t, int, struct ucred *,
137 int, struct buf **);
138 int (* iv_bufatoff)(struct inode *, off_t offset, char **res,
139 struct buf **bpp);
140 };
141
142 #define UFS_TRUNCATE(ip, off, flags, cred) \
143 ((ip)->i_vtbl->iv_truncate)((ip), (off), (flags), (cred))
144
145 #define UFS_UPDATE(ip, sync) \
146 ((ip)->i_vtbl->iv_update)((ip), NULL, NULL, (sync))
147
148 #define UFS_UPDATE2(ip, atime, mtime, sync) \
149 ((ip)->i_vtbl->iv_update)((ip), (atime), (mtime), (sync))
150
151 #define UFS_INODE_ALLOC(pip, mode, cred, vpp) \
152 ((pip)->i_vtbl->iv_inode_alloc)((pip), (mode), (cred), (vpp))
153
154 #define UFS_INODE_FREE(pip, ino, mode) \
155 ((pip)->i_vtbl->iv_inode_free)((pip), (ino), (mode))
156
157 #define UFS_BUF_ALLOC(ip, startoffset, size, cred, flags, bpp) \
158 ((ip)->i_vtbl->iv_buf_alloc)((ip), (startoffset), (size), (cred), \
159 (flags), (bpp))
160
161 #define UFS_BUFATOFF(ip, offset, res, bpp) \
162 ((ip)->i_vtbl->iv_bufatoff)((ip), (offset), (res), (bpp))
163
164 #define i_ffs1_atime i_din1->di_atime
165 #define i_ffs1_atimensec i_din1->di_atimensec
166 #define i_ffs1_blocks i_din1->di_blocks
167 #define i_ffs1_ctime i_din1->di_ctime
168 #define i_ffs1_ctimensec i_din1->di_ctimensec
169 #define i_ffs1_db i_din1->di_db
170 #define i_ffs1_flags i_din1->di_flags
171 #define i_ffs1_gen i_din1->di_gen
172 #define i_ffs1_gid i_din1->di_gid
173 #define i_ffs1_ib i_din1->di_ib
174 #define i_ffs1_mode i_din1->di_mode
175 #define i_ffs1_mtime i_din1->di_mtime
176 #define i_ffs1_mtimensec i_din1->di_mtimensec
177 #define i_ffs1_nlink i_din1->di_nlink
178 #define i_ffs1_rdev i_din1->di_rdev
179 #define i_ffs1_shortlink i_din1->di_shortlink
180 #define i_ffs1_size i_din1->di_size
181 #define i_ffs1_uid i_din1->di_uid
182
183 #define i_ffs2_atime i_din2->di_atime
184 #define i_ffs2_atimensec i_din2->di_atimensec
185 #define i_ffs2_blocks i_din2->di_blocks
186 #define i_ffs2_blksize i_din2->di_blksize
187 #define i_ffs2_ctime i_din2->di_ctime
188 #define i_ffs2_ctimensec i_din2->di_ctimensec
189 #define i_ffs2_db i_din2->di_db
190 #define i_ffs2_flags i_din2->di_flags
191 #define i_ffs2_gen i_din2->di_gen
192 #define i_ffs2_gid i_din2->di_gid
193 #define i_ffs2_ib i_din2->di_ib
194 #define i_ffs2_mode i_din2->di_mode
195 #define i_ffs2_mtime i_din2->di_mtime
196 #define i_ffs2_mtimensec i_din2->di_mtimensec
197 #define i_ffs2_nlink i_din2->di_nlink
198 #define i_ffs2_rdev i_din2->di_rdev
199 #define i_ffs2_size i_din2->di_size
200 #define i_ffs2_uid i_din2->di_uid
201
202 #ifndef _KERNEL
203
204
205
206
207 #define i_atime i_din1->di_atime
208 #define i_atimensec i_din1->di_atimensec
209 #define i_blocks i_din1->di_blocks
210 #define i_ctime i_din1->di_ctime
211 #define i_ctimensec i_din1->di_ctimensec
212 #define i_db i_din1->di_db
213 #define i_flags i_din1->di_flags
214 #define i_gen i_din1->di_gen
215 #define i_gid i_din1->di_gid
216 #define i_ib i_din1->di_ib
217 #define i_mode i_din1->di_mode
218 #define i_mtime i_din1->di_mtime
219 #define i_mtimensec i_din1->di_mtimensec
220 #define i_nlink i_din1->di_nlink
221 #define i_rdev i_din1->di_rdev
222 #define i_shortlink i_din1->di_shortlink
223 #define i_size i_din1->di_size
224 #define i_uid i_din1->di_uid
225 #endif
226
227 #define i_e2fs_mode i_e2din->e2di_mode
228 #define i_e2fs_size i_e2din->e2di_size
229 #define i_e2fs_atime i_e2din->e2di_atime
230 #define i_e2fs_ctime i_e2din->e2di_ctime
231 #define i_e2fs_mtime i_e2din->e2di_mtime
232 #define i_e2fs_dtime i_e2din->e2di_dtime
233 #define i_e2fs_nlink i_e2din->e2di_nlink
234 #define i_e2fs_nblock i_e2din->e2di_nblock
235 #define i_e2fs_flags i_e2din->e2di_flags
236 #define i_e2fs_blocks i_e2din->e2di_blocks
237 #define i_e2fs_gen i_e2din->e2di_gen
238 #define i_e2fs_facl i_e2din->e2di_facl
239 #define i_e2fs_dacl i_e2din->e2di_dacl
240 #define i_e2fs_faddr i_e2din->e2di_faddr
241 #define i_e2fs_nfrag i_e2din->e2di_nfrag
242 #define i_e2fs_fsize i_e2din->e2di_fsize
243 #define i_e2fs_uid_low i_e2din->e2di_uid_low
244 #define i_e2fs_gid_low i_e2din->e2di_gid_low
245 #define i_e2fs_uid_high i_e2din->e2di_uid_high
246 #define i_e2fs_gid_high i_e2din->e2di_gid_high
247
248
249 #define IN_ACCESS 0x0001
250 #define IN_CHANGE 0x0002
251 #define IN_UPDATE 0x0004
252 #define IN_MODIFIED 0x0008
253 #define IN_RENAME 0x0010
254 #define IN_SHLOCK 0x0020
255 #define IN_EXLOCK 0x0040
256
257 #define i_devvp i_ump->um_devvp
258
259 #ifdef _KERNEL
260
261
262
263
264 #define DIP(ip, field) \
265 (((ip)->i_ump->um_fstype == UM_UFS1) ? \
266 (ip)->i_ffs1_##field : (ip)->i_ffs2_##field)
267
268 #define DIP_ASSIGN(ip, field, value) \
269 do { \
270 if ((ip)->i_ump->um_fstype == UM_UFS1) \
271 (ip)->i_ffs1_##field = (value); \
272 else \
273 (ip)->i_ffs2_##field = (value); \
274 } while (0)
275
276 #define DIP_ADD(ip, field, value) \
277 do { \
278 if ((ip)->i_ump->um_fstype == UM_UFS1) \
279 (ip)->i_ffs1_##field += (value); \
280 else \
281 (ip)->i_ffs2_##field += (value); \
282 } while (0)
283
284 #define SHORTLINK(ip) \
285 (((ip)->i_ump->um_fstype == UM_UFS1) ? \
286 (caddr_t)(ip)->i_ffs1_db : (caddr_t)(ip)->i_ffs2_db)
287
288
289
290
291
292 struct indir {
293 daddr_t in_lbn;
294 int in_off;
295 int in_exists;
296 };
297
298
299 #define VTOI(vp) ((struct inode *)(vp)->v_data)
300 #define ITOV(ip) ((ip)->i_vnode)
301
302 #define FFS_ITIMES(ip, t1, t2) { \
303 if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
304 (ip)->i_flag |= IN_MODIFIED; \
305 if ((ip)->i_flag & IN_ACCESS) \
306 DIP_ASSIGN((ip), atime, (t1)->tv_sec); \
307 if ((ip)->i_flag & IN_UPDATE) { \
308 DIP_ASSIGN((ip), mtime, (t2)->tv_sec); \
309 (ip)->i_modrev++; \
310 } \
311 if ((ip)->i_flag & IN_CHANGE) \
312 DIP_ASSIGN((ip), ctime, time_second); \
313 (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
314 } \
315 }
316
317 #define EXT2FS_ITIMES(ip, t1, t2) { \
318 if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
319 (ip)->i_flag |= IN_MODIFIED; \
320 if ((ip)->i_flag & IN_ACCESS) \
321 (ip)->i_e2fs_atime = (t1)->tv_sec; \
322 if ((ip)->i_flag & IN_UPDATE) { \
323 (ip)->i_e2fs_mtime = (t2)->tv_sec; \
324 (ip)->i_modrev++; \
325 } \
326 if ((ip)->i_flag & IN_CHANGE) \
327 (ip)->i_e2fs_ctime = time_second; \
328 (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
329 } \
330 }
331
332 #define ITIMES(ip, t1, t2) { \
333 if (IS_EXT2_VNODE((ip)->i_vnode)) { \
334 EXT2FS_ITIMES(ip, t1, t2); \
335 } else { \
336 FFS_ITIMES(ip, t1, t2); \
337 } \
338 }
339
340
341 #ifdef FFS_SOFTUPDATES
342 #define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP)
343 #else
344 #define DOINGSOFTDEP(vp) (0)
345 #endif
346 #define DOINGASYNC(vp) ((vp)->v_mount->mnt_flag & MNT_ASYNC)
347
348
349 struct ufid {
350 u_int16_t ufid_len;
351 u_int16_t ufid_pad;
352 ino_t ufid_ino;
353 int32_t ufid_gen;
354 };
355 #endif