This source file includes following definitions.
- XFS_I
- VFS_I
- XFS_ISIZE
- xfs_new_eof
- __xfs_iflags_set
- xfs_iflags_set
- xfs_iflags_clear
- __xfs_iflags_test
- xfs_iflags_test
- xfs_iflags_test_and_clear
- xfs_iflags_test_and_set
- xfs_get_projid
- xfs_set_projid
- xfs_get_initial_prid
- xfs_is_reflink_inode
- xfs_inode_has_cow_data
- xfs_isiflocked
- xfs_iflock_nowait
- xfs_iflock
- xfs_ifunlock
- xfs_itruncate_extents
- xfs_finish_inode_setup
- xfs_setup_existing_inode
1
2
3
4
5
6 #ifndef __XFS_INODE_H__
7 #define __XFS_INODE_H__
8
9 #include "xfs_inode_buf.h"
10 #include "xfs_inode_fork.h"
11
12
13
14
15 struct xfs_dinode;
16 struct xfs_inode;
17 struct xfs_buf;
18 struct xfs_bmbt_irec;
19 struct xfs_inode_log_item;
20 struct xfs_mount;
21 struct xfs_trans;
22 struct xfs_dquot;
23
24 typedef struct xfs_inode {
25
26 struct xfs_mount *i_mount;
27 struct xfs_dquot *i_udquot;
28 struct xfs_dquot *i_gdquot;
29 struct xfs_dquot *i_pdquot;
30
31
32 xfs_ino_t i_ino;
33 struct xfs_imap i_imap;
34
35
36 struct xfs_ifork *i_afp;
37 struct xfs_ifork *i_cowfp;
38 struct xfs_ifork i_df;
39
40
41 const struct xfs_dir_ops *d_ops;
42
43
44 struct xfs_inode_log_item *i_itemp;
45 mrlock_t i_lock;
46 mrlock_t i_mmaplock;
47 atomic_t i_pincount;
48
49
50
51
52
53 uint16_t i_checked;
54 uint16_t i_sick;
55
56 spinlock_t i_flags_lock;
57
58 unsigned long i_flags;
59 uint64_t i_delayed_blks;
60
61 struct xfs_icdinode i_d;
62
63 xfs_extnum_t i_cnextents;
64 unsigned int i_cformat;
65
66
67 struct inode i_vnode;
68
69
70 spinlock_t i_ioend_lock;
71 struct work_struct i_ioend_work;
72 struct list_head i_ioend_list;
73 } xfs_inode_t;
74
75
76 static inline struct xfs_inode *XFS_I(struct inode *inode)
77 {
78 return container_of(inode, struct xfs_inode, i_vnode);
79 }
80
81
82 static inline struct inode *VFS_I(struct xfs_inode *ip)
83 {
84 return &ip->i_vnode;
85 }
86
87
88
89
90
91
92 static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
93 {
94 if (S_ISREG(VFS_I(ip)->i_mode))
95 return i_size_read(VFS_I(ip));
96 return ip->i_d.di_size;
97 }
98
99
100
101
102
103 static inline xfs_fsize_t
104 xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size)
105 {
106 xfs_fsize_t i_size = i_size_read(VFS_I(ip));
107
108 if (new_size > i_size || new_size < 0)
109 new_size = i_size;
110 return new_size > ip->i_d.di_size ? new_size : 0;
111 }
112
113
114
115
116 static inline void
117 __xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
118 {
119 ip->i_flags |= flags;
120 }
121
122 static inline void
123 xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
124 {
125 spin_lock(&ip->i_flags_lock);
126 __xfs_iflags_set(ip, flags);
127 spin_unlock(&ip->i_flags_lock);
128 }
129
130 static inline void
131 xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
132 {
133 spin_lock(&ip->i_flags_lock);
134 ip->i_flags &= ~flags;
135 spin_unlock(&ip->i_flags_lock);
136 }
137
138 static inline int
139 __xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
140 {
141 return (ip->i_flags & flags);
142 }
143
144 static inline int
145 xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
146 {
147 int ret;
148 spin_lock(&ip->i_flags_lock);
149 ret = __xfs_iflags_test(ip, flags);
150 spin_unlock(&ip->i_flags_lock);
151 return ret;
152 }
153
154 static inline int
155 xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
156 {
157 int ret;
158
159 spin_lock(&ip->i_flags_lock);
160 ret = ip->i_flags & flags;
161 if (ret)
162 ip->i_flags &= ~flags;
163 spin_unlock(&ip->i_flags_lock);
164 return ret;
165 }
166
167 static inline int
168 xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags)
169 {
170 int ret;
171
172 spin_lock(&ip->i_flags_lock);
173 ret = ip->i_flags & flags;
174 if (!ret)
175 ip->i_flags |= flags;
176 spin_unlock(&ip->i_flags_lock);
177 return ret;
178 }
179
180
181
182
183
184
185 static inline prid_t
186 xfs_get_projid(struct xfs_inode *ip)
187 {
188 return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo;
189 }
190
191 static inline void
192 xfs_set_projid(struct xfs_inode *ip,
193 prid_t projid)
194 {
195 ip->i_d.di_projid_hi = (uint16_t) (projid >> 16);
196 ip->i_d.di_projid_lo = (uint16_t) (projid & 0xffff);
197 }
198
199 static inline prid_t
200 xfs_get_initial_prid(struct xfs_inode *dp)
201 {
202 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
203 return xfs_get_projid(dp);
204
205 return XFS_PROJID_DEFAULT;
206 }
207
208 static inline bool xfs_is_reflink_inode(struct xfs_inode *ip)
209 {
210 return ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK;
211 }
212
213
214
215
216
217 static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip)
218 {
219 return ip->i_cowfp && ip->i_cowfp->if_bytes;
220 }
221
222
223
224
225 #define XFS_IRECLAIM (1 << 0)
226 #define XFS_ISTALE (1 << 1)
227 #define XFS_IRECLAIMABLE (1 << 2)
228 #define __XFS_INEW_BIT 3
229 #define XFS_INEW (1 << __XFS_INEW_BIT)
230 #define XFS_ITRUNCATED (1 << 5)
231 #define XFS_IDIRTY_RELEASE (1 << 6)
232 #define __XFS_IFLOCK_BIT 7
233 #define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT)
234 #define __XFS_IPINNED_BIT 8
235 #define XFS_IPINNED (1 << __XFS_IPINNED_BIT)
236 #define XFS_IDONTCACHE (1 << 9)
237 #define XFS_IEOFBLOCKS (1 << 10)
238
239
240
241
242
243 #define XFS_IRECOVERY (1 << 11)
244 #define XFS_ICOWBLOCKS (1 << 12)
245
246
247
248
249
250
251 #define XFS_IRECLAIM_RESET_FLAGS \
252 (XFS_IRECLAIMABLE | XFS_IRECLAIM | \
253 XFS_IDIRTY_RELEASE | XFS_ITRUNCATED)
254
255
256
257
258
259 static inline int xfs_isiflocked(struct xfs_inode *ip)
260 {
261 return xfs_iflags_test(ip, XFS_IFLOCK);
262 }
263
264 extern void __xfs_iflock(struct xfs_inode *ip);
265
266 static inline int xfs_iflock_nowait(struct xfs_inode *ip)
267 {
268 return !xfs_iflags_test_and_set(ip, XFS_IFLOCK);
269 }
270
271 static inline void xfs_iflock(struct xfs_inode *ip)
272 {
273 if (!xfs_iflock_nowait(ip))
274 __xfs_iflock(ip);
275 }
276
277 static inline void xfs_ifunlock(struct xfs_inode *ip)
278 {
279 ASSERT(xfs_isiflocked(ip));
280 xfs_iflags_clear(ip, XFS_IFLOCK);
281 smp_mb();
282 wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);
283 }
284
285
286
287
288
289
290 #define XFS_IOLOCK_EXCL (1<<0)
291 #define XFS_IOLOCK_SHARED (1<<1)
292 #define XFS_ILOCK_EXCL (1<<2)
293 #define XFS_ILOCK_SHARED (1<<3)
294 #define XFS_MMAPLOCK_EXCL (1<<4)
295 #define XFS_MMAPLOCK_SHARED (1<<5)
296
297 #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
298 | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \
299 | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)
300
301 #define XFS_LOCK_FLAGS \
302 { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \
303 { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \
304 { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \
305 { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \
306 { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \
307 { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" }
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360 #define XFS_IOLOCK_SHIFT 16
361 #define XFS_IOLOCK_MAX_SUBCLASS 3
362 #define XFS_IOLOCK_DEP_MASK 0x000f0000
363
364 #define XFS_MMAPLOCK_SHIFT 20
365 #define XFS_MMAPLOCK_NUMORDER 0
366 #define XFS_MMAPLOCK_MAX_SUBCLASS 3
367 #define XFS_MMAPLOCK_DEP_MASK 0x00f00000
368
369 #define XFS_ILOCK_SHIFT 24
370 #define XFS_ILOCK_PARENT_VAL 5
371 #define XFS_ILOCK_MAX_SUBCLASS (XFS_ILOCK_PARENT_VAL - 1)
372 #define XFS_ILOCK_RTBITMAP_VAL 6
373 #define XFS_ILOCK_RTSUM_VAL 7
374 #define XFS_ILOCK_DEP_MASK 0xff000000
375 #define XFS_ILOCK_PARENT (XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT)
376 #define XFS_ILOCK_RTBITMAP (XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT)
377 #define XFS_ILOCK_RTSUM (XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT)
378
379 #define XFS_LOCK_SUBCLASS_MASK (XFS_IOLOCK_DEP_MASK | \
380 XFS_MMAPLOCK_DEP_MASK | \
381 XFS_ILOCK_DEP_MASK)
382
383 #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) \
384 >> XFS_IOLOCK_SHIFT)
385 #define XFS_MMAPLOCK_DEP(flags) (((flags) & XFS_MMAPLOCK_DEP_MASK) \
386 >> XFS_MMAPLOCK_SHIFT)
387 #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \
388 >> XFS_ILOCK_SHIFT)
389
390
391
392
393
394
395
396
397
398
399 enum layout_break_reason {
400 BREAK_WRITE,
401 BREAK_UNMAP,
402 };
403
404
405
406
407
408
409 #define XFS_INHERIT_GID(pip) \
410 (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \
411 (VFS_I(pip)->i_mode & S_ISGID))
412
413 int xfs_release(struct xfs_inode *ip);
414 void xfs_inactive(struct xfs_inode *ip);
415 int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
416 struct xfs_inode **ipp, struct xfs_name *ci_name);
417 int xfs_create(struct xfs_inode *dp, struct xfs_name *name,
418 umode_t mode, dev_t rdev, struct xfs_inode **ipp);
419 int xfs_create_tmpfile(struct xfs_inode *dp, umode_t mode,
420 struct xfs_inode **ipp);
421 int xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
422 struct xfs_inode *ip);
423 int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
424 struct xfs_name *target_name);
425 int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name,
426 struct xfs_inode *src_ip, struct xfs_inode *target_dp,
427 struct xfs_name *target_name,
428 struct xfs_inode *target_ip, unsigned int flags);
429
430 void xfs_ilock(xfs_inode_t *, uint);
431 int xfs_ilock_nowait(xfs_inode_t *, uint);
432 void xfs_iunlock(xfs_inode_t *, uint);
433 void xfs_ilock_demote(xfs_inode_t *, uint);
434 int xfs_isilocked(xfs_inode_t *, uint);
435 uint xfs_ilock_data_map_shared(struct xfs_inode *);
436 uint xfs_ilock_attr_map_shared(struct xfs_inode *);
437
438 uint xfs_ip2xflags(struct xfs_inode *);
439 int xfs_ifree(struct xfs_trans *, struct xfs_inode *);
440 int xfs_itruncate_extents_flags(struct xfs_trans **,
441 struct xfs_inode *, int, xfs_fsize_t, int);
442 void xfs_iext_realloc(xfs_inode_t *, int, int);
443
444 void xfs_iunpin_wait(xfs_inode_t *);
445 #define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount))
446
447 int xfs_iflush(struct xfs_inode *, struct xfs_buf **);
448 void xfs_lock_two_inodes(struct xfs_inode *ip0, uint ip0_mode,
449 struct xfs_inode *ip1, uint ip1_mode);
450
451 xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip);
452 xfs_extlen_t xfs_get_cowextsz_hint(struct xfs_inode *ip);
453
454 int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t,
455 xfs_nlink_t, dev_t, prid_t,
456 struct xfs_inode **);
457
458 static inline int
459 xfs_itruncate_extents(
460 struct xfs_trans **tpp,
461 struct xfs_inode *ip,
462 int whichfork,
463 xfs_fsize_t new_size)
464 {
465 return xfs_itruncate_extents_flags(tpp, ip, whichfork, new_size, 0);
466 }
467
468
469 enum xfs_prealloc_flags {
470 XFS_PREALLOC_SET = (1 << 1),
471 XFS_PREALLOC_CLEAR = (1 << 2),
472 XFS_PREALLOC_SYNC = (1 << 3),
473 XFS_PREALLOC_INVISIBLE = (1 << 4),
474 };
475
476 int xfs_update_prealloc_flags(struct xfs_inode *ip,
477 enum xfs_prealloc_flags flags);
478 int xfs_break_layouts(struct inode *inode, uint *iolock,
479 enum layout_break_reason reason);
480
481
482 extern void xfs_setup_inode(struct xfs_inode *ip);
483 extern void xfs_setup_iops(struct xfs_inode *ip);
484
485
486
487
488
489
490
491
492 static inline void xfs_finish_inode_setup(struct xfs_inode *ip)
493 {
494 xfs_iflags_clear(ip, XFS_INEW);
495 barrier();
496 unlock_new_inode(VFS_I(ip));
497 wake_up_bit(&ip->i_flags, __XFS_INEW_BIT);
498 }
499
500 static inline void xfs_setup_existing_inode(struct xfs_inode *ip)
501 {
502 xfs_setup_inode(ip);
503 xfs_setup_iops(ip);
504 xfs_finish_inode_setup(ip);
505 }
506
507 void xfs_irele(struct xfs_inode *ip);
508
509 extern struct kmem_zone *xfs_inode_zone;
510
511
512 #define XFS_DEFAULT_COWEXTSZ_HINT 32
513
514 bool xfs_inode_verify_forks(struct xfs_inode *ip);
515
516 int xfs_iunlink_init(struct xfs_perag *pag);
517 void xfs_iunlink_destroy(struct xfs_perag *pag);
518
519 void xfs_end_io(struct work_struct *work);
520
521 #endif