1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* |
3 | * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. |
4 | * All Rights Reserved. |
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 | * Kernel only inode definitions |
14 | */ |
15 | struct xfs_dinode; |
16 | struct xfs_inode; |
17 | struct xfs_buf; |
18 | struct xfs_bmbt_irec; |
19 | struct xfs_inode_log_item; |
20 | struct xfs_mount; |
21 | struct xfs_trans; |
22 | struct xfs_dquot; |
23 | |
24 | typedef struct xfs_inode { |
25 | /* Inode linking and identification information. */ |
26 | struct xfs_mount *i_mount; /* fs mount struct ptr */ |
27 | struct xfs_dquot *i_udquot; /* user dquot */ |
28 | struct xfs_dquot *i_gdquot; /* group dquot */ |
29 | struct xfs_dquot *i_pdquot; /* project dquot */ |
30 | |
31 | /* Inode location stuff */ |
32 | xfs_ino_t i_ino; /* inode number (agno/agino)*/ |
33 | struct xfs_imap i_imap; /* location for xfs_imap() */ |
34 | |
35 | /* Extent information. */ |
36 | struct xfs_ifork *i_cowfp; /* copy on write extents */ |
37 | struct xfs_ifork i_df; /* data fork */ |
38 | struct xfs_ifork i_af; /* attribute fork */ |
39 | |
40 | /* Transaction and locking information. */ |
41 | struct xfs_inode_log_item *i_itemp; /* logging information */ |
42 | struct rw_semaphore i_lock; /* inode lock */ |
43 | atomic_t i_pincount; /* inode pin count */ |
44 | struct llist_node i_gclist; /* deferred inactivation list */ |
45 | |
46 | /* |
47 | * Bitsets of inode metadata that have been checked and/or are sick. |
48 | * Callers must hold i_flags_lock before accessing this field. |
49 | */ |
50 | uint16_t i_checked; |
51 | uint16_t i_sick; |
52 | |
53 | spinlock_t i_flags_lock; /* inode i_flags lock */ |
54 | /* Miscellaneous state. */ |
55 | unsigned long i_flags; /* see defined flags below */ |
56 | uint64_t i_delayed_blks; /* count of delay alloc blks */ |
57 | xfs_fsize_t i_disk_size; /* number of bytes in file */ |
58 | xfs_rfsblock_t i_nblocks; /* # of direct & btree blocks */ |
59 | prid_t i_projid; /* owner's project id */ |
60 | xfs_extlen_t i_extsize; /* basic/minimum extent size */ |
61 | /* cowextsize is only used for v3 inodes, flushiter for v1/2 */ |
62 | union { |
63 | xfs_extlen_t i_cowextsize; /* basic cow extent size */ |
64 | uint16_t i_flushiter; /* incremented on flush */ |
65 | }; |
66 | uint8_t i_forkoff; /* attr fork offset >> 3 */ |
67 | uint16_t i_diflags; /* XFS_DIFLAG_... */ |
68 | uint64_t i_diflags2; /* XFS_DIFLAG2_... */ |
69 | struct timespec64 i_crtime; /* time created */ |
70 | |
71 | /* |
72 | * Unlinked list pointers. These point to the next and previous inodes |
73 | * in the AGI unlinked bucket list, respectively. These fields can |
74 | * only be updated with the AGI locked. |
75 | * |
76 | * i_next_unlinked caches di_next_unlinked. |
77 | */ |
78 | xfs_agino_t i_next_unlinked; |
79 | |
80 | /* |
81 | * If the inode is not on an unlinked list, this field is zero. If the |
82 | * inode is the first element in an unlinked list, this field is |
83 | * NULLAGINO. Otherwise, i_prev_unlinked points to the previous inode |
84 | * in the unlinked list. |
85 | */ |
86 | xfs_agino_t i_prev_unlinked; |
87 | |
88 | /* VFS inode */ |
89 | struct inode i_vnode; /* embedded VFS inode */ |
90 | |
91 | /* pending io completions */ |
92 | spinlock_t i_ioend_lock; |
93 | struct work_struct i_ioend_work; |
94 | struct list_head i_ioend_list; |
95 | } xfs_inode_t; |
96 | |
97 | static inline bool xfs_inode_on_unlinked_list(const struct xfs_inode *ip) |
98 | { |
99 | return ip->i_prev_unlinked != 0; |
100 | } |
101 | |
102 | static inline bool xfs_inode_has_attr_fork(struct xfs_inode *ip) |
103 | { |
104 | return ip->i_forkoff > 0; |
105 | } |
106 | |
107 | static inline struct xfs_ifork * |
108 | xfs_ifork_ptr( |
109 | struct xfs_inode *ip, |
110 | int whichfork) |
111 | { |
112 | switch (whichfork) { |
113 | case XFS_DATA_FORK: |
114 | return &ip->i_df; |
115 | case XFS_ATTR_FORK: |
116 | if (!xfs_inode_has_attr_fork(ip)) |
117 | return NULL; |
118 | return &ip->i_af; |
119 | case XFS_COW_FORK: |
120 | return ip->i_cowfp; |
121 | default: |
122 | ASSERT(0); |
123 | return NULL; |
124 | } |
125 | } |
126 | |
127 | static inline unsigned int xfs_inode_fork_boff(struct xfs_inode *ip) |
128 | { |
129 | return ip->i_forkoff << 3; |
130 | } |
131 | |
132 | static inline unsigned int xfs_inode_data_fork_size(struct xfs_inode *ip) |
133 | { |
134 | if (xfs_inode_has_attr_fork(ip)) |
135 | return xfs_inode_fork_boff(ip); |
136 | |
137 | return XFS_LITINO(ip->i_mount); |
138 | } |
139 | |
140 | static inline unsigned int xfs_inode_attr_fork_size(struct xfs_inode *ip) |
141 | { |
142 | if (xfs_inode_has_attr_fork(ip)) |
143 | return XFS_LITINO(ip->i_mount) - xfs_inode_fork_boff(ip); |
144 | return 0; |
145 | } |
146 | |
147 | static inline unsigned int |
148 | xfs_inode_fork_size( |
149 | struct xfs_inode *ip, |
150 | int whichfork) |
151 | { |
152 | switch (whichfork) { |
153 | case XFS_DATA_FORK: |
154 | return xfs_inode_data_fork_size(ip); |
155 | case XFS_ATTR_FORK: |
156 | return xfs_inode_attr_fork_size(ip); |
157 | default: |
158 | return 0; |
159 | } |
160 | } |
161 | |
162 | /* Convert from vfs inode to xfs inode */ |
163 | static inline struct xfs_inode *XFS_I(struct inode *inode) |
164 | { |
165 | return container_of(inode, struct xfs_inode, i_vnode); |
166 | } |
167 | |
168 | /* convert from xfs inode to vfs inode */ |
169 | static inline struct inode *VFS_I(struct xfs_inode *ip) |
170 | { |
171 | return &ip->i_vnode; |
172 | } |
173 | |
174 | /* convert from const xfs inode to const vfs inode */ |
175 | static inline const struct inode *VFS_IC(const struct xfs_inode *ip) |
176 | { |
177 | return &ip->i_vnode; |
178 | } |
179 | |
180 | /* |
181 | * For regular files we only update the on-disk filesize when actually |
182 | * writing data back to disk. Until then only the copy in the VFS inode |
183 | * is uptodate. |
184 | */ |
185 | static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) |
186 | { |
187 | if (S_ISREG(VFS_I(ip)->i_mode)) |
188 | return i_size_read(inode: VFS_I(ip)); |
189 | return ip->i_disk_size; |
190 | } |
191 | |
192 | /* |
193 | * If this I/O goes past the on-disk inode size update it unless it would |
194 | * be past the current in-core inode size. |
195 | */ |
196 | static inline xfs_fsize_t |
197 | xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size) |
198 | { |
199 | xfs_fsize_t i_size = i_size_read(VFS_I(ip)); |
200 | |
201 | if (new_size > i_size || new_size < 0) |
202 | new_size = i_size; |
203 | return new_size > ip->i_disk_size ? new_size : 0; |
204 | } |
205 | |
206 | /* |
207 | * i_flags helper functions |
208 | */ |
209 | static inline void |
210 | __xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) |
211 | { |
212 | ip->i_flags |= flags; |
213 | } |
214 | |
215 | static inline void |
216 | xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) |
217 | { |
218 | spin_lock(lock: &ip->i_flags_lock); |
219 | __xfs_iflags_set(ip, flags); |
220 | spin_unlock(lock: &ip->i_flags_lock); |
221 | } |
222 | |
223 | static inline void |
224 | xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags) |
225 | { |
226 | spin_lock(lock: &ip->i_flags_lock); |
227 | ip->i_flags &= ~flags; |
228 | spin_unlock(lock: &ip->i_flags_lock); |
229 | } |
230 | |
231 | static inline int |
232 | __xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) |
233 | { |
234 | return (ip->i_flags & flags); |
235 | } |
236 | |
237 | static inline int |
238 | xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) |
239 | { |
240 | int ret; |
241 | spin_lock(lock: &ip->i_flags_lock); |
242 | ret = __xfs_iflags_test(ip, flags); |
243 | spin_unlock(lock: &ip->i_flags_lock); |
244 | return ret; |
245 | } |
246 | |
247 | static inline int |
248 | xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) |
249 | { |
250 | int ret; |
251 | |
252 | spin_lock(lock: &ip->i_flags_lock); |
253 | ret = ip->i_flags & flags; |
254 | if (ret) |
255 | ip->i_flags &= ~flags; |
256 | spin_unlock(lock: &ip->i_flags_lock); |
257 | return ret; |
258 | } |
259 | |
260 | static inline int |
261 | xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags) |
262 | { |
263 | int ret; |
264 | |
265 | spin_lock(lock: &ip->i_flags_lock); |
266 | ret = ip->i_flags & flags; |
267 | if (!ret) |
268 | ip->i_flags |= flags; |
269 | spin_unlock(lock: &ip->i_flags_lock); |
270 | return ret; |
271 | } |
272 | |
273 | static inline prid_t |
274 | xfs_get_initial_prid(struct xfs_inode *dp) |
275 | { |
276 | if (dp->i_diflags & XFS_DIFLAG_PROJINHERIT) |
277 | return dp->i_projid; |
278 | |
279 | return XFS_PROJID_DEFAULT; |
280 | } |
281 | |
282 | static inline bool xfs_is_reflink_inode(struct xfs_inode *ip) |
283 | { |
284 | return ip->i_diflags2 & XFS_DIFLAG2_REFLINK; |
285 | } |
286 | |
287 | static inline bool xfs_is_metadata_inode(struct xfs_inode *ip) |
288 | { |
289 | struct xfs_mount *mp = ip->i_mount; |
290 | |
291 | return ip == mp->m_rbmip || ip == mp->m_rsumip || |
292 | xfs_is_quota_inode(&mp->m_sb, ip->i_ino); |
293 | } |
294 | |
295 | /* |
296 | * Check if an inode has any data in the COW fork. This might be often false |
297 | * even for inodes with the reflink flag when there is no pending COW operation. |
298 | */ |
299 | static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip) |
300 | { |
301 | return ip->i_cowfp && ip->i_cowfp->if_bytes; |
302 | } |
303 | |
304 | static inline bool xfs_inode_has_bigtime(struct xfs_inode *ip) |
305 | { |
306 | return ip->i_diflags2 & XFS_DIFLAG2_BIGTIME; |
307 | } |
308 | |
309 | static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip) |
310 | { |
311 | return ip->i_diflags2 & XFS_DIFLAG2_NREXT64; |
312 | } |
313 | |
314 | /* |
315 | * Return the buftarg used for data allocations on a given inode. |
316 | */ |
317 | #define xfs_inode_buftarg(ip) \ |
318 | (XFS_IS_REALTIME_INODE(ip) ? \ |
319 | (ip)->i_mount->m_rtdev_targp : (ip)->i_mount->m_ddev_targp) |
320 | |
321 | /* |
322 | * In-core inode flags. |
323 | */ |
324 | #define XFS_IRECLAIM (1 << 0) /* started reclaiming this inode */ |
325 | #define XFS_ISTALE (1 << 1) /* inode has been staled */ |
326 | #define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */ |
327 | #define XFS_INEW (1 << 3) /* inode has just been allocated */ |
328 | #define XFS_IPRESERVE_DM_FIELDS (1 << 4) /* has legacy DMAPI fields set */ |
329 | #define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */ |
330 | #define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */ |
331 | #define XFS_IFLUSHING (1 << 7) /* inode is being flushed */ |
332 | #define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ |
333 | #define XFS_IPINNED (1 << __XFS_IPINNED_BIT) |
334 | #define XFS_IEOFBLOCKS (1 << 9) /* has the preallocblocks tag set */ |
335 | #define XFS_NEED_INACTIVE (1 << 10) /* see XFS_INACTIVATING below */ |
336 | /* |
337 | * If this unlinked inode is in the middle of recovery, don't let drop_inode |
338 | * truncate and free the inode. This can happen if we iget the inode during |
339 | * log recovery to replay a bmap operation on the inode. |
340 | */ |
341 | #define XFS_IRECOVERY (1 << 11) |
342 | #define XFS_ICOWBLOCKS (1 << 12)/* has the cowblocks tag set */ |
343 | |
344 | /* |
345 | * If we need to update on-disk metadata before this IRECLAIMABLE inode can be |
346 | * freed, then NEED_INACTIVE will be set. Once we start the updates, the |
347 | * INACTIVATING bit will be set to keep iget away from this inode. After the |
348 | * inactivation completes, both flags will be cleared and the inode is a |
349 | * plain old IRECLAIMABLE inode. |
350 | */ |
351 | #define XFS_INACTIVATING (1 << 13) |
352 | |
353 | /* Quotacheck is running but inode has not been added to quota counts. */ |
354 | #define XFS_IQUOTAUNCHECKED (1 << 14) |
355 | |
356 | /* |
357 | * Remap in progress. Callers that wish to update file data while |
358 | * holding a shared IOLOCK or MMAPLOCK must drop the lock and retake |
359 | * the lock in exclusive mode. Relocking the file will block until |
360 | * IREMAPPING is cleared. |
361 | */ |
362 | #define XFS_IREMAPPING (1U << 15) |
363 | |
364 | /* All inode state flags related to inode reclaim. */ |
365 | #define XFS_ALL_IRECLAIM_FLAGS (XFS_IRECLAIMABLE | \ |
366 | XFS_IRECLAIM | \ |
367 | XFS_NEED_INACTIVE | \ |
368 | XFS_INACTIVATING) |
369 | |
370 | /* |
371 | * Per-lifetime flags need to be reset when re-using a reclaimable inode during |
372 | * inode lookup. This prevents unintended behaviour on the new inode from |
373 | * ocurring. |
374 | */ |
375 | #define XFS_IRECLAIM_RESET_FLAGS \ |
376 | (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ |
377 | XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | XFS_NEED_INACTIVE | \ |
378 | XFS_INACTIVATING | XFS_IQUOTAUNCHECKED) |
379 | |
380 | /* |
381 | * Flags for inode locking. |
382 | * Bit ranges: 1<<1 - 1<<16-1 -- iolock/ilock modes (bitfield) |
383 | * 1<<16 - 1<<32-1 -- lockdep annotation (integers) |
384 | */ |
385 | #define XFS_IOLOCK_EXCL (1u << 0) |
386 | #define XFS_IOLOCK_SHARED (1u << 1) |
387 | #define XFS_ILOCK_EXCL (1u << 2) |
388 | #define XFS_ILOCK_SHARED (1u << 3) |
389 | #define XFS_MMAPLOCK_EXCL (1u << 4) |
390 | #define XFS_MMAPLOCK_SHARED (1u << 5) |
391 | |
392 | #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ |
393 | | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \ |
394 | | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED) |
395 | |
396 | #define XFS_LOCK_FLAGS \ |
397 | { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ |
398 | { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ |
399 | { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ |
400 | { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ |
401 | { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \ |
402 | { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" } |
403 | |
404 | |
405 | /* |
406 | * Flags for lockdep annotations. |
407 | * |
408 | * XFS_LOCK_PARENT - for directory operations that require locking a |
409 | * parent directory inode and a child entry inode. IOLOCK requires nesting, |
410 | * MMAPLOCK does not support this class, ILOCK requires a single subclass |
411 | * to differentiate parent from child. |
412 | * |
413 | * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary |
414 | * inodes do not participate in the normal lock order, and thus have their |
415 | * own subclasses. |
416 | * |
417 | * XFS_LOCK_INUMORDER - for locking several inodes at the some time |
418 | * with xfs_lock_inodes(). This flag is used as the starting subclass |
419 | * and each subsequent lock acquired will increment the subclass by one. |
420 | * However, MAX_LOCKDEP_SUBCLASSES == 8, which means we are greatly |
421 | * limited to the subclasses we can represent via nesting. We need at least |
422 | * 5 inodes nest depth for the ILOCK through rename, and we also have to support |
423 | * XFS_ILOCK_PARENT, which gives 6 subclasses. Then we have XFS_ILOCK_RTBITMAP |
424 | * and XFS_ILOCK_RTSUM, which are another 2 unique subclasses, so that's all |
425 | * 8 subclasses supported by lockdep. |
426 | * |
427 | * This also means we have to number the sub-classes in the lowest bits of |
428 | * the mask we keep, and we have to ensure we never exceed 3 bits of lockdep |
429 | * mask and we can't use bit-masking to build the subclasses. What a mess. |
430 | * |
431 | * Bit layout: |
432 | * |
433 | * Bit Lock Region |
434 | * 16-19 XFS_IOLOCK_SHIFT dependencies |
435 | * 20-23 XFS_MMAPLOCK_SHIFT dependencies |
436 | * 24-31 XFS_ILOCK_SHIFT dependencies |
437 | * |
438 | * IOLOCK values |
439 | * |
440 | * 0-3 subclass value |
441 | * 4-7 unused |
442 | * |
443 | * MMAPLOCK values |
444 | * |
445 | * 0-3 subclass value |
446 | * 4-7 unused |
447 | * |
448 | * ILOCK values |
449 | * 0-4 subclass values |
450 | * 5 PARENT subclass (not nestable) |
451 | * 6 RTBITMAP subclass (not nestable) |
452 | * 7 RTSUM subclass (not nestable) |
453 | * |
454 | */ |
455 | #define XFS_IOLOCK_SHIFT 16 |
456 | #define XFS_IOLOCK_MAX_SUBCLASS 3 |
457 | #define XFS_IOLOCK_DEP_MASK 0x000f0000u |
458 | |
459 | #define XFS_MMAPLOCK_SHIFT 20 |
460 | #define XFS_MMAPLOCK_NUMORDER 0 |
461 | #define XFS_MMAPLOCK_MAX_SUBCLASS 3 |
462 | #define XFS_MMAPLOCK_DEP_MASK 0x00f00000u |
463 | |
464 | #define XFS_ILOCK_SHIFT 24 |
465 | #define XFS_ILOCK_PARENT_VAL 5u |
466 | #define XFS_ILOCK_MAX_SUBCLASS (XFS_ILOCK_PARENT_VAL - 1) |
467 | #define XFS_ILOCK_RTBITMAP_VAL 6u |
468 | #define XFS_ILOCK_RTSUM_VAL 7u |
469 | #define XFS_ILOCK_DEP_MASK 0xff000000u |
470 | #define XFS_ILOCK_PARENT (XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT) |
471 | #define XFS_ILOCK_RTBITMAP (XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT) |
472 | #define XFS_ILOCK_RTSUM (XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT) |
473 | |
474 | #define XFS_LOCK_SUBCLASS_MASK (XFS_IOLOCK_DEP_MASK | \ |
475 | XFS_MMAPLOCK_DEP_MASK | \ |
476 | XFS_ILOCK_DEP_MASK) |
477 | |
478 | #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) \ |
479 | >> XFS_IOLOCK_SHIFT) |
480 | #define XFS_MMAPLOCK_DEP(flags) (((flags) & XFS_MMAPLOCK_DEP_MASK) \ |
481 | >> XFS_MMAPLOCK_SHIFT) |
482 | #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \ |
483 | >> XFS_ILOCK_SHIFT) |
484 | |
485 | /* |
486 | * Layouts are broken in the BREAK_WRITE case to ensure that |
487 | * layout-holders do not collide with local writes. Additionally, |
488 | * layouts are broken in the BREAK_UNMAP case to make sure the |
489 | * layout-holder has a consistent view of the file's extent map. While |
490 | * BREAK_WRITE breaks can be satisfied by recalling FL_LAYOUT leases, |
491 | * BREAK_UNMAP breaks additionally require waiting for busy dax-pages to |
492 | * go idle. |
493 | */ |
494 | enum layout_break_reason { |
495 | BREAK_WRITE, |
496 | BREAK_UNMAP, |
497 | }; |
498 | |
499 | /* |
500 | * For multiple groups support: if S_ISGID bit is set in the parent |
501 | * directory, group of new file is set to that of the parent, and |
502 | * new subdirectory gets S_ISGID bit from parent. |
503 | */ |
504 | #define XFS_INHERIT_GID(pip) \ |
505 | (xfs_has_grpid((pip)->i_mount) || (VFS_I(pip)->i_mode & S_ISGID)) |
506 | |
507 | int xfs_release(struct xfs_inode *ip); |
508 | int xfs_inactive(struct xfs_inode *ip); |
509 | int xfs_lookup(struct xfs_inode *dp, const struct xfs_name *name, |
510 | struct xfs_inode **ipp, struct xfs_name *ci_name); |
511 | int xfs_create(struct mnt_idmap *idmap, |
512 | struct xfs_inode *dp, struct xfs_name *name, |
513 | umode_t mode, dev_t rdev, bool need_xattr, |
514 | struct xfs_inode **ipp); |
515 | int xfs_create_tmpfile(struct mnt_idmap *idmap, |
516 | struct xfs_inode *dp, umode_t mode, |
517 | struct xfs_inode **ipp); |
518 | int xfs_remove(struct xfs_inode *dp, struct xfs_name *name, |
519 | struct xfs_inode *ip); |
520 | int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, |
521 | struct xfs_name *target_name); |
522 | int xfs_rename(struct mnt_idmap *idmap, |
523 | struct xfs_inode *src_dp, struct xfs_name *src_name, |
524 | struct xfs_inode *src_ip, struct xfs_inode *target_dp, |
525 | struct xfs_name *target_name, |
526 | struct xfs_inode *target_ip, unsigned int flags); |
527 | |
528 | void xfs_ilock(xfs_inode_t *, uint); |
529 | int xfs_ilock_nowait(xfs_inode_t *, uint); |
530 | void xfs_iunlock(xfs_inode_t *, uint); |
531 | void xfs_ilock_demote(xfs_inode_t *, uint); |
532 | void xfs_assert_ilocked(struct xfs_inode *, uint); |
533 | uint xfs_ilock_data_map_shared(struct xfs_inode *); |
534 | uint xfs_ilock_attr_map_shared(struct xfs_inode *); |
535 | |
536 | uint xfs_ip2xflags(struct xfs_inode *); |
537 | int xfs_ifree(struct xfs_trans *, struct xfs_inode *); |
538 | int xfs_itruncate_extents_flags(struct xfs_trans **, |
539 | struct xfs_inode *, int, xfs_fsize_t, int); |
540 | void xfs_iext_realloc(xfs_inode_t *, int, int); |
541 | |
542 | int xfs_log_force_inode(struct xfs_inode *ip); |
543 | void xfs_iunpin_wait(xfs_inode_t *); |
544 | #define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount)) |
545 | |
546 | int xfs_iflush_cluster(struct xfs_buf *); |
547 | void xfs_lock_two_inodes(struct xfs_inode *ip0, uint ip0_mode, |
548 | struct xfs_inode *ip1, uint ip1_mode); |
549 | |
550 | xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); |
551 | xfs_extlen_t xfs_get_cowextsz_hint(struct xfs_inode *ip); |
552 | |
553 | int xfs_init_new_inode(struct mnt_idmap *idmap, struct xfs_trans *tp, |
554 | struct xfs_inode *pip, xfs_ino_t ino, umode_t mode, |
555 | xfs_nlink_t nlink, dev_t rdev, prid_t prid, bool init_xattrs, |
556 | struct xfs_inode **ipp); |
557 | |
558 | static inline int |
559 | xfs_itruncate_extents( |
560 | struct xfs_trans **tpp, |
561 | struct xfs_inode *ip, |
562 | int whichfork, |
563 | xfs_fsize_t new_size) |
564 | { |
565 | return xfs_itruncate_extents_flags(tpp, ip, whichfork, xfs_fsize_t: new_size, 0); |
566 | } |
567 | |
568 | /* from xfs_file.c */ |
569 | int xfs_break_dax_layouts(struct inode *inode, bool *retry); |
570 | int xfs_break_layouts(struct inode *inode, uint *iolock, |
571 | enum layout_break_reason reason); |
572 | |
573 | /* from xfs_iops.c */ |
574 | extern void xfs_setup_inode(struct xfs_inode *ip); |
575 | extern void xfs_setup_iops(struct xfs_inode *ip); |
576 | extern void xfs_diflags_to_iflags(struct xfs_inode *ip, bool init); |
577 | |
578 | static inline void xfs_update_stable_writes(struct xfs_inode *ip) |
579 | { |
580 | if (bdev_stable_writes(xfs_inode_buftarg(ip)->bt_bdev)) |
581 | mapping_set_stable_writes(mapping: VFS_I(ip)->i_mapping); |
582 | else |
583 | mapping_clear_stable_writes(mapping: VFS_I(ip)->i_mapping); |
584 | } |
585 | |
586 | /* |
587 | * When setting up a newly allocated inode, we need to call |
588 | * xfs_finish_inode_setup() once the inode is fully instantiated at |
589 | * the VFS level to prevent the rest of the world seeing the inode |
590 | * before we've completed instantiation. Otherwise we can do it |
591 | * the moment the inode lookup is complete. |
592 | */ |
593 | static inline void xfs_finish_inode_setup(struct xfs_inode *ip) |
594 | { |
595 | xfs_iflags_clear(ip, XFS_INEW); |
596 | barrier(); |
597 | unlock_new_inode(VFS_I(ip)); |
598 | } |
599 | |
600 | static inline void xfs_setup_existing_inode(struct xfs_inode *ip) |
601 | { |
602 | xfs_setup_inode(ip); |
603 | xfs_setup_iops(ip); |
604 | xfs_finish_inode_setup(ip); |
605 | } |
606 | |
607 | void xfs_irele(struct xfs_inode *ip); |
608 | |
609 | extern struct kmem_cache *xfs_inode_cache; |
610 | |
611 | /* The default CoW extent size hint. */ |
612 | #define XFS_DEFAULT_COWEXTSZ_HINT 32 |
613 | |
614 | bool xfs_inode_needs_inactive(struct xfs_inode *ip); |
615 | |
616 | void xfs_end_io(struct work_struct *work); |
617 | |
618 | int xfs_ilock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2); |
619 | void xfs_iunlock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2); |
620 | void xfs_iunlock2_remapping(struct xfs_inode *ip1, struct xfs_inode *ip2); |
621 | |
622 | static inline bool |
623 | xfs_inode_unlinked_incomplete( |
624 | struct xfs_inode *ip) |
625 | { |
626 | return VFS_I(ip)->i_nlink == 0 && !xfs_inode_on_unlinked_list(ip); |
627 | } |
628 | int xfs_inode_reload_unlinked_bucket(struct xfs_trans *tp, struct xfs_inode *ip); |
629 | int xfs_inode_reload_unlinked(struct xfs_inode *ip); |
630 | |
631 | bool xfs_ifork_zapped(const struct xfs_inode *ip, int whichfork); |
632 | void xfs_inode_count_blocks(struct xfs_trans *tp, struct xfs_inode *ip, |
633 | xfs_filblks_t *dblocks, xfs_filblks_t *rblocks); |
634 | |
635 | struct xfs_dir_update_params { |
636 | const struct xfs_inode *dp; |
637 | const struct xfs_inode *ip; |
638 | const struct xfs_name *name; |
639 | int delta; |
640 | }; |
641 | |
642 | #ifdef CONFIG_XFS_LIVE_HOOKS |
643 | void xfs_dir_update_hook(struct xfs_inode *dp, struct xfs_inode *ip, |
644 | int delta, const struct xfs_name *name); |
645 | |
646 | struct xfs_dir_hook { |
647 | struct xfs_hook dirent_hook; |
648 | }; |
649 | |
650 | void xfs_dir_hook_disable(void); |
651 | void xfs_dir_hook_enable(void); |
652 | |
653 | int xfs_dir_hook_add(struct xfs_mount *mp, struct xfs_dir_hook *hook); |
654 | void xfs_dir_hook_del(struct xfs_mount *mp, struct xfs_dir_hook *hook); |
655 | void xfs_dir_hook_setup(struct xfs_dir_hook *hook, notifier_fn_t mod_fn); |
656 | #else |
657 | # define xfs_dir_update_hook(dp, ip, delta, name) ((void)0) |
658 | #endif /* CONFIG_XFS_LIVE_HOOKS */ |
659 | |
660 | #endif /* __XFS_INODE_H__ */ |
661 |
Definitions
- xfs_inode
- xfs_inode_on_unlinked_list
- xfs_inode_has_attr_fork
- xfs_ifork_ptr
- xfs_inode_fork_boff
- xfs_inode_data_fork_size
- xfs_inode_attr_fork_size
- xfs_inode_fork_size
- XFS_I
- VFS_I
- VFS_IC
- XFS_ISIZE
- xfs_new_eof
- __xfs_iflags_set
- xfs_iflags_set
- xfs_iflags_clear
- __xfs_iflags_test
- xfs_iflags_test
- xfs_iflags_test_and_clear
- xfs_iflags_test_and_set
- xfs_get_initial_prid
- xfs_is_reflink_inode
- xfs_is_metadata_inode
- xfs_inode_has_cow_data
- xfs_inode_has_bigtime
- xfs_inode_has_large_extent_counts
- layout_break_reason
- xfs_itruncate_extents
- xfs_update_stable_writes
- xfs_finish_inode_setup
- xfs_setup_existing_inode
- xfs_inode_unlinked_incomplete
- xfs_dir_update_params
Improve your Profiling and Debugging skills
Find out more