]>
git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - db/btblock.c
2 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #include <xfs/libxfs.h>
30 * Definition of the possible btree block layouts.
41 sizeof(xfs_bmbt_key_t
),
42 sizeof(xfs_bmbt_rec_t
),
47 sizeof(xfs_alloc_key_t
),
48 sizeof(xfs_alloc_rec_t
),
53 sizeof(xfs_alloc_key_t
),
54 sizeof(xfs_alloc_rec_t
),
59 sizeof(xfs_inobt_key_t
),
60 sizeof(xfs_inobt_rec_t
),
65 sizeof(xfs_inobt_key_t
),
66 sizeof(xfs_inobt_rec_t
),
70 XFS_BTREE_LBLOCK_CRC_LEN
,
71 sizeof(xfs_bmbt_key_t
),
72 sizeof(xfs_bmbt_rec_t
),
76 XFS_BTREE_SBLOCK_CRC_LEN
,
77 sizeof(xfs_alloc_key_t
),
78 sizeof(xfs_alloc_rec_t
),
82 XFS_BTREE_SBLOCK_CRC_LEN
,
83 sizeof(xfs_alloc_key_t
),
84 sizeof(xfs_alloc_rec_t
),
88 XFS_BTREE_SBLOCK_CRC_LEN
,
89 sizeof(xfs_inobt_key_t
),
90 sizeof(xfs_inobt_rec_t
),
94 XFS_BTREE_SBLOCK_CRC_LEN
,
95 sizeof(xfs_inobt_key_t
),
96 sizeof(xfs_inobt_rec_t
),
104 * Find the right block defintion for a given ondisk block.
106 * We use the least significant bit of the magic number as index into
107 * the array of block defintions.
109 static struct xfs_db_btree
*
111 struct xfs_btree_block
*bb
)
113 struct xfs_db_btree
*btp
= &btrees
[0];
116 if (be32_to_cpu((bb
)->bb_magic
) == btp
->magic
)
119 } while (btp
->magic
!= 0);
124 /* calculate max records. Only for non-leaves. */
126 btblock_maxrecs(struct xfs_db_btree
*bt
, int blocksize
)
128 blocksize
-= bt
->block_len
;
130 return blocksize
/ (bt
->key_len
+ bt
->ptr_len
);
134 * Get the number of keys in a btree block.
136 * Note: can also be used to get the number of ptrs because there are
137 * always the same number of keys and ptrs in a block.
144 struct xfs_btree_block
*block
= obj
;
146 ASSERT(startoff
== 0);
148 if (block
->bb_level
== 0)
150 return be16_to_cpu(block
->bb_numrecs
);
154 * Get the number of keys in a btree block.
161 struct xfs_btree_block
*block
= obj
;
163 ASSERT(startoff
== 0);
165 if (block
->bb_level
!= 0)
167 return be16_to_cpu(block
->bb_numrecs
);
171 * Get the offset of the key at idx in a btree block.
179 struct xfs_btree_block
*block
= obj
;
180 struct xfs_db_btree
*bt
= block_to_bt(block
);
183 ASSERT(startoff
== 0);
184 ASSERT(block
->bb_level
!= 0);
186 offset
= bt
->block_len
+ (idx
- 1) * bt
->key_len
;
187 return bitize(offset
);
191 * Get the offset of the ptr at idx in a btree block.
199 struct xfs_btree_block
*block
= obj
;
200 struct xfs_db_btree
*bt
= block_to_bt(block
);
204 ASSERT(startoff
== 0);
205 ASSERT(block
->bb_level
!= 0);
207 maxrecs
= btblock_maxrecs(bt
, mp
->m_sb
.sb_blocksize
);
208 offset
= bt
->block_len
+
209 maxrecs
* bt
->key_len
+
210 (idx
- 1) * bt
->ptr_len
;
212 return bitize(offset
);
216 * Get the offset of the record at idx in a btree block.
224 struct xfs_btree_block
*block
= obj
;
225 struct xfs_db_btree
*bt
= block_to_bt(block
);
228 ASSERT(startoff
== 0);
229 ASSERT(block
->bb_level
== 0);
231 offset
= bt
->block_len
+ (idx
- 1) * bt
->rec_len
;
232 return bitize(offset
);
236 * Get the size of a btree block.
244 return bitize(mp
->m_sb
.sb_blocksize
);
252 const field_t bmapbta_hfld
[] = {
253 { "", FLDT_BMAPBTA
, OI(0), C1
, 0, TYP_NONE
},
256 const field_t bmapbtd_hfld
[] = {
257 { "", FLDT_BMAPBTD
, OI(0), C1
, 0, TYP_NONE
},
261 const field_t bmapbta_crc_hfld
[] = {
262 { "", FLDT_BMAPBTA_CRC
, OI(0), C1
, 0, TYP_NONE
},
265 const field_t bmapbtd_crc_hfld
[] = {
266 { "", FLDT_BMAPBTD_CRC
, OI(0), C1
, 0, TYP_NONE
},
270 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
271 const field_t bmapbta_flds
[] = {
272 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
273 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
274 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
275 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTA
},
276 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTA
},
277 { "recs", FLDT_BMAPBTAREC
, btblock_rec_offset
, btblock_rec_count
,
278 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
279 { "keys", FLDT_BMAPBTAKEY
, btblock_key_offset
, btblock_key_count
,
280 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
281 { "ptrs", FLDT_BMAPBTAPTR
, btblock_ptr_offset
, btblock_key_count
,
282 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTA
},
285 const field_t bmapbtd_flds
[] = {
286 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
287 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
288 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
289 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTD
},
290 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTD
},
291 { "recs", FLDT_BMAPBTDREC
, btblock_rec_offset
, btblock_rec_count
,
292 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
293 { "keys", FLDT_BMAPBTDKEY
, btblock_key_offset
, btblock_key_count
,
294 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
295 { "ptrs", FLDT_BMAPBTDPTR
, btblock_ptr_offset
, btblock_key_count
,
296 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTD
},
299 /* crc enabled versions */
300 const field_t bmapbta_crc_flds
[] = {
301 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
302 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
303 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
304 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTA
},
305 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTA
},
306 { "bno", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_blkno
)), C1
, 0, TYP_BMAPBTD
},
307 { "lsn", FLDT_UINT64X
, OI(OFF(u
.l
.bb_lsn
)), C1
, 0, TYP_NONE
},
308 { "uuid", FLDT_UUID
, OI(OFF(u
.l
.bb_uuid
)), C1
, 0, TYP_NONE
},
309 { "owner", FLDT_INO
, OI(OFF(u
.l
.bb_owner
)), C1
, 0, TYP_NONE
},
310 { "crc", FLDT_CRC
, OI(OFF(u
.l
.bb_crc
)), C1
, 0, TYP_NONE
},
311 { "recs", FLDT_BMAPBTAREC
, btblock_rec_offset
, btblock_rec_count
,
312 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
313 { "keys", FLDT_BMAPBTAKEY
, btblock_key_offset
, btblock_key_count
,
314 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
315 { "ptrs", FLDT_BMAPBTAPTR
, btblock_ptr_offset
, btblock_key_count
,
316 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTA
},
319 const field_t bmapbtd_crc_flds
[] = {
320 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
321 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
322 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
323 { "leftsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_leftsib
)), C1
, 0, TYP_BMAPBTD
},
324 { "rightsib", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_rightsib
)), C1
, 0, TYP_BMAPBTD
},
325 { "bno", FLDT_DFSBNO
, OI(OFF(u
.l
.bb_blkno
)), C1
, 0, TYP_BMAPBTD
},
326 { "lsn", FLDT_UINT64X
, OI(OFF(u
.l
.bb_lsn
)), C1
, 0, TYP_NONE
},
327 { "uuid", FLDT_UUID
, OI(OFF(u
.l
.bb_uuid
)), C1
, 0, TYP_NONE
},
328 { "owner", FLDT_INO
, OI(OFF(u
.l
.bb_owner
)), C1
, 0, TYP_NONE
},
329 { "crc", FLDT_CRC
, OI(OFF(u
.l
.bb_crc
)), C1
, 0, TYP_NONE
},
330 { "recs", FLDT_BMAPBTDREC
, btblock_rec_offset
, btblock_rec_count
,
331 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
332 { "keys", FLDT_BMAPBTDKEY
, btblock_key_offset
, btblock_key_count
,
333 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
334 { "ptrs", FLDT_BMAPBTDPTR
, btblock_ptr_offset
, btblock_key_count
,
335 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BMAPBTD
},
340 #define KOFF(f) bitize(offsetof(xfs_bmbt_key_t, br_ ## f))
341 const field_t bmapbta_key_flds
[] = {
342 { "startoff", FLDT_DFILOFFA
, OI(KOFF(startoff
)), C1
, 0, TYP_ATTR
},
345 const field_t bmapbtd_key_flds
[] = {
346 { "startoff", FLDT_DFILOFFD
, OI(KOFF(startoff
)), C1
, 0, TYP_INODATA
},
351 #define BMBT_EXNTFLAG_BITOFF 0
352 #define BMBT_STARTOFF_BITOFF (BMBT_EXNTFLAG_BITOFF + BMBT_EXNTFLAG_BITLEN)
353 #define BMBT_STARTBLOCK_BITOFF (BMBT_STARTOFF_BITOFF + BMBT_STARTOFF_BITLEN)
354 #define BMBT_BLOCKCOUNT_BITOFF \
355 (BMBT_STARTBLOCK_BITOFF + BMBT_STARTBLOCK_BITLEN)
357 const field_t bmapbta_rec_flds
[] = {
358 { "startoff", FLDT_CFILEOFFA
, OI(BMBT_STARTOFF_BITOFF
), C1
, 0,
360 { "startblock", FLDT_CFSBLOCK
, OI(BMBT_STARTBLOCK_BITOFF
), C1
, 0,
362 { "blockcount", FLDT_CEXTLEN
, OI(BMBT_BLOCKCOUNT_BITOFF
), C1
, 0,
364 { "extentflag", FLDT_CEXTFLG
, OI(BMBT_EXNTFLAG_BITOFF
), C1
, 0,
368 const field_t bmapbtd_rec_flds
[] = {
369 { "startoff", FLDT_CFILEOFFD
, OI(BMBT_STARTOFF_BITOFF
), C1
, 0,
371 { "startblock", FLDT_CFSBLOCK
, OI(BMBT_STARTBLOCK_BITOFF
), C1
, 0,
373 { "blockcount", FLDT_CEXTLEN
, OI(BMBT_BLOCKCOUNT_BITOFF
), C1
, 0,
375 { "extentflag", FLDT_CEXTFLG
, OI(BMBT_EXNTFLAG_BITOFF
), C1
, 0,
382 * Inode allocation btree.
385 const field_t inobt_hfld
[] = {
386 { "", FLDT_INOBT
, OI(0), C1
, 0, TYP_NONE
},
390 const field_t inobt_crc_hfld
[] = {
391 { "", FLDT_INOBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
395 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
396 const field_t inobt_flds
[] = {
397 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
398 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
399 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
400 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_INOBT
},
401 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_INOBT
},
402 { "recs", FLDT_INOBTREC
, btblock_rec_offset
, btblock_rec_count
,
403 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
404 { "keys", FLDT_INOBTKEY
, btblock_key_offset
, btblock_key_count
,
405 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
406 { "ptrs", FLDT_INOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
407 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_INOBT
},
410 const field_t inobt_crc_flds
[] = {
411 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
412 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
413 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
414 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_INOBT
},
415 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_INOBT
},
416 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_INOBT
},
417 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
418 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
419 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
420 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
421 { "recs", FLDT_INOBTREC
, btblock_rec_offset
, btblock_rec_count
,
422 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
423 { "keys", FLDT_INOBTKEY
, btblock_key_offset
, btblock_key_count
,
424 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
425 { "ptrs", FLDT_INOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
426 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_INOBT
},
431 #define KOFF(f) bitize(offsetof(xfs_inobt_key_t, ir_ ## f))
432 const field_t inobt_key_flds
[] = {
433 { "startino", FLDT_AGINO
, OI(KOFF(startino
)), C1
, 0, TYP_INODE
},
438 #define ROFF(f) bitize(offsetof(xfs_inobt_rec_t, f))
439 const field_t inobt_rec_flds
[] = {
440 { "startino", FLDT_AGINO
, OI(ROFF(ir_startino
)), C1
, 0, TYP_INODE
},
441 { "freecount", FLDT_INT32D
, OI(ROFF(ir_u
.f
.ir_freecount
)), C1
, 0, TYP_NONE
},
442 { "free", FLDT_INOFREE
, OI(ROFF(ir_free
)), C1
, 0, TYP_NONE
},
451 const field_t bnobt_hfld
[] = {
452 { "", FLDT_BNOBT
, OI(0), C1
, 0, TYP_NONE
},
456 const field_t bnobt_crc_hfld
[] = {
457 { "", FLDT_BNOBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
461 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
462 const field_t bnobt_flds
[] = {
463 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
464 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
465 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
466 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_BNOBT
},
467 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_BNOBT
},
468 { "recs", FLDT_BNOBTREC
, btblock_rec_offset
, btblock_rec_count
,
469 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
470 { "keys", FLDT_BNOBTKEY
, btblock_key_offset
, btblock_key_count
,
471 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
472 { "ptrs", FLDT_BNOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
473 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BNOBT
},
476 const field_t bnobt_crc_flds
[] = {
477 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
478 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
479 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
480 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_BNOBT
},
481 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_BNOBT
},
482 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_BNOBT
},
483 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
484 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
485 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
486 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
487 { "recs", FLDT_BNOBTREC
, btblock_rec_offset
, btblock_rec_count
,
488 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
489 { "keys", FLDT_BNOBTKEY
, btblock_key_offset
, btblock_key_count
,
490 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
491 { "ptrs", FLDT_BNOBTPTR
, btblock_ptr_offset
, btblock_key_count
,
492 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_BNOBT
},
497 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f))
498 const field_t bnobt_key_flds
[] = {
499 { "startblock", FLDT_AGBLOCK
, OI(KOFF(startblock
)), C1
, 0, TYP_DATA
},
500 { "blockcount", FLDT_EXTLEN
, OI(KOFF(blockcount
)), C1
, 0, TYP_NONE
},
505 #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f))
506 const field_t bnobt_rec_flds
[] = {
507 { "startblock", FLDT_AGBLOCK
, OI(ROFF(startblock
)), C1
, 0, TYP_DATA
},
508 { "blockcount", FLDT_EXTLEN
, OI(ROFF(blockcount
)), C1
, 0, TYP_NONE
},
513 const field_t cntbt_hfld
[] = {
514 { "", FLDT_CNTBT
, OI(0), C1
, 0, TYP_NONE
},
518 const field_t cntbt_crc_hfld
[] = {
519 { "", FLDT_CNTBT_CRC
, OI(0), C1
, 0, TYP_NONE
},
523 #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f))
524 const field_t cntbt_flds
[] = {
525 { "magic", FLDT_UINT32X
, OI(OFF(magic
)), C1
, 0, TYP_NONE
},
526 { "level", FLDT_UINT16D
, OI(OFF(level
)), C1
, 0, TYP_NONE
},
527 { "numrecs", FLDT_UINT16D
, OI(OFF(numrecs
)), C1
, 0, TYP_NONE
},
528 { "leftsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_leftsib
)), C1
, 0, TYP_CNTBT
},
529 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_CNTBT
},
530 { "recs", FLDT_CNTBTREC
, btblock_rec_offset
, btblock_rec_count
,
531 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
532 { "keys", FLDT_CNTBTKEY
, btblock_key_offset
, btblock_key_count
,
533 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
534 { "ptrs", FLDT_CNTBTPTR
, btblock_ptr_offset
, btblock_key_count
,
535 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_CNTBT
},
538 const field_t cntbt_crc_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_CNTBT
},
543 { "rightsib", FLDT_AGBLOCK
, OI(OFF(u
.s
.bb_rightsib
)), C1
, 0, TYP_CNTBT
},
544 { "bno", FLDT_DFSBNO
, OI(OFF(u
.s
.bb_blkno
)), C1
, 0, TYP_CNTBT
},
545 { "lsn", FLDT_UINT64X
, OI(OFF(u
.s
.bb_lsn
)), C1
, 0, TYP_NONE
},
546 { "uuid", FLDT_UUID
, OI(OFF(u
.s
.bb_uuid
)), C1
, 0, TYP_NONE
},
547 { "owner", FLDT_AGNUMBER
, OI(OFF(u
.s
.bb_owner
)), C1
, 0, TYP_NONE
},
548 { "crc", FLDT_CRC
, OI(OFF(u
.s
.bb_crc
)), C1
, 0, TYP_NONE
},
549 { "recs", FLDT_CNTBTREC
, btblock_rec_offset
, btblock_rec_count
,
550 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
551 { "keys", FLDT_CNTBTKEY
, btblock_key_offset
, btblock_key_count
,
552 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_NONE
},
553 { "ptrs", FLDT_CNTBTPTR
, btblock_ptr_offset
, btblock_key_count
,
554 FLD_ARRAY
|FLD_ABASE1
|FLD_COUNT
|FLD_OFFSET
, TYP_CNTBT
},
559 #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f))
560 const field_t cntbt_key_flds
[] = {
561 { "blockcount", FLDT_EXTLEN
, OI(KOFF(blockcount
)), C1
, 0, TYP_NONE
},
562 { "startblock", FLDT_AGBLOCK
, OI(KOFF(startblock
)), C1
, 0, TYP_DATA
},
567 #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f))
568 const field_t cntbt_rec_flds
[] = {
569 { "startblock", FLDT_AGBLOCK
, OI(ROFF(startblock
)), C1
, 0, TYP_DATA
},
570 { "blockcount", FLDT_EXTLEN
, OI(ROFF(blockcount
)), C1
, 0, TYP_NONE
},