1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
20 * Definition of the possible btree block layouts.
31 sizeof(xfs_bmbt_key_t
),
32 sizeof(xfs_bmbt_rec_t
),
37 sizeof(xfs_alloc_key_t
),
38 sizeof(xfs_alloc_rec_t
),
43 sizeof(xfs_alloc_key_t
),
44 sizeof(xfs_alloc_rec_t
),
49 sizeof(xfs_inobt_key_t
),
50 sizeof(xfs_inobt_rec_t
),
55 sizeof(xfs_inobt_key_t
),
56 sizeof(xfs_inobt_rec_t
),
60 XFS_BTREE_LBLOCK_CRC_LEN
,
61 sizeof(xfs_bmbt_key_t
),
62 sizeof(xfs_bmbt_rec_t
),
66 XFS_BTREE_SBLOCK_CRC_LEN
,
67 sizeof(xfs_alloc_key_t
),
68 sizeof(xfs_alloc_rec_t
),
72 XFS_BTREE_SBLOCK_CRC_LEN
,
73 sizeof(xfs_alloc_key_t
),
74 sizeof(xfs_alloc_rec_t
),
78 XFS_BTREE_SBLOCK_CRC_LEN
,
79 sizeof(xfs_inobt_key_t
),
80 sizeof(xfs_inobt_rec_t
),
84 XFS_BTREE_SBLOCK_CRC_LEN
,
85 sizeof(xfs_inobt_key_t
),
86 sizeof(xfs_inobt_rec_t
),
90 XFS_BTREE_SBLOCK_CRC_LEN
,
91 2 * sizeof(struct xfs_rmap_key
),
92 sizeof(struct xfs_rmap_rec
),
96 XFS_BTREE_SBLOCK_CRC_LEN
,
97 sizeof(struct xfs_refcount_key
),
98 sizeof(struct xfs_refcount_rec
),
106 * Find the right block definition for a given ondisk block.
108 static struct xfs_db_btree
*
110 struct xfs_btree_block
*bb
)
112 struct xfs_db_btree
*btp
;
116 magic
= be32_to_cpu((bb
)->bb_magic
);
117 for (btp
= &btrees
[0]; btp
->magic
!= 0; btp
++) {
118 if (magic
== btp
->magic
)
122 /* Magic is invalid/unknown. Guess based on iocur type */
123 crc
= xfs_sb_version_hascrc(&mp
->m_sb
);
124 switch (iocur_top
->typ
->typnm
) {
127 magic
= crc
? XFS_BMAP_CRC_MAGIC
: XFS_BMAP_MAGIC
;
130 magic
= crc
? XFS_ABTB_CRC_MAGIC
: XFS_ABTB_MAGIC
;
133 magic
= crc
? XFS_ABTC_CRC_MAGIC
: XFS_ABTC_MAGIC
;
136 magic
= crc
? XFS_IBT_CRC_MAGIC
: XFS_IBT_MAGIC
;
139 magic
= crc
? XFS_FIBT_CRC_MAGIC
: XFS_FIBT_MAGIC
;
142 magic
= crc
? XFS_RMAP_CRC_MAGIC
: 0;
145 magic
= crc
? XFS_REFC_CRC_MAGIC
: 0;
152 dbprintf(_("Bad btree magic 0x%x; coercing to %s.\n"),
153 be32_to_cpu((bb
)->bb_magic
),
154 iocur_top
->typ
->name
);
156 for (btp
= &btrees
[0]; btp
->magic
!= 0; btp
++) {
157 if (magic
== btp
->magic
)
164 /* calculate max records. Only for non-leaves. */
166 btblock_maxrecs(struct xfs_db_btree
*bt
, int blocksize
)
168 blocksize
-= bt
->block_len
;
170 return blocksize
/ (bt
->key_len
+ bt
->ptr_len
);
174 * Get the number of keys in a btree block.
176 * Note: can also be used to get the number of ptrs because there are
177 * always the same number of keys and ptrs in a block.
184 struct xfs_btree_block
*block
= obj
;
186 ASSERT(startoff
== 0);
188 if (block
->bb_level
== 0)
190 return be16_to_cpu(block
->bb_numrecs
);
194 * Get the number of keys in a btree block.
201 struct xfs_btree_block
*block
= obj
;
203 ASSERT(startoff
== 0);
205 if (block
->bb_level
!= 0)
207 return be16_to_cpu(block
->bb_numrecs
);
211 * Get the offset of the key at idx in a btree block.
219 struct xfs_btree_block
*block
= obj
;
220 struct xfs_db_btree
*bt
= block_to_bt(block
);
223 ASSERT(startoff
== 0);
224 ASSERT(block
->bb_level
!= 0);
226 offset
= bt
->block_len
+ (idx
- 1) * bt
->key_len
;
227 return bitize(offset
);
231 * Get the offset of the ptr at idx in a btree block.
239 struct xfs_btree_block
*block
= obj
;
240 struct xfs_db_btree
*bt
= block_to_bt(block
);
244 ASSERT(startoff
== 0);
245 ASSERT(block
->bb_level
!= 0);
247 maxrecs
= btblock_maxrecs(bt
, mp
->m_sb
.sb_blocksize
);
248 offset
= bt
->block_len
+
249 maxrecs
* bt
->key_len
+
250 (idx
- 1) * bt
->ptr_len
;
252 return bitize(offset
);
256 * Get the offset of the record at idx in a btree block.
264 struct xfs_btree_block
*block
= obj
;
265 struct xfs_db_btree
*bt
= block_to_bt(block
);
268 ASSERT(startoff
== 0);
269 ASSERT(block
->bb_level
== 0);
271 offset
= bt
->block_len
+ (idx
- 1) * bt
->rec_len
;
272 return bitize(offset
);
276 * Get the size of a btree block.
284 return bitize(mp
->m_sb
.sb_blocksize
);
292 const field_t bmapbta_hfld
[] = {
293 { "", FLDT_BMAPBTA
, OI(0), C1
, 0, TYP_NONE
},
296 const field_t bmapbtd_hfld
[] = {
297 { "", FLDT_BMAPBTD
, OI(0), C1
, 0, TYP_NONE
},
301 const field_t bmapbta_crc_hfld
[] = {
302 { "", FLDT_BMAPBTA_CRC
, OI(0), C1
, 0, TYP_NONE
},
305 const field_t bmapbtd_crc_hfld
[] = {
306 { "", FLDT_BMAPBTD_CRC
, OI(0), C1
, 0, TYP_NONE
},
310 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
311 const field_t bmapbta_flds
[] = {
312 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
313 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
314 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
315 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTA
},
316 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTA
},
317 { "recs", FLDT_BMAPBTAREC
, btblock_rec_offset
, btblock_rec_count
,
318 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
319 { "keys", FLDT_BMAPBTAKEY
, btblock_key_offset
, btblock_key_count
,
320 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
321 { "ptrs", FLDT_BMAPBTAPTR
, btblock_ptr_offset
, btblock_key_count
,
322 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTA
},
325 const field_t bmapbtd_flds
[] = {
326 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
327 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
328 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
329 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTD
},
330 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTD
},
331 { "recs", FLDT_BMAPBTDREC
, btblock_rec_offset
, btblock_rec_count
,
332 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
333 { "keys", FLDT_BMAPBTDKEY
, btblock_key_offset
, btblock_key_count
,
334 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
335 { "ptrs", FLDT_BMAPBTDPTR
, btblock_ptr_offset
, btblock_key_count
,
336 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTD
},
339 /* crc enabled versions */
340 const field_t bmapbta_crc_flds
[] = {
341 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
342 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
343 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
344 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTA
},
345 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTA
},
346 { "bno", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_blkno
)), C1
, 0, TYP_BMAPBTD
},
347 { "lsn", FLDT_UINT64X
, OI(OFF(u
.l
.bb_lsn
)), C1
, 0, TYP_NONE
},
348 { "uuid", FLDT_UUID
, OI(OFF(u
.l
.bb_uuid
)), C1
, 0, TYP_NONE
},
349 { "owner", FLDT_INO
, OI(OFF(u
.l
.bb_owner
)), C1
, 0, TYP_NONE
},
350 { "crc", FLDT_CRC
, OI(OFF(u
.l
.bb_crc
)), C1
, 0, TYP_NONE
},
351 { "recs", FLDT_BMAPBTAREC
, btblock_rec_offset
, btblock_rec_count
,
352 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
353 { "keys", FLDT_BMAPBTAKEY
, btblock_key_offset
, btblock_key_count
,
354 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
355 { "ptrs", FLDT_BMAPBTAPTR
, btblock_ptr_offset
, btblock_key_count
,
356 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTA
},
359 const field_t bmapbtd_crc_flds
[] = {
360 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
361 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
362 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
363 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTD
},
364 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTD
},
365 { "bno", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_blkno
)), C1
, 0, TYP_BMAPBTD
},
366 { "lsn", FLDT_UINT64X
, OI(OFF(u
.l
.bb_lsn
)), C1
, 0, TYP_NONE
},
367 { "uuid", FLDT_UUID
, OI(OFF(u
.l
.bb_uuid
)), C1
, 0, TYP_NONE
},
368 { "owner", FLDT_INO
, OI(OFF(u
.l
.bb_owner
)), C1
, 0, TYP_NONE
},
369 { "crc", FLDT_CRC
, OI(OFF(u
.l
.bb_crc
)), C1
, 0, TYP_NONE
},
370 { "recs", FLDT_BMAPBTDREC
, btblock_rec_offset
, btblock_rec_count
,
371 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
372 { "keys", FLDT_BMAPBTDKEY
, btblock_key_offset
, btblock_key_count
,
373 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
374 { "ptrs", FLDT_BMAPBTDPTR
, btblock_ptr_offset
, btblock_key_count
,
375 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTD
},
380 #define KOFF(f) bitize(offsetof(xfs_bmbt_key_t, br_ ## f))
381 const field_t bmapbta_key_flds
[] = {
382 { "startoff", FLDT_DFILOFFA
, OI(KOFF(startoff
)), C1
, 0, TYP_ATTR
},
385 const field_t bmapbtd_key_flds
[] = {
386 { "startoff", FLDT_DFILOFFD
, OI(KOFF(startoff
)), C1
, 0, TYP_INODATA
},
391 #define BMBT_EXNTFLAG_BITOFF 0
392 #define BMBT_STARTOFF_BITOFF (BMBT_EXNTFLAG_BITOFF + BMBT_EXNTFLAG_BITLEN)
393 #define BMBT_STARTBLOCK_BITOFF (BMBT_STARTOFF_BITOFF + BMBT_STARTOFF_BITLEN)
394 #define BMBT_BLOCKCOUNT_BITOFF \
395 (BMBT_STARTBLOCK_BITOFF + BMBT_STARTBLOCK_BITLEN)
397 const field_t bmapbta_rec_flds
[] = {
398 { "startoff", FLDT_CFILEOFFA
, OI(BMBT_STARTOFF_BITOFF
), C1
, 0,
400 { "startblock", FLDT_CFSBLOCK
, OI(BMBT_STARTBLOCK_BITOFF
), C1
, 0,
402 { "blockcount", FLDT_CEXTLEN
, OI(BMBT_BLOCKCOUNT_BITOFF
), C1
, 0,
404 { "extentflag", FLDT_CEXTFLG
, OI(BMBT_EXNTFLAG_BITOFF
), C1
, 0,
408 const field_t bmapbtd_rec_flds
[] = {
409 { "startoff", FLDT_CFILEOFFD
, OI(BMBT_STARTOFF_BITOFF
), C1
, 0,
411 { "startblock", FLDT_CFSBLOCK
, OI(BMBT_STARTBLOCK_BITOFF
), C1
, 0,
413 { "blockcount", FLDT_CEXTLEN
, OI(BMBT_BLOCKCOUNT_BITOFF
), C1
, 0,
415 { "extentflag", FLDT_CEXTFLG
, OI(BMBT_EXNTFLAG_BITOFF
), C1
, 0,
422 * Inode allocation btree.
425 const field_t inobt_hfld
[] = {
426 { "", FLDT_INOBT
, OI(0), C1
, 0, TYP_NONE
},
430 const field_t inobt_crc_hfld
[] = {
431 { "", FLDT_INOBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
435 const field_t inobt_spcrc_hfld
[] = {
436 { "", FLDT_INOBT_SPCRC
, OI(0), C1
, 0, TYP_NONE
},
440 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
441 const field_t inobt_flds
[] = {
442 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
443 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
444 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
445 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_INOBT
},
446 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_INOBT
},
447 { "recs", FLDT_INOBTREC
, btblock_rec_offset
, btblock_rec_count
,
448 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
449 { "keys", FLDT_INOBTKEY
, btblock_key_offset
, btblock_key_count
,
450 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
451 { "ptrs", FLDT_INOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
452 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_INOBT
},
455 const field_t inobt_crc_flds
[] = {
456 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
457 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
458 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
459 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_INOBT
},
460 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_INOBT
},
461 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_INOBT
},
462 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
463 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
464 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
465 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
466 { "recs", FLDT_INOBTREC
, btblock_rec_offset
, btblock_rec_count
,
467 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
468 { "keys", FLDT_INOBTKEY
, btblock_key_offset
, btblock_key_count
,
469 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
470 { "ptrs", FLDT_INOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
471 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_INOBT
},
474 const field_t inobt_spcrc_flds
[] = {
475 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
476 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
477 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
478 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_INOBT
},
479 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_INOBT
},
480 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_INOBT
},
481 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
482 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
483 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
484 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
485 { "recs", FLDT_INOBTSPREC
, btblock_rec_offset
, btblock_rec_count
,
486 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
487 { "keys", FLDT_INOBTKEY
, btblock_key_offset
, btblock_key_count
,
488 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
489 { "ptrs", FLDT_INOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
490 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_INOBT
},
496 #define KOFF(f) bitize(offsetof(xfs_inobt_key_t, ir_ ## f))
497 const field_t inobt_key_flds
[] = {
498 { "startino", FLDT_AGINO
, OI(KOFF(startino
)), C1
, 0, TYP_INODE
},
503 #define ROFF(f) bitize(offsetof(xfs_inobt_rec_t, f))
504 const field_t inobt_rec_flds
[] = {
505 { "startino", FLDT_AGINO
, OI(ROFF(ir_startino
)), C1
, 0, TYP_INODE
},
506 { "freecount", FLDT_INT32D
, OI(ROFF(ir_u
.f
.ir_freecount
)), C1
, 0, TYP_NONE
},
507 { "free", FLDT_INOFREE
, OI(ROFF(ir_free
)), C1
, 0, TYP_NONE
},
510 /* sparse inode on-disk format */
511 const field_t inobt_sprec_flds
[] = {
512 { "startino", FLDT_AGINO
, OI(ROFF(ir_startino
)), C1
, 0, TYP_INODE
},
513 { "holemask", FLDT_UINT16X
, OI(ROFF(ir_u
.sp
.ir_holemask
)), C1
, 0,
515 { "count", FLDT_UINT8D
, OI(ROFF(ir_u
.sp
.ir_count
)), C1
, 0, TYP_NONE
},
516 { "freecount", FLDT_INT8D
, OI(ROFF(ir_u
.sp
.ir_freecount
)), C1
, 0,
518 { "free", FLDT_INOFREE
, OI(ROFF(ir_free
)), C1
, 0, TYP_NONE
},
527 const field_t bnobt_hfld
[] = {
528 { "", FLDT_BNOBT
, OI(0), C1
, 0, TYP_NONE
},
532 const field_t bnobt_crc_hfld
[] = {
533 { "", FLDT_BNOBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
537 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
538 const field_t bnobt_flds
[] = {
539 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
540 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
541 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
542 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_BNOBT
},
543 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_BNOBT
},
544 { "recs", FLDT_BNOBTREC
, btblock_rec_offset
, btblock_rec_count
,
545 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
546 { "keys", FLDT_BNOBTKEY
, btblock_key_offset
, btblock_key_count
,
547 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
548 { "ptrs", FLDT_BNOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
549 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BNOBT
},
552 const field_t bnobt_crc_flds
[] = {
553 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
554 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
555 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
556 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_BNOBT
},
557 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_BNOBT
},
558 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_BNOBT
},
559 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
560 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
561 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
562 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
563 { "recs", FLDT_BNOBTREC
, btblock_rec_offset
, btblock_rec_count
,
564 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
565 { "keys", FLDT_BNOBTKEY
, btblock_key_offset
, btblock_key_count
,
566 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
567 { "ptrs", FLDT_BNOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
568 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BNOBT
},
573 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f))
574 const field_t bnobt_key_flds
[] = {
575 { "startblock", FLDT_AGBLOCK
, OI(KOFF(startblock
)), C1
, 0, TYP_DATA
},
576 { "blockcount", FLDT_EXTLEN
, OI(KOFF(blockcount
)), C1
, 0, TYP_NONE
},
581 #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f))
582 const field_t bnobt_rec_flds
[] = {
583 { "startblock", FLDT_AGBLOCK
, OI(ROFF(startblock
)), C1
, 0, TYP_DATA
},
584 { "blockcount", FLDT_EXTLEN
, OI(ROFF(blockcount
)), C1
, 0, TYP_NONE
},
589 const field_t cntbt_hfld
[] = {
590 { "", FLDT_CNTBT
, OI(0), C1
, 0, TYP_NONE
},
594 const field_t cntbt_crc_hfld
[] = {
595 { "", FLDT_CNTBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
599 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
600 const field_t cntbt_flds
[] = {
601 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
602 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
603 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
604 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_CNTBT
},
605 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_CNTBT
},
606 { "recs", FLDT_CNTBTREC
, btblock_rec_offset
, btblock_rec_count
,
607 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
608 { "keys", FLDT_CNTBTKEY
, btblock_key_offset
, btblock_key_count
,
609 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
610 { "ptrs", FLDT_CNTBTPTR
, btblock_ptr_offset
, btblock_key_count
,
611 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_CNTBT
},
614 const field_t cntbt_crc_flds
[] = {
615 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
616 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
617 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
618 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_CNTBT
},
619 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_CNTBT
},
620 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_CNTBT
},
621 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
622 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
623 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
624 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
625 { "recs", FLDT_CNTBTREC
, btblock_rec_offset
, btblock_rec_count
,
626 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
627 { "keys", FLDT_CNTBTKEY
, btblock_key_offset
, btblock_key_count
,
628 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
629 { "ptrs", FLDT_CNTBTPTR
, btblock_ptr_offset
, btblock_key_count
,
630 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_CNTBT
},
635 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f))
636 const field_t cntbt_key_flds
[] = {
637 { "blockcount", FLDT_EXTLEN
, OI(KOFF(blockcount
)), C1
, 0, TYP_NONE
},
638 { "startblock", FLDT_AGBLOCK
, OI(KOFF(startblock
)), C1
, 0, TYP_DATA
},
643 #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f))
644 const field_t cntbt_rec_flds
[] = {
645 { "startblock", FLDT_AGBLOCK
, OI(ROFF(startblock
)), C1
, 0, TYP_DATA
},
646 { "blockcount", FLDT_EXTLEN
, OI(ROFF(blockcount
)), C1
, 0, TYP_NONE
},
651 /* RMAP btree blocks */
652 const field_t rmapbt_crc_hfld
[] = {
653 { "", FLDT_RMAPBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
657 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
658 const field_t rmapbt_crc_flds
[] = {
659 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
660 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
661 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
662 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_RMAPBT
},
663 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_RMAPBT
},
664 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_RMAPBT
},
665 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
666 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
667 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
668 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
669 { "recs", FLDT_RMAPBTREC
, btblock_rec_offset
, btblock_rec_count
,
670 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
671 { "keys", FLDT_RMAPBTKEY
, btblock_key_offset
, btblock_key_count
,
672 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
673 { "ptrs", FLDT_RMAPBTPTR
, btblock_ptr_offset
, btblock_key_count
,
674 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_RMAPBT
},
679 #define KOFF(f) bitize(offsetof(struct xfs_rmap_key, rm_ ## f))
681 #define RMAPBK_STARTBLOCK_BITOFF 0
682 #define RMAPBK_OWNER_BITOFF (RMAPBK_STARTBLOCK_BITOFF + RMAPBT_STARTBLOCK_BITLEN)
683 #define RMAPBK_ATTRFLAG_BITOFF (RMAPBK_OWNER_BITOFF + RMAPBT_OWNER_BITLEN)
684 #define RMAPBK_BMBTFLAG_BITOFF (RMAPBK_ATTRFLAG_BITOFF + RMAPBT_ATTRFLAG_BITLEN)
685 #define RMAPBK_EXNTFLAG_BITOFF (RMAPBK_BMBTFLAG_BITOFF + RMAPBT_BMBTFLAG_BITLEN)
686 #define RMAPBK_UNUSED_OFFSET_BITOFF (RMAPBK_EXNTFLAG_BITOFF + RMAPBT_EXNTFLAG_BITLEN)
687 #define RMAPBK_OFFSET_BITOFF (RMAPBK_UNUSED_OFFSET_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN)
689 #define HI_KOFF(f) bitize(sizeof(struct xfs_rmap_key) + offsetof(struct xfs_rmap_key, rm_ ## f))
691 #define RMAPBK_STARTBLOCKHI_BITOFF (bitize(sizeof(struct xfs_rmap_key)))
692 #define RMAPBK_OWNERHI_BITOFF (RMAPBK_STARTBLOCKHI_BITOFF + RMAPBT_STARTBLOCK_BITLEN)
693 #define RMAPBK_ATTRFLAGHI_BITOFF (RMAPBK_OWNERHI_BITOFF + RMAPBT_OWNER_BITLEN)
694 #define RMAPBK_BMBTFLAGHI_BITOFF (RMAPBK_ATTRFLAGHI_BITOFF + RMAPBT_ATTRFLAG_BITLEN)
695 #define RMAPBK_EXNTFLAGHI_BITOFF (RMAPBK_BMBTFLAGHI_BITOFF + RMAPBT_BMBTFLAG_BITLEN)
696 #define RMAPBK_UNUSED_OFFSETHI_BITOFF (RMAPBK_EXNTFLAGHI_BITOFF + RMAPBT_EXNTFLAG_BITLEN)
697 #define RMAPBK_OFFSETHI_BITOFF (RMAPBK_UNUSED_OFFSETHI_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN)
699 const field_t rmapbt_key_flds
[] = {
700 { "startblock", FLDT_AGBLOCK
, OI(KOFF(startblock
)), C1
, 0, TYP_DATA
},
701 { "owner", FLDT_INT64D
, OI(KOFF(owner
)), C1
, 0, TYP_NONE
},
702 { "offset", FLDT_RFILEOFFD
, OI(RMAPBK_OFFSET_BITOFF
), C1
, 0, TYP_NONE
},
703 { "attrfork", FLDT_RATTRFORKFLG
, OI(RMAPBK_ATTRFLAG_BITOFF
), C1
, 0,
705 { "bmbtblock", FLDT_RBMBTFLG
, OI(RMAPBK_BMBTFLAG_BITOFF
), C1
, 0,
707 { "startblock_hi", FLDT_AGBLOCK
, OI(HI_KOFF(startblock
)), C1
, 0, TYP_DATA
},
708 { "owner_hi", FLDT_INT64D
, OI(HI_KOFF(owner
)), C1
, 0, TYP_NONE
},
709 { "offset_hi", FLDT_RFILEOFFD
, OI(RMAPBK_OFFSETHI_BITOFF
), C1
, 0, TYP_NONE
},
710 { "attrfork_hi", FLDT_RATTRFORKFLG
, OI(RMAPBK_ATTRFLAGHI_BITOFF
), C1
, 0,
712 { "bmbtblock_hi", FLDT_RBMBTFLG
, OI(RMAPBK_BMBTFLAGHI_BITOFF
), C1
, 0,
719 #define RMAPBT_STARTBLOCK_BITOFF 0
720 #define RMAPBT_BLOCKCOUNT_BITOFF (RMAPBT_STARTBLOCK_BITOFF + RMAPBT_STARTBLOCK_BITLEN)
721 #define RMAPBT_OWNER_BITOFF (RMAPBT_BLOCKCOUNT_BITOFF + RMAPBT_BLOCKCOUNT_BITLEN)
722 #define RMAPBT_ATTRFLAG_BITOFF (RMAPBT_OWNER_BITOFF + RMAPBT_OWNER_BITLEN)
723 #define RMAPBT_BMBTFLAG_BITOFF (RMAPBT_ATTRFLAG_BITOFF + RMAPBT_ATTRFLAG_BITLEN)
724 #define RMAPBT_EXNTFLAG_BITOFF (RMAPBT_BMBTFLAG_BITOFF + RMAPBT_BMBTFLAG_BITLEN)
725 #define RMAPBT_UNUSED_OFFSET_BITOFF (RMAPBT_EXNTFLAG_BITOFF + RMAPBT_EXNTFLAG_BITLEN)
726 #define RMAPBT_OFFSET_BITOFF (RMAPBT_UNUSED_OFFSET_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN)
728 const field_t rmapbt_rec_flds
[] = {
729 { "startblock", FLDT_AGBLOCK
, OI(RMAPBT_STARTBLOCK_BITOFF
), C1
, 0, TYP_DATA
},
730 { "blockcount", FLDT_REXTLEN
, OI(RMAPBT_BLOCKCOUNT_BITOFF
), C1
, 0, TYP_NONE
},
731 { "owner", FLDT_INT64D
, OI(RMAPBT_OWNER_BITOFF
), C1
, 0, TYP_NONE
},
732 { "offset", FLDT_RFILEOFFD
, OI(RMAPBT_OFFSET_BITOFF
), C1
, 0, TYP_NONE
},
733 { "extentflag", FLDT_REXTFLG
, OI(RMAPBT_EXNTFLAG_BITOFF
), C1
, 0,
735 { "attrfork", FLDT_RATTRFORKFLG
, OI(RMAPBT_ATTRFLAG_BITOFF
), C1
, 0,
737 { "bmbtblock", FLDT_RBMBTFLG
, OI(RMAPBT_BMBTFLAG_BITOFF
), C1
, 0,
742 /* refcount btree blocks */
743 const field_t refcbt_crc_hfld
[] = {
744 { "", FLDT_REFCBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
748 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
749 const field_t refcbt_crc_flds
[] = {
750 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
751 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
752 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
753 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_REFCBT
},
754 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_REFCBT
},
755 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_REFCBT
},
756 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
757 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
758 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
759 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
760 { "recs", FLDT_REFCBTREC
, btblock_rec_offset
, btblock_rec_count
,
761 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
762 { "keys", FLDT_REFCBTKEY
, btblock_key_offset
, btblock_key_count
,
763 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
764 { "ptrs", FLDT_REFCBTPTR
, btblock_ptr_offset
, btblock_key_count
,
765 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_REFCBT
},
770 #define REFCNTBT_COWFLAG_BITOFF 0
771 #define REFCNTBT_STARTBLOCK_BITOFF (REFCNTBT_COWFLAG_BITOFF + REFCNTBT_COWFLAG_BITLEN)
773 const field_t refcbt_key_flds
[] = {
774 { "startblock", FLDT_CAGBLOCK
, OI(REFCNTBT_STARTBLOCK_BITOFF
), C1
, 0, TYP_DATA
},
775 { "cowflag", FLDT_CCOWFLG
, OI(REFCNTBT_COWFLAG_BITOFF
), C1
, 0, TYP_DATA
},
779 #define ROFF(f) bitize(offsetof(struct xfs_refcount_rec, rc_ ## f))
780 const field_t refcbt_rec_flds
[] = {
781 { "startblock", FLDT_CAGBLOCK
, OI(REFCNTBT_STARTBLOCK_BITOFF
), C1
, 0, TYP_DATA
},
782 { "blockcount", FLDT_EXTLEN
, OI(ROFF(blockcount
)), C1
, 0, TYP_NONE
},
783 { "refcount", FLDT_UINT32D
, OI(ROFF(refcount
)), C1
, 0, TYP_DATA
},
784 { "cowflag", FLDT_CCOWFLG
, OI(REFCNTBT_COWFLAG_BITOFF
), C1
, 0, TYP_DATA
},