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