1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_INODE_H__
19#define __XFS_INODE_H__
20
21#include "xfs_inode_buf.h"
22#include "xfs_inode_fork.h"
23
24
25
26
27struct xfs_dinode;
28struct xfs_inode;
29struct xfs_buf;
30struct xfs_defer_ops;
31struct xfs_bmbt_irec;
32struct xfs_inode_log_item;
33struct xfs_mount;
34struct xfs_trans;
35struct xfs_dquot;
36
37typedef struct xfs_inode {
38
39 struct xfs_mount *i_mount;
40 struct xfs_dquot *i_udquot;
41 struct xfs_dquot *i_gdquot;
42 struct xfs_dquot *i_pdquot;
43
44
45 xfs_ino_t i_ino;
46 struct xfs_imap i_imap;
47
48
49 xfs_ifork_t *i_afp;
50 xfs_ifork_t i_df;
51
52
53 const struct xfs_dir_ops *d_ops;
54
55
56 struct xfs_inode_log_item *i_itemp;
57 mrlock_t i_lock;
58 mrlock_t i_iolock;
59 mrlock_t i_mmaplock;
60 atomic_t i_pincount;
61 spinlock_t i_flags_lock;
62
63 unsigned long i_flags;
64 unsigned int i_delayed_blks;
65 spinlock_t i_size_lock;
66
67 struct list_head i_wblist;
68
69 struct xfs_icdinode i_d;
70
71
72 struct inode i_vnode;
73} xfs_inode_t;
74
75
76static inline struct xfs_inode *XFS_I(struct inode *inode)
77{
78 return container_of(inode, struct xfs_inode, i_vnode);
79}
80
81
82static inline struct inode *VFS_I(struct xfs_inode *ip)
83{
84 return &ip->i_vnode;
85}
86
87
88
89
90
91
92static 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
103static inline xfs_fsize_t
104xfs_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
116static inline void
117__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
118{
119 ip->i_flags |= flags;
120}
121
122static inline void
123xfs_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
130static inline void
131xfs_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
138static inline int
139__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
140{
141 return (ip->i_flags & flags);
142}
143
144static inline int
145xfs_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
154static inline int
155xfs_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
167static inline int
168xfs_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
185static inline prid_t
186xfs_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
191static inline void
192xfs_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
199static inline prid_t
200xfs_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
209
210
211#define XFS_IRECLAIM (1 << 0)
212#define XFS_ISTALE (1 << 1)
213#define XFS_IRECLAIMABLE (1 << 2)
214#define __XFS_INEW_BIT 3
215#define XFS_INEW (1 << __XFS_INEW_BIT)
216#define XFS_ITRUNCATED (1 << 5)
217#define XFS_IDIRTY_RELEASE (1 << 6)
218#define __XFS_IFLOCK_BIT 7
219#define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT)
220#define __XFS_IPINNED_BIT 8
221#define XFS_IPINNED (1 << __XFS_IPINNED_BIT)
222#define XFS_IDONTCACHE (1 << 9)
223#define XFS_IEOFBLOCKS (1 << 10)
224
225
226
227
228
229
230#define XFS_IRECLAIM_RESET_FLAGS \
231 (XFS_IRECLAIMABLE | XFS_IRECLAIM | \
232 XFS_IDIRTY_RELEASE | XFS_ITRUNCATED)
233
234
235
236
237
238static inline int xfs_isiflocked(struct xfs_inode *ip)
239{
240 return xfs_iflags_test(ip, XFS_IFLOCK);
241}
242
243extern void __xfs_iflock(struct xfs_inode *ip);
244
245static inline int xfs_iflock_nowait(struct xfs_inode *ip)
246{
247 return !xfs_iflags_test_and_set(ip, XFS_IFLOCK);
248}
249
250static inline void xfs_iflock(struct xfs_inode *ip)
251{
252 if (!xfs_iflock_nowait(ip))
253 __xfs_iflock(ip);
254}
255
256static inline void xfs_ifunlock(struct xfs_inode *ip)
257{
258 ASSERT(xfs_isiflocked(ip));
259 xfs_iflags_clear(ip, XFS_IFLOCK);
260 smp_mb();
261 wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);
262}
263
264
265
266
267
268
269#define XFS_IOLOCK_EXCL (1<<0)
270#define XFS_IOLOCK_SHARED (1<<1)
271#define XFS_ILOCK_EXCL (1<<2)
272#define XFS_ILOCK_SHARED (1<<3)
273#define XFS_MMAPLOCK_EXCL (1<<4)
274#define XFS_MMAPLOCK_SHARED (1<<5)
275
276#define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
277 | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \
278 | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)
279
280#define XFS_LOCK_FLAGS \
281 { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \
282 { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \
283 { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \
284 { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \
285 { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \
286 { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" }
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
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339#define XFS_IOLOCK_SHIFT 16
340#define XFS_IOLOCK_PARENT_VAL 4
341#define XFS_IOLOCK_MAX_SUBCLASS (XFS_IOLOCK_PARENT_VAL - 1)
342#define XFS_IOLOCK_DEP_MASK 0x000f0000
343#define XFS_IOLOCK_PARENT (XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT)
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, struct dentry *dentry,
401 umode_t mode, 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 *, xfs_inode_t *,
421 struct xfs_defer_ops *);
422int xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *,
423 int, xfs_fsize_t);
424void xfs_iext_realloc(xfs_inode_t *, int, int);
425
426void xfs_iunpin_wait(xfs_inode_t *);
427#define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount))
428
429int xfs_iflush(struct xfs_inode *, struct xfs_buf **);
430void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint);
431
432xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip);
433
434int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t,
435 xfs_nlink_t, dev_t, prid_t,
436 struct xfs_inode **, int *);
437
438
439enum xfs_prealloc_flags {
440 XFS_PREALLOC_SET = (1 << 1),
441 XFS_PREALLOC_CLEAR = (1 << 2),
442 XFS_PREALLOC_SYNC = (1 << 3),
443 XFS_PREALLOC_INVISIBLE = (1 << 4),
444};
445
446int xfs_update_prealloc_flags(struct xfs_inode *ip,
447 enum xfs_prealloc_flags flags);
448int xfs_break_layouts(struct inode *inode, uint *iolock,
449 enum layout_break_reason reason, bool with_imutex);
450int xfs_zero_eof(struct xfs_inode *ip, xfs_off_t offset,
451 xfs_fsize_t isize, bool *did_zeroing);
452int xfs_zero_range(struct xfs_inode *ip, xfs_off_t pos, xfs_off_t count,
453 bool *did_zero);
454
455
456extern void xfs_setup_inode(struct xfs_inode *ip);
457extern void xfs_setup_iops(struct xfs_inode *ip);
458
459
460
461
462
463
464
465
466static inline void xfs_finish_inode_setup(struct xfs_inode *ip)
467{
468 xfs_iflags_clear(ip, XFS_INEW);
469 barrier();
470 unlock_new_inode(VFS_I(ip));
471 wake_up_bit(&ip->i_flags, __XFS_INEW_BIT);
472}
473
474static inline void xfs_setup_existing_inode(struct xfs_inode *ip)
475{
476 xfs_setup_inode(ip);
477 xfs_setup_iops(ip);
478 xfs_finish_inode_setup(ip);
479}
480
481#define IHOLD(ip) \
482do { \
483 ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \
484 ihold(VFS_I(ip)); \
485 trace_xfs_ihold(ip, _THIS_IP_); \
486} while (0)
487
488#define IRELE(ip) \
489do { \
490 trace_xfs_irele(ip, _THIS_IP_); \
491 iput(VFS_I(ip)); \
492} while (0)
493
494extern struct kmem_zone *xfs_inode_zone;
495
496#endif
497