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
197static inline bool xfs_inode_has_bigtime(struct xfs_inode *ip)
198{
199 return ip->i_d.di_flags2 & XFS_DIFLAG2_BIGTIME;
200}
201
202
203
204
205#define xfs_inode_buftarg(ip) \
206 (XFS_IS_REALTIME_INODE(ip) ? \
207 (ip)->i_mount->m_rtdev_targp : (ip)->i_mount->m_ddev_targp)
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_IFLUSHING (1 << 7)
220#define __XFS_IPINNED_BIT 8
221#define XFS_IPINNED (1 << __XFS_IPINNED_BIT)
222#define XFS_IEOFBLOCKS (1 << 9)
223
224
225
226
227
228#define XFS_IRECOVERY (1 << 11)
229#define XFS_ICOWBLOCKS (1 << 12)
230
231
232
233
234
235
236#define XFS_IRECLAIM_RESET_FLAGS \
237 (XFS_IRECLAIMABLE | XFS_IRECLAIM | \
238 XFS_IDIRTY_RELEASE | XFS_ITRUNCATED)
239
240
241
242
243
244
245#define XFS_IOLOCK_EXCL (1<<0)
246#define XFS_IOLOCK_SHARED (1<<1)
247#define XFS_ILOCK_EXCL (1<<2)
248#define XFS_ILOCK_SHARED (1<<3)
249#define XFS_MMAPLOCK_EXCL (1<<4)
250#define XFS_MMAPLOCK_SHARED (1<<5)
251
252#define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
253 | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \
254 | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)
255
256#define XFS_LOCK_FLAGS \
257 { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \
258 { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \
259 { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \
260 { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \
261 { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \
262 { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" }
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
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#define XFS_IOLOCK_SHIFT 16
316#define XFS_IOLOCK_MAX_SUBCLASS 3
317#define XFS_IOLOCK_DEP_MASK 0x000f0000
318
319#define XFS_MMAPLOCK_SHIFT 20
320#define XFS_MMAPLOCK_NUMORDER 0
321#define XFS_MMAPLOCK_MAX_SUBCLASS 3
322#define XFS_MMAPLOCK_DEP_MASK 0x00f00000
323
324#define XFS_ILOCK_SHIFT 24
325#define XFS_ILOCK_PARENT_VAL 5
326#define XFS_ILOCK_MAX_SUBCLASS (XFS_ILOCK_PARENT_VAL - 1)
327#define XFS_ILOCK_RTBITMAP_VAL 6
328#define XFS_ILOCK_RTSUM_VAL 7
329#define XFS_ILOCK_DEP_MASK 0xff000000
330#define XFS_ILOCK_PARENT (XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT)
331#define XFS_ILOCK_RTBITMAP (XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT)
332#define XFS_ILOCK_RTSUM (XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT)
333
334#define XFS_LOCK_SUBCLASS_MASK (XFS_IOLOCK_DEP_MASK | \
335 XFS_MMAPLOCK_DEP_MASK | \
336 XFS_ILOCK_DEP_MASK)
337
338#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) \
339 >> XFS_IOLOCK_SHIFT)
340#define XFS_MMAPLOCK_DEP(flags) (((flags) & XFS_MMAPLOCK_DEP_MASK) \
341 >> XFS_MMAPLOCK_SHIFT)
342#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \
343 >> XFS_ILOCK_SHIFT)
344
345
346
347
348
349
350
351
352
353
354enum layout_break_reason {
355 BREAK_WRITE,
356 BREAK_UNMAP,
357};
358
359
360
361
362
363
364#define XFS_INHERIT_GID(pip) \
365 (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \
366 (VFS_I(pip)->i_mode & S_ISGID))
367
368int xfs_release(struct xfs_inode *ip);
369void xfs_inactive(struct xfs_inode *ip);
370int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
371 struct xfs_inode **ipp, struct xfs_name *ci_name);
372int xfs_create(struct xfs_inode *dp, struct xfs_name *name,
373 umode_t mode, dev_t rdev, struct xfs_inode **ipp);
374int xfs_create_tmpfile(struct xfs_inode *dp, umode_t mode,
375 struct xfs_inode **ipp);
376int xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
377 struct xfs_inode *ip);
378int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
379 struct xfs_name *target_name);
380int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name,
381 struct xfs_inode *src_ip, struct xfs_inode *target_dp,
382 struct xfs_name *target_name,
383 struct xfs_inode *target_ip, unsigned int flags);
384
385void xfs_ilock(xfs_inode_t *, uint);
386int xfs_ilock_nowait(xfs_inode_t *, uint);
387void xfs_iunlock(xfs_inode_t *, uint);
388void xfs_ilock_demote(xfs_inode_t *, uint);
389int xfs_isilocked(xfs_inode_t *, uint);
390uint xfs_ilock_data_map_shared(struct xfs_inode *);
391uint xfs_ilock_attr_map_shared(struct xfs_inode *);
392
393uint xfs_ip2xflags(struct xfs_inode *);
394int xfs_ifree(struct xfs_trans *, struct xfs_inode *);
395int xfs_itruncate_extents_flags(struct xfs_trans **,
396 struct xfs_inode *, int, xfs_fsize_t, int);
397void xfs_iext_realloc(xfs_inode_t *, int, int);
398
399int xfs_log_force_inode(struct xfs_inode *ip);
400void xfs_iunpin_wait(xfs_inode_t *);
401#define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount))
402
403int xfs_iflush_cluster(struct xfs_buf *);
404void xfs_lock_two_inodes(struct xfs_inode *ip0, uint ip0_mode,
405 struct xfs_inode *ip1, uint ip1_mode);
406
407xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip);
408xfs_extlen_t xfs_get_cowextsz_hint(struct xfs_inode *ip);
409
410int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t,
411 xfs_nlink_t, dev_t, prid_t,
412 struct xfs_inode **);
413
414static inline int
415xfs_itruncate_extents(
416 struct xfs_trans **tpp,
417 struct xfs_inode *ip,
418 int whichfork,
419 xfs_fsize_t new_size)
420{
421 return xfs_itruncate_extents_flags(tpp, ip, whichfork, new_size, 0);
422}
423
424
425enum xfs_prealloc_flags {
426 XFS_PREALLOC_SET = (1 << 1),
427 XFS_PREALLOC_CLEAR = (1 << 2),
428 XFS_PREALLOC_SYNC = (1 << 3),
429 XFS_PREALLOC_INVISIBLE = (1 << 4),
430};
431
432int xfs_update_prealloc_flags(struct xfs_inode *ip,
433 enum xfs_prealloc_flags flags);
434int xfs_break_layouts(struct inode *inode, uint *iolock,
435 enum layout_break_reason reason);
436
437
438extern void xfs_setup_inode(struct xfs_inode *ip);
439extern void xfs_setup_iops(struct xfs_inode *ip);
440extern void xfs_diflags_to_iflags(struct xfs_inode *ip, bool init);
441
442
443
444
445
446
447
448
449static inline void xfs_finish_inode_setup(struct xfs_inode *ip)
450{
451 xfs_iflags_clear(ip, XFS_INEW);
452 barrier();
453 unlock_new_inode(VFS_I(ip));
454 wake_up_bit(&ip->i_flags, __XFS_INEW_BIT);
455}
456
457static inline void xfs_setup_existing_inode(struct xfs_inode *ip)
458{
459 xfs_setup_inode(ip);
460 xfs_setup_iops(ip);
461 xfs_finish_inode_setup(ip);
462}
463
464void xfs_irele(struct xfs_inode *ip);
465
466extern struct kmem_zone *xfs_inode_zone;
467
468
469#define XFS_DEFAULT_COWEXTSZ_HINT 32
470
471int xfs_iunlink_init(struct xfs_perag *pag);
472void xfs_iunlink_destroy(struct xfs_perag *pag);
473
474void xfs_end_io(struct work_struct *work);
475
476int xfs_ilock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2);
477void xfs_iunlock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2);
478
479#endif
480