diff options
Diffstat (limited to 'fs/xfs/xfs_bmap_btree.h')
-rw-r--r-- | fs/xfs/xfs_bmap_btree.h | 171 |
1 files changed, 60 insertions, 111 deletions
diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index cd0d4b4bb816..a4555abb6622 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h | |||
@@ -21,9 +21,10 @@ | |||
21 | #define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ | 21 | #define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ |
22 | 22 | ||
23 | struct xfs_btree_cur; | 23 | struct xfs_btree_cur; |
24 | struct xfs_btree_lblock; | 24 | struct xfs_btree_block; |
25 | struct xfs_mount; | 25 | struct xfs_mount; |
26 | struct xfs_inode; | 26 | struct xfs_inode; |
27 | struct xfs_trans; | ||
27 | 28 | ||
28 | /* | 29 | /* |
29 | * Bmap root header, on-disk form only. | 30 | * Bmap root header, on-disk form only. |
@@ -145,71 +146,60 @@ typedef struct xfs_bmbt_key { | |||
145 | /* btree pointer type */ | 146 | /* btree pointer type */ |
146 | typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; | 147 | typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; |
147 | 148 | ||
148 | /* btree block header type */ | 149 | /* |
149 | typedef struct xfs_btree_lblock xfs_bmbt_block_t; | 150 | * Btree block header size depends on a superblock flag. |
150 | 151 | * | |
151 | #define XFS_BUF_TO_BMBT_BLOCK(bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) | 152 | * (not quite yet, but soon) |
152 | 153 | */ | |
153 | #define XFS_BMAP_RBLOCK_DSIZE(lev,cur) ((cur)->bc_private.b.forksize) | 154 | #define XFS_BMBT_BLOCK_LEN(mp) XFS_BTREE_LBLOCK_LEN |
154 | #define XFS_BMAP_RBLOCK_ISIZE(lev,cur) \ | 155 | |
155 | ((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \ | 156 | #define XFS_BMBT_REC_ADDR(mp, block, index) \ |
156 | (cur)->bc_private.b.whichfork)->if_broot_bytes) | 157 | ((xfs_bmbt_rec_t *) \ |
157 | 158 | ((char *)(block) + \ | |
158 | #define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \ | 159 | XFS_BMBT_BLOCK_LEN(mp) + \ |
159 | (((lev) == (cur)->bc_nlevels - 1 ? \ | 160 | ((index) - 1) * sizeof(xfs_bmbt_rec_t))) |
160 | XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \ | 161 | |
161 | xfs_bmdr, (lev) == 0) : \ | 162 | #define XFS_BMBT_KEY_ADDR(mp, block, index) \ |
162 | ((cur)->bc_mp->m_bmap_dmxr[(lev) != 0]))) | 163 | ((xfs_bmbt_key_t *) \ |
163 | #define XFS_BMAP_BLOCK_IMAXRECS(lev,cur) \ | 164 | ((char *)(block) + \ |
164 | (((lev) == (cur)->bc_nlevels - 1 ? \ | 165 | XFS_BMBT_BLOCK_LEN(mp) + \ |
165 | XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur),\ | 166 | ((index) - 1) * sizeof(xfs_bmbt_key_t))) |
166 | xfs_bmbt, (lev) == 0) : \ | 167 | |
167 | ((cur)->bc_mp->m_bmap_dmxr[(lev) != 0]))) | 168 | #define XFS_BMBT_PTR_ADDR(mp, block, index, maxrecs) \ |
168 | 169 | ((xfs_bmbt_ptr_t *) \ | |
169 | #define XFS_BMAP_BLOCK_DMINRECS(lev,cur) \ | 170 | ((char *)(block) + \ |
170 | (((lev) == (cur)->bc_nlevels - 1 ? \ | 171 | XFS_BMBT_BLOCK_LEN(mp) + \ |
171 | XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur),\ | 172 | (maxrecs) * sizeof(xfs_bmbt_key_t) + \ |
172 | xfs_bmdr, (lev) == 0) : \ | 173 | ((index) - 1) * sizeof(xfs_bmbt_ptr_t))) |
173 | ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))) | 174 | |
174 | #define XFS_BMAP_BLOCK_IMINRECS(lev,cur) \ | 175 | #define XFS_BMDR_REC_ADDR(block, index) \ |
175 | (((lev) == (cur)->bc_nlevels - 1 ? \ | 176 | ((xfs_bmdr_rec_t *) \ |
176 | XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur),\ | 177 | ((char *)(block) + \ |
177 | xfs_bmbt, (lev) == 0) : \ | 178 | sizeof(struct xfs_bmdr_block) + \ |
178 | ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))) | 179 | ((index) - 1) * sizeof(xfs_bmdr_rec_t))) |
179 | 180 | ||
180 | #define XFS_BMAP_REC_DADDR(bb,i,cur) (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i)) | 181 | #define XFS_BMDR_KEY_ADDR(block, index) \ |
181 | 182 | ((xfs_bmdr_key_t *) \ | |
182 | #define XFS_BMAP_REC_IADDR(bb,i,cur) (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i)) | 183 | ((char *)(block) + \ |
183 | 184 | sizeof(struct xfs_bmdr_block) + \ | |
184 | #define XFS_BMAP_KEY_DADDR(bb,i,cur) \ | 185 | ((index) - 1) * sizeof(xfs_bmdr_key_t))) |
185 | (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i)) | 186 | |
186 | 187 | #define XFS_BMDR_PTR_ADDR(block, index, maxrecs) \ | |
187 | #define XFS_BMAP_KEY_IADDR(bb,i,cur) \ | 188 | ((xfs_bmdr_ptr_t *) \ |
188 | (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i)) | 189 | ((char *)(block) + \ |
189 | 190 | sizeof(struct xfs_bmdr_block) + \ | |
190 | #define XFS_BMAP_PTR_DADDR(bb,i,cur) \ | 191 | (maxrecs) * sizeof(xfs_bmdr_key_t) + \ |
191 | (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \ | 192 | ((index) - 1) * sizeof(xfs_bmdr_ptr_t))) |
192 | be16_to_cpu((bb)->bb_level), cur))) | ||
193 | #define XFS_BMAP_PTR_IADDR(bb,i,cur) \ | ||
194 | (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \ | ||
195 | be16_to_cpu((bb)->bb_level), cur))) | ||
196 | 193 | ||
197 | /* | 194 | /* |
198 | * These are to be used when we know the size of the block and | 195 | * These are to be used when we know the size of the block and |
199 | * we don't have a cursor. | 196 | * we don't have a cursor. |
200 | */ | 197 | */ |
201 | #define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \ | 198 | #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \ |
202 | (XFS_BTREE_REC_ADDR(xfs_bmbt,bb,i)) | 199 | XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0)) |
203 | #define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \ | ||
204 | (XFS_BTREE_KEY_ADDR(xfs_bmbt,bb,i)) | ||
205 | #define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \ | ||
206 | (XFS_BTREE_PTR_ADDR(xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))) | ||
207 | |||
208 | #define XFS_BMAP_BROOT_NUMRECS(bb) be16_to_cpu((bb)->bb_numrecs) | ||
209 | #define XFS_BMAP_BROOT_MAXRECS(sz) XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0) | ||
210 | 200 | ||
211 | #define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ | 201 | #define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \ |
212 | (int)(sizeof(xfs_bmbt_block_t) + \ | 202 | (int)(XFS_BTREE_LBLOCK_LEN + \ |
213 | ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) | 203 | ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) |
214 | 204 | ||
215 | #define XFS_BMAP_BROOT_SPACE(bb) \ | 205 | #define XFS_BMAP_BROOT_SPACE(bb) \ |
@@ -223,42 +213,12 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t; | |||
223 | */ | 213 | */ |
224 | #define XFS_BM_MAXLEVELS(mp,w) ((mp)->m_bm_maxlevels[(w)]) | 214 | #define XFS_BM_MAXLEVELS(mp,w) ((mp)->m_bm_maxlevels[(w)]) |
225 | 215 | ||
226 | #define XFS_BMAP_SANITY_CHECK(mp,bb,level) \ | ||
227 | (be32_to_cpu((bb)->bb_magic) == XFS_BMAP_MAGIC && \ | ||
228 | be16_to_cpu((bb)->bb_level) == level && \ | ||
229 | be16_to_cpu((bb)->bb_numrecs) > 0 && \ | ||
230 | be16_to_cpu((bb)->bb_numrecs) <= (mp)->m_bmap_dmxr[(level) != 0]) | ||
231 | |||
232 | |||
233 | #ifdef __KERNEL__ | ||
234 | |||
235 | #if defined(XFS_BMBT_TRACE) | ||
236 | /* | ||
237 | * Trace buffer entry types. | ||
238 | */ | ||
239 | #define XFS_BMBT_KTRACE_ARGBI 1 | ||
240 | #define XFS_BMBT_KTRACE_ARGBII 2 | ||
241 | #define XFS_BMBT_KTRACE_ARGFFFI 3 | ||
242 | #define XFS_BMBT_KTRACE_ARGI 4 | ||
243 | #define XFS_BMBT_KTRACE_ARGIFK 5 | ||
244 | #define XFS_BMBT_KTRACE_ARGIFR 6 | ||
245 | #define XFS_BMBT_KTRACE_ARGIK 7 | ||
246 | #define XFS_BMBT_KTRACE_CUR 8 | ||
247 | |||
248 | #define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */ | ||
249 | #define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */ | ||
250 | extern ktrace_t *xfs_bmbt_trace_buf; | ||
251 | #endif | ||
252 | |||
253 | /* | 216 | /* |
254 | * Prototypes for xfs_bmap.c to call. | 217 | * Prototypes for xfs_bmap.c to call. |
255 | */ | 218 | */ |
256 | extern void xfs_bmdr_to_bmbt(xfs_bmdr_block_t *, int, xfs_bmbt_block_t *, int); | 219 | extern void xfs_bmdr_to_bmbt(struct xfs_mount *, xfs_bmdr_block_t *, int, |
257 | extern int xfs_bmbt_decrement(struct xfs_btree_cur *, int, int *); | 220 | struct xfs_btree_block *, int); |
258 | extern int xfs_bmbt_delete(struct xfs_btree_cur *, int *); | ||
259 | extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); | 221 | extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); |
260 | extern xfs_bmbt_block_t *xfs_bmbt_get_block(struct xfs_btree_cur *cur, | ||
261 | int, struct xfs_buf **bpp); | ||
262 | extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); | 222 | extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); |
263 | extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); | 223 | extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); |
264 | extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r); | 224 | extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r); |
@@ -268,22 +228,6 @@ extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); | |||
268 | extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); | 228 | extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); |
269 | extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); | 229 | extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); |
270 | 230 | ||
271 | extern int xfs_bmbt_increment(struct xfs_btree_cur *, int, int *); | ||
272 | extern int xfs_bmbt_insert(struct xfs_btree_cur *, int *); | ||
273 | extern void xfs_bmbt_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); | ||
274 | extern void xfs_bmbt_log_recs(struct xfs_btree_cur *, struct xfs_buf *, int, | ||
275 | int); | ||
276 | extern int xfs_bmbt_lookup_eq(struct xfs_btree_cur *, xfs_fileoff_t, | ||
277 | xfs_fsblock_t, xfs_filblks_t, int *); | ||
278 | extern int xfs_bmbt_lookup_ge(struct xfs_btree_cur *, xfs_fileoff_t, | ||
279 | xfs_fsblock_t, xfs_filblks_t, int *); | ||
280 | |||
281 | /* | ||
282 | * Give the bmap btree a new root block. Copy the old broot contents | ||
283 | * down into a real block and make the broot point to it. | ||
284 | */ | ||
285 | extern int xfs_bmbt_newroot(struct xfs_btree_cur *cur, int *lflags, int *stat); | ||
286 | |||
287 | extern void xfs_bmbt_set_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); | 231 | extern void xfs_bmbt_set_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); |
288 | extern void xfs_bmbt_set_allf(xfs_bmbt_rec_host_t *r, xfs_fileoff_t o, | 232 | extern void xfs_bmbt_set_allf(xfs_bmbt_rec_host_t *r, xfs_fileoff_t o, |
289 | xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); | 233 | xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); |
@@ -296,10 +240,15 @@ extern void xfs_bmbt_disk_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); | |||
296 | extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o, | 240 | extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o, |
297 | xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); | 241 | xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); |
298 | 242 | ||
299 | extern void xfs_bmbt_to_bmdr(xfs_bmbt_block_t *, int, xfs_bmdr_block_t *, int); | 243 | extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int, |
300 | extern int xfs_bmbt_update(struct xfs_btree_cur *, xfs_fileoff_t, | 244 | xfs_bmdr_block_t *, int); |
301 | xfs_fsblock_t, xfs_filblks_t, xfs_exntst_t); | 245 | |
246 | extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level); | ||
247 | extern int xfs_bmdr_maxrecs(struct xfs_mount *, int blocklen, int leaf); | ||
248 | extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); | ||
249 | |||
250 | extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, | ||
251 | struct xfs_trans *, struct xfs_inode *, int); | ||
302 | 252 | ||
303 | #endif /* __KERNEL__ */ | ||
304 | 253 | ||
305 | #endif /* __XFS_BMAP_BTREE_H__ */ | 254 | #endif /* __XFS_BMAP_BTREE_H__ */ |