Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.5 197 lines 6.2 kB view raw
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_FORK_H__ 7#define __XFS_INODE_FORK_H__ 8 9struct xfs_inode_log_item; 10struct xfs_dinode; 11 12/* 13 * File incore extent information, present for each of data & attr forks. 14 */ 15struct xfs_ifork { 16 int64_t if_bytes; /* bytes in if_u1 */ 17 struct xfs_btree_block *if_broot; /* file's incore btree root */ 18 unsigned int if_seq; /* fork mod counter */ 19 int if_height; /* height of the extent tree */ 20 union { 21 void *if_root; /* extent tree root */ 22 char *if_data; /* inline file data */ 23 } if_u1; 24 short if_broot_bytes; /* bytes allocated for root */ 25 unsigned char if_flags; /* per-fork flags */ 26}; 27 28/* 29 * Per-fork incore inode flags. 30 */ 31#define XFS_IFINLINE 0x01 /* Inline data is read in */ 32#define XFS_IFEXTENTS 0x02 /* All extent pointers are read in */ 33#define XFS_IFBROOT 0x04 /* i_broot points to the bmap b-tree root */ 34 35/* 36 * Fork handling. 37 */ 38 39#define XFS_IFORK_Q(ip) ((ip)->i_d.di_forkoff != 0) 40#define XFS_IFORK_BOFF(ip) ((int)((ip)->i_d.di_forkoff << 3)) 41 42#define XFS_IFORK_PTR(ip,w) \ 43 ((w) == XFS_DATA_FORK ? \ 44 &(ip)->i_df : \ 45 ((w) == XFS_ATTR_FORK ? \ 46 (ip)->i_afp : \ 47 (ip)->i_cowfp)) 48#define XFS_IFORK_DSIZE(ip) \ 49 (XFS_IFORK_Q(ip) ? \ 50 XFS_IFORK_BOFF(ip) : \ 51 XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) 52#define XFS_IFORK_ASIZE(ip) \ 53 (XFS_IFORK_Q(ip) ? \ 54 XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ 55 XFS_IFORK_BOFF(ip) : \ 56 0) 57#define XFS_IFORK_SIZE(ip,w) \ 58 ((w) == XFS_DATA_FORK ? \ 59 XFS_IFORK_DSIZE(ip) : \ 60 ((w) == XFS_ATTR_FORK ? \ 61 XFS_IFORK_ASIZE(ip) : \ 62 0)) 63#define XFS_IFORK_FORMAT(ip,w) \ 64 ((w) == XFS_DATA_FORK ? \ 65 (ip)->i_d.di_format : \ 66 ((w) == XFS_ATTR_FORK ? \ 67 (ip)->i_d.di_aformat : \ 68 (ip)->i_cformat)) 69#define XFS_IFORK_FMT_SET(ip,w,n) \ 70 ((w) == XFS_DATA_FORK ? \ 71 ((ip)->i_d.di_format = (n)) : \ 72 ((w) == XFS_ATTR_FORK ? \ 73 ((ip)->i_d.di_aformat = (n)) : \ 74 ((ip)->i_cformat = (n)))) 75#define XFS_IFORK_NEXTENTS(ip,w) \ 76 ((w) == XFS_DATA_FORK ? \ 77 (ip)->i_d.di_nextents : \ 78 ((w) == XFS_ATTR_FORK ? \ 79 (ip)->i_d.di_anextents : \ 80 (ip)->i_cnextents)) 81#define XFS_IFORK_NEXT_SET(ip,w,n) \ 82 ((w) == XFS_DATA_FORK ? \ 83 ((ip)->i_d.di_nextents = (n)) : \ 84 ((w) == XFS_ATTR_FORK ? \ 85 ((ip)->i_d.di_anextents = (n)) : \ 86 ((ip)->i_cnextents = (n)))) 87#define XFS_IFORK_MAXEXT(ip, w) \ 88 (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) 89 90#define xfs_ifork_has_extents(ip, w) \ 91 (XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_EXTENTS || \ 92 XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_BTREE) 93 94struct xfs_ifork *xfs_iext_state_to_fork(struct xfs_inode *ip, int state); 95 96int xfs_iformat_fork(struct xfs_inode *, struct xfs_dinode *); 97void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, 98 struct xfs_inode_log_item *, int); 99void xfs_idestroy_fork(struct xfs_inode *, int); 100void xfs_idata_realloc(struct xfs_inode *ip, int64_t byte_diff, 101 int whichfork); 102void xfs_iroot_realloc(struct xfs_inode *, int, int); 103int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); 104int xfs_iextents_copy(struct xfs_inode *, struct xfs_bmbt_rec *, 105 int); 106void xfs_init_local_fork(struct xfs_inode *ip, int whichfork, 107 const void *data, int64_t size); 108 109xfs_extnum_t xfs_iext_count(struct xfs_ifork *ifp); 110void xfs_iext_insert(struct xfs_inode *, struct xfs_iext_cursor *cur, 111 struct xfs_bmbt_irec *, int); 112void xfs_iext_remove(struct xfs_inode *, struct xfs_iext_cursor *, 113 int); 114void xfs_iext_destroy(struct xfs_ifork *); 115 116bool xfs_iext_lookup_extent(struct xfs_inode *ip, 117 struct xfs_ifork *ifp, xfs_fileoff_t bno, 118 struct xfs_iext_cursor *cur, 119 struct xfs_bmbt_irec *gotp); 120bool xfs_iext_lookup_extent_before(struct xfs_inode *ip, 121 struct xfs_ifork *ifp, xfs_fileoff_t *end, 122 struct xfs_iext_cursor *cur, 123 struct xfs_bmbt_irec *gotp); 124bool xfs_iext_get_extent(struct xfs_ifork *ifp, 125 struct xfs_iext_cursor *cur, 126 struct xfs_bmbt_irec *gotp); 127void xfs_iext_update_extent(struct xfs_inode *ip, int state, 128 struct xfs_iext_cursor *cur, 129 struct xfs_bmbt_irec *gotp); 130 131void xfs_iext_first(struct xfs_ifork *, struct xfs_iext_cursor *); 132void xfs_iext_last(struct xfs_ifork *, struct xfs_iext_cursor *); 133void xfs_iext_next(struct xfs_ifork *, struct xfs_iext_cursor *); 134void xfs_iext_prev(struct xfs_ifork *, struct xfs_iext_cursor *); 135 136static inline bool xfs_iext_next_extent(struct xfs_ifork *ifp, 137 struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *gotp) 138{ 139 xfs_iext_next(ifp, cur); 140 return xfs_iext_get_extent(ifp, cur, gotp); 141} 142 143static inline bool xfs_iext_prev_extent(struct xfs_ifork *ifp, 144 struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *gotp) 145{ 146 xfs_iext_prev(ifp, cur); 147 return xfs_iext_get_extent(ifp, cur, gotp); 148} 149 150/* 151 * Return the extent after cur in gotp without updating the cursor. 152 */ 153static inline bool xfs_iext_peek_next_extent(struct xfs_ifork *ifp, 154 struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *gotp) 155{ 156 struct xfs_iext_cursor ncur = *cur; 157 158 xfs_iext_next(ifp, &ncur); 159 return xfs_iext_get_extent(ifp, &ncur, gotp); 160} 161 162/* 163 * Return the extent before cur in gotp without updating the cursor. 164 */ 165static inline bool xfs_iext_peek_prev_extent(struct xfs_ifork *ifp, 166 struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *gotp) 167{ 168 struct xfs_iext_cursor ncur = *cur; 169 170 xfs_iext_prev(ifp, &ncur); 171 return xfs_iext_get_extent(ifp, &ncur, gotp); 172} 173 174#define for_each_xfs_iext(ifp, ext, got) \ 175 for (xfs_iext_first((ifp), (ext)); \ 176 xfs_iext_get_extent((ifp), (ext), (got)); \ 177 xfs_iext_next((ifp), (ext))) 178 179extern struct kmem_zone *xfs_ifork_zone; 180 181extern void xfs_ifork_init_cow(struct xfs_inode *ip); 182 183typedef xfs_failaddr_t (*xfs_ifork_verifier_t)(struct xfs_inode *); 184 185struct xfs_ifork_ops { 186 xfs_ifork_verifier_t verify_symlink; 187 xfs_ifork_verifier_t verify_dir; 188 xfs_ifork_verifier_t verify_attr; 189}; 190extern struct xfs_ifork_ops xfs_default_ifork_ops; 191 192xfs_failaddr_t xfs_ifork_verify_data(struct xfs_inode *ip, 193 struct xfs_ifork_ops *ops); 194xfs_failaddr_t xfs_ifork_verify_attr(struct xfs_inode *ip, 195 struct xfs_ifork_ops *ops); 196 197#endif /* __XFS_INODE_FORK_H__ */