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