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