]>
Commit | Line | Data |
---|---|---|
49b31417 BN |
1 | /* |
2 | * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. | |
3 | * All Rights Reserved. | |
4 | * | |
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. | |
8 | * | |
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. | |
13 | * | |
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 | |
17 | */ | |
18 | ||
6b803e5a | 19 | #include "libxfs.h" |
49b31417 BN |
20 | #include "type.h" |
21 | #include "faddr.h" | |
22 | #include "fprint.h" | |
23 | #include "field.h" | |
24 | #include "btblock.h" | |
25 | #include "print.h" | |
26 | #include "bit.h" | |
27 | #include "init.h" | |
28 | ||
49b31417 BN |
29 | /* |
30 | * Definition of the possible btree block layouts. | |
31 | */ | |
32 | struct xfs_db_btree { | |
4e503735 | 33 | uint32_t magic; |
49b31417 BN |
34 | size_t block_len; |
35 | size_t key_len; | |
36 | size_t rec_len; | |
37 | size_t ptr_len; | |
38 | } btrees[] = { | |
4e503735 | 39 | { XFS_BMAP_MAGIC, |
b3563c19 | 40 | XFS_BTREE_LBLOCK_LEN, |
49b31417 BN |
41 | sizeof(xfs_bmbt_key_t), |
42 | sizeof(xfs_bmbt_rec_t), | |
43 | sizeof(__be64), | |
44 | }, | |
4e503735 | 45 | { XFS_ABTB_MAGIC, |
b3563c19 | 46 | XFS_BTREE_SBLOCK_LEN, |
49b31417 BN |
47 | sizeof(xfs_alloc_key_t), |
48 | sizeof(xfs_alloc_rec_t), | |
49 | sizeof(__be32), | |
50 | }, | |
4e503735 | 51 | { XFS_ABTC_MAGIC, |
b3563c19 | 52 | XFS_BTREE_SBLOCK_LEN, |
49b31417 BN |
53 | sizeof(xfs_alloc_key_t), |
54 | sizeof(xfs_alloc_rec_t), | |
55 | sizeof(__be32), | |
56 | }, | |
4e503735 | 57 | { XFS_IBT_MAGIC, |
b3563c19 | 58 | XFS_BTREE_SBLOCK_LEN, |
49b31417 BN |
59 | sizeof(xfs_inobt_key_t), |
60 | sizeof(xfs_inobt_rec_t), | |
61 | sizeof(__be32), | |
62 | }, | |
2a0cd7ad BF |
63 | { XFS_FIBT_MAGIC, |
64 | XFS_BTREE_SBLOCK_LEN, | |
65 | sizeof(xfs_inobt_key_t), | |
66 | sizeof(xfs_inobt_rec_t), | |
67 | sizeof(__be32), | |
68 | }, | |
4e503735 | 69 | { XFS_BMAP_CRC_MAGIC, |
c2907bd7 DC |
70 | XFS_BTREE_LBLOCK_CRC_LEN, |
71 | sizeof(xfs_bmbt_key_t), | |
72 | sizeof(xfs_bmbt_rec_t), | |
73 | sizeof(__be64), | |
74 | }, | |
4e503735 | 75 | { XFS_ABTB_CRC_MAGIC, |
c2907bd7 DC |
76 | XFS_BTREE_SBLOCK_CRC_LEN, |
77 | sizeof(xfs_alloc_key_t), | |
78 | sizeof(xfs_alloc_rec_t), | |
79 | sizeof(__be32), | |
80 | }, | |
4e503735 | 81 | { XFS_ABTC_CRC_MAGIC, |
c2907bd7 DC |
82 | XFS_BTREE_SBLOCK_CRC_LEN, |
83 | sizeof(xfs_alloc_key_t), | |
84 | sizeof(xfs_alloc_rec_t), | |
85 | sizeof(__be32), | |
86 | }, | |
4e503735 | 87 | { XFS_IBT_CRC_MAGIC, |
c2907bd7 DC |
88 | XFS_BTREE_SBLOCK_CRC_LEN, |
89 | sizeof(xfs_inobt_key_t), | |
90 | sizeof(xfs_inobt_rec_t), | |
91 | sizeof(__be32), | |
92 | }, | |
2a0cd7ad BF |
93 | { XFS_FIBT_CRC_MAGIC, |
94 | XFS_BTREE_SBLOCK_CRC_LEN, | |
95 | sizeof(xfs_inobt_key_t), | |
96 | sizeof(xfs_inobt_rec_t), | |
97 | sizeof(__be32), | |
98 | }, | |
a9d7b986 DW |
99 | { XFS_RMAP_CRC_MAGIC, |
100 | XFS_BTREE_SBLOCK_CRC_LEN, | |
101 | 2 * sizeof(struct xfs_rmap_key), | |
102 | sizeof(struct xfs_rmap_rec), | |
103 | sizeof(__be32), | |
104 | }, | |
4e503735 DC |
105 | { 0, |
106 | }, | |
49b31417 BN |
107 | }; |
108 | ||
109 | /* | |
110 | * Find the right block defintion for a given ondisk block. | |
111 | * | |
112 | * We use the least significant bit of the magic number as index into | |
113 | * the array of block defintions. | |
114 | */ | |
4e503735 DC |
115 | static struct xfs_db_btree * |
116 | block_to_bt( | |
117 | struct xfs_btree_block *bb) | |
118 | { | |
119 | struct xfs_db_btree *btp = &btrees[0]; | |
120 | ||
121 | do { | |
122 | if (be32_to_cpu((bb)->bb_magic) == btp->magic) | |
123 | return btp; | |
124 | btp++; | |
125 | } while (btp->magic != 0); | |
126 | ||
127 | return NULL; | |
128 | } | |
49b31417 BN |
129 | |
130 | /* calculate max records. Only for non-leaves. */ | |
131 | static int | |
132 | btblock_maxrecs(struct xfs_db_btree *bt, int blocksize) | |
133 | { | |
134 | blocksize -= bt->block_len; | |
135 | ||
136 | return blocksize / (bt->key_len + bt->ptr_len); | |
137 | } | |
138 | ||
139 | /* | |
140 | * Get the number of keys in a btree block. | |
141 | * | |
142 | * Note: can also be used to get the number of ptrs because there are | |
143 | * always the same number of keys and ptrs in a block. | |
144 | */ | |
145 | static int | |
146 | btblock_key_count( | |
147 | void *obj, | |
148 | int startoff) | |
149 | { | |
150 | struct xfs_btree_block *block = obj; | |
151 | ||
152 | ASSERT(startoff == 0); | |
153 | ||
154 | if (block->bb_level == 0) | |
155 | return 0; | |
156 | return be16_to_cpu(block->bb_numrecs); | |
157 | } | |
158 | ||
159 | /* | |
160 | * Get the number of keys in a btree block. | |
161 | */ | |
162 | static int | |
163 | btblock_rec_count( | |
164 | void *obj, | |
165 | int startoff) | |
166 | { | |
167 | struct xfs_btree_block *block = obj; | |
168 | ||
169 | ASSERT(startoff == 0); | |
170 | ||
171 | if (block->bb_level != 0) | |
172 | return 0; | |
173 | return be16_to_cpu(block->bb_numrecs); | |
174 | } | |
175 | ||
176 | /* | |
177 | * Get the offset of the key at idx in a btree block. | |
178 | */ | |
179 | static int | |
180 | btblock_key_offset( | |
181 | void *obj, | |
182 | int startoff, | |
183 | int idx) | |
184 | { | |
185 | struct xfs_btree_block *block = obj; | |
186 | struct xfs_db_btree *bt = block_to_bt(block); | |
187 | int offset; | |
188 | ||
189 | ASSERT(startoff == 0); | |
190 | ASSERT(block->bb_level != 0); | |
191 | ||
192 | offset = bt->block_len + (idx - 1) * bt->key_len; | |
193 | return bitize(offset); | |
194 | } | |
195 | ||
196 | /* | |
197 | * Get the offset of the ptr at idx in a btree block. | |
198 | */ | |
199 | static int | |
200 | btblock_ptr_offset( | |
201 | void *obj, | |
202 | int startoff, | |
203 | int idx) | |
204 | { | |
205 | struct xfs_btree_block *block = obj; | |
206 | struct xfs_db_btree *bt = block_to_bt(block); | |
207 | int offset; | |
208 | int maxrecs; | |
209 | ||
210 | ASSERT(startoff == 0); | |
211 | ASSERT(block->bb_level != 0); | |
212 | ||
213 | maxrecs = btblock_maxrecs(bt, mp->m_sb.sb_blocksize); | |
214 | offset = bt->block_len + | |
215 | maxrecs * bt->key_len + | |
216 | (idx - 1) * bt->ptr_len; | |
217 | ||
218 | return bitize(offset); | |
219 | } | |
220 | ||
221 | /* | |
222 | * Get the offset of the record at idx in a btree block. | |
223 | */ | |
224 | static int | |
225 | btblock_rec_offset( | |
226 | void *obj, | |
227 | int startoff, | |
228 | int idx) | |
229 | { | |
230 | struct xfs_btree_block *block = obj; | |
231 | struct xfs_db_btree *bt = block_to_bt(block); | |
232 | int offset; | |
233 | ||
234 | ASSERT(startoff == 0); | |
235 | ASSERT(block->bb_level == 0); | |
236 | ||
237 | offset = bt->block_len + (idx - 1) * bt->rec_len; | |
238 | return bitize(offset); | |
239 | } | |
240 | ||
241 | /* | |
242 | * Get the size of a btree block. | |
243 | */ | |
244 | int | |
245 | btblock_size( | |
246 | void *obj, | |
247 | int startoff, | |
248 | int idx) | |
249 | { | |
250 | return bitize(mp->m_sb.sb_blocksize); | |
251 | } | |
252 | ||
253 | ||
254 | /* | |
255 | * Bmap btree. | |
256 | */ | |
257 | ||
258 | const field_t bmapbta_hfld[] = { | |
259 | { "", FLDT_BMAPBTA, OI(0), C1, 0, TYP_NONE }, | |
260 | { NULL } | |
261 | }; | |
262 | const field_t bmapbtd_hfld[] = { | |
263 | { "", FLDT_BMAPBTD, OI(0), C1, 0, TYP_NONE }, | |
264 | { NULL } | |
265 | }; | |
266 | ||
c2907bd7 DC |
267 | const field_t bmapbta_crc_hfld[] = { |
268 | { "", FLDT_BMAPBTA_CRC, OI(0), C1, 0, TYP_NONE }, | |
269 | { NULL } | |
270 | }; | |
271 | const field_t bmapbtd_crc_hfld[] = { | |
272 | { "", FLDT_BMAPBTD_CRC, OI(0), C1, 0, TYP_NONE }, | |
273 | { NULL } | |
274 | }; | |
275 | ||
b3563c19 | 276 | #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) |
49b31417 BN |
277 | const field_t bmapbta_flds[] = { |
278 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
279 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
280 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
b3563c19 BN |
281 | { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTA }, |
282 | { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTA }, | |
49b31417 BN |
283 | { "recs", FLDT_BMAPBTAREC, btblock_rec_offset, btblock_rec_count, |
284 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
285 | { "keys", FLDT_BMAPBTAKEY, btblock_key_offset, btblock_key_count, | |
286 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
287 | { "ptrs", FLDT_BMAPBTAPTR, btblock_ptr_offset, btblock_key_count, | |
288 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTA }, | |
289 | { NULL } | |
290 | }; | |
291 | const field_t bmapbtd_flds[] = { | |
292 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
293 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
294 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
c77d2d02 CH |
295 | { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTD }, |
296 | { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTD }, | |
49b31417 BN |
297 | { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, |
298 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
299 | { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, | |
300 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
301 | { "ptrs", FLDT_BMAPBTDPTR, btblock_ptr_offset, btblock_key_count, | |
302 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, | |
303 | { NULL } | |
304 | }; | |
c2907bd7 DC |
305 | /* crc enabled versions */ |
306 | const field_t bmapbta_crc_flds[] = { | |
307 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
308 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
309 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
310 | { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_BMAPBTA }, | |
311 | { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_BMAPBTA }, | |
312 | { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, | |
313 | { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, | |
314 | { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, | |
315 | { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, | |
0522f1cc | 316 | { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, |
c2907bd7 DC |
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 }, | |
323 | { NULL } | |
324 | }; | |
325 | const field_t bmapbtd_crc_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 | { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_BMAPBTD }, | |
332 | { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, | |
333 | { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, | |
334 | { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, | |
0522f1cc | 335 | { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, |
c2907bd7 DC |
336 | { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, |
337 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
338 | { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, | |
339 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
340 | { "ptrs", FLDT_BMAPBTDPTR, btblock_ptr_offset, btblock_key_count, | |
341 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD }, | |
342 | { NULL } | |
343 | }; | |
49b31417 BN |
344 | #undef OFF |
345 | ||
346 | #define KOFF(f) bitize(offsetof(xfs_bmbt_key_t, br_ ## f)) | |
347 | const field_t bmapbta_key_flds[] = { | |
348 | { "startoff", FLDT_DFILOFFA, OI(KOFF(startoff)), C1, 0, TYP_ATTR }, | |
349 | { NULL } | |
350 | }; | |
351 | const field_t bmapbtd_key_flds[] = { | |
352 | { "startoff", FLDT_DFILOFFD, OI(KOFF(startoff)), C1, 0, TYP_INODATA }, | |
353 | { NULL } | |
354 | }; | |
355 | #undef KOFF | |
356 | ||
49b31417 BN |
357 | #define BMBT_EXNTFLAG_BITOFF 0 |
358 | #define BMBT_STARTOFF_BITOFF (BMBT_EXNTFLAG_BITOFF + BMBT_EXNTFLAG_BITLEN) | |
359 | #define BMBT_STARTBLOCK_BITOFF (BMBT_STARTOFF_BITOFF + BMBT_STARTOFF_BITLEN) | |
360 | #define BMBT_BLOCKCOUNT_BITOFF \ | |
361 | (BMBT_STARTBLOCK_BITOFF + BMBT_STARTBLOCK_BITLEN) | |
362 | ||
49b31417 BN |
363 | const field_t bmapbta_rec_flds[] = { |
364 | { "startoff", FLDT_CFILEOFFA, OI(BMBT_STARTOFF_BITOFF), C1, 0, | |
365 | TYP_ATTR }, | |
366 | { "startblock", FLDT_CFSBLOCK, OI(BMBT_STARTBLOCK_BITOFF), C1, 0, | |
367 | TYP_ATTR }, | |
368 | { "blockcount", FLDT_CEXTLEN, OI(BMBT_BLOCKCOUNT_BITOFF), C1, 0, | |
369 | TYP_NONE }, | |
370 | { "extentflag", FLDT_CEXTFLG, OI(BMBT_EXNTFLAG_BITOFF), C1, 0, | |
371 | TYP_NONE }, | |
372 | { NULL } | |
373 | }; | |
374 | const field_t bmapbtd_rec_flds[] = { | |
375 | { "startoff", FLDT_CFILEOFFD, OI(BMBT_STARTOFF_BITOFF), C1, 0, | |
376 | TYP_INODATA }, | |
377 | { "startblock", FLDT_CFSBLOCK, OI(BMBT_STARTBLOCK_BITOFF), C1, 0, | |
378 | TYP_INODATA }, | |
379 | { "blockcount", FLDT_CEXTLEN, OI(BMBT_BLOCKCOUNT_BITOFF), C1, 0, | |
380 | TYP_NONE }, | |
381 | { "extentflag", FLDT_CEXTFLG, OI(BMBT_EXNTFLAG_BITOFF), C1, 0, | |
382 | TYP_NONE }, | |
383 | { NULL } | |
384 | }; | |
385 | ||
386 | ||
387 | /* | |
388 | * Inode allocation btree. | |
389 | */ | |
390 | ||
391 | const field_t inobt_hfld[] = { | |
392 | { "", FLDT_INOBT, OI(0), C1, 0, TYP_NONE }, | |
393 | { NULL } | |
394 | }; | |
395 | ||
c2907bd7 DC |
396 | const field_t inobt_crc_hfld[] = { |
397 | { "", FLDT_INOBT_CRC, OI(0), C1, 0, TYP_NONE }, | |
398 | { NULL } | |
399 | }; | |
400 | ||
061e316e BF |
401 | const field_t inobt_spcrc_hfld[] = { |
402 | { "", FLDT_INOBT_SPCRC, OI(0), C1, 0, TYP_NONE }, | |
403 | { NULL } | |
404 | }; | |
405 | ||
b3563c19 | 406 | #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) |
49b31417 BN |
407 | const field_t inobt_flds[] = { |
408 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
409 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
410 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
b3563c19 BN |
411 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_INOBT }, |
412 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_INOBT }, | |
49b31417 BN |
413 | { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, |
414 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
415 | { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, | |
416 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
417 | { "ptrs", FLDT_INOBTPTR, btblock_ptr_offset, btblock_key_count, | |
418 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, | |
419 | { NULL } | |
420 | }; | |
c2907bd7 DC |
421 | const field_t inobt_crc_flds[] = { |
422 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
423 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
424 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
425 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_INOBT }, | |
426 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_INOBT }, | |
427 | { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_INOBT }, | |
428 | { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, | |
429 | { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, | |
430 | { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, | |
0522f1cc | 431 | { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, |
c2907bd7 DC |
432 | { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, |
433 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
434 | { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, | |
435 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
436 | { "ptrs", FLDT_INOBTPTR, btblock_ptr_offset, btblock_key_count, | |
437 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, | |
438 | { NULL } | |
439 | }; | |
061e316e BF |
440 | const field_t inobt_spcrc_flds[] = { |
441 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
442 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
443 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
444 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_INOBT }, | |
445 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_INOBT }, | |
446 | { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_INOBT }, | |
447 | { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, | |
448 | { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, | |
449 | { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, | |
450 | { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, | |
451 | { "recs", FLDT_INOBTSPREC, btblock_rec_offset, btblock_rec_count, | |
452 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
453 | { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, | |
454 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
455 | { "ptrs", FLDT_INOBTPTR, btblock_ptr_offset, btblock_key_count, | |
456 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_INOBT }, | |
457 | { NULL } | |
458 | }; | |
459 | ||
49b31417 BN |
460 | #undef OFF |
461 | ||
462 | #define KOFF(f) bitize(offsetof(xfs_inobt_key_t, ir_ ## f)) | |
463 | const field_t inobt_key_flds[] = { | |
464 | { "startino", FLDT_AGINO, OI(KOFF(startino)), C1, 0, TYP_INODE }, | |
465 | { NULL } | |
466 | }; | |
467 | #undef KOFF | |
468 | ||
11640e30 | 469 | #define ROFF(f) bitize(offsetof(xfs_inobt_rec_t, f)) |
49b31417 | 470 | const field_t inobt_rec_flds[] = { |
11640e30 BF |
471 | { "startino", FLDT_AGINO, OI(ROFF(ir_startino)), C1, 0, TYP_INODE }, |
472 | { "freecount", FLDT_INT32D, OI(ROFF(ir_u.f.ir_freecount)), C1, 0, TYP_NONE }, | |
473 | { "free", FLDT_INOFREE, OI(ROFF(ir_free)), C1, 0, TYP_NONE }, | |
49b31417 BN |
474 | { NULL } |
475 | }; | |
061e316e BF |
476 | /* sparse inode on-disk format */ |
477 | const field_t inobt_sprec_flds[] = { | |
478 | { "startino", FLDT_AGINO, OI(ROFF(ir_startino)), C1, 0, TYP_INODE }, | |
479 | { "holemask", FLDT_UINT16X, OI(ROFF(ir_u.sp.ir_holemask)), C1, 0, | |
480 | TYP_NONE }, | |
481 | { "count", FLDT_UINT8D, OI(ROFF(ir_u.sp.ir_count)), C1, 0, TYP_NONE }, | |
482 | { "freecount", FLDT_INT8D, OI(ROFF(ir_u.sp.ir_freecount)), C1, 0, | |
483 | TYP_NONE }, | |
484 | { "free", FLDT_INOFREE, OI(ROFF(ir_free)), C1, 0, TYP_NONE }, | |
485 | { NULL } | |
486 | }; | |
49b31417 BN |
487 | #undef ROFF |
488 | ||
489 | ||
490 | /* | |
491 | * Allocation btrees. | |
492 | */ | |
493 | const field_t bnobt_hfld[] = { | |
494 | { "", FLDT_BNOBT, OI(0), C1, 0, TYP_NONE }, | |
495 | { NULL } | |
496 | }; | |
497 | ||
c2907bd7 DC |
498 | const field_t bnobt_crc_hfld[] = { |
499 | { "", FLDT_BNOBT_CRC, OI(0), C1, 0, TYP_NONE }, | |
500 | { NULL } | |
501 | }; | |
502 | ||
b3563c19 | 503 | #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) |
49b31417 BN |
504 | const field_t bnobt_flds[] = { |
505 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
506 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
507 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
b3563c19 BN |
508 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_BNOBT }, |
509 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_BNOBT }, | |
49b31417 BN |
510 | { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, |
511 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
512 | { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, | |
513 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
514 | { "ptrs", FLDT_BNOBTPTR, btblock_ptr_offset, btblock_key_count, | |
515 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, | |
516 | { NULL } | |
517 | }; | |
c2907bd7 DC |
518 | const field_t bnobt_crc_flds[] = { |
519 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
520 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
521 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
522 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_BNOBT }, | |
523 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_BNOBT }, | |
524 | { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_BNOBT }, | |
525 | { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, | |
526 | { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, | |
527 | { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, | |
0522f1cc | 528 | { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, |
c2907bd7 DC |
529 | { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, |
530 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
531 | { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, | |
532 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
533 | { "ptrs", FLDT_BNOBTPTR, btblock_ptr_offset, btblock_key_count, | |
534 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BNOBT }, | |
535 | { NULL } | |
536 | }; | |
49b31417 BN |
537 | #undef OFF |
538 | ||
539 | #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) | |
540 | const field_t bnobt_key_flds[] = { | |
541 | { "startblock", FLDT_AGBLOCK, OI(KOFF(startblock)), C1, 0, TYP_DATA }, | |
542 | { "blockcount", FLDT_EXTLEN, OI(KOFF(blockcount)), C1, 0, TYP_NONE }, | |
543 | { NULL } | |
544 | }; | |
545 | #undef KOFF | |
546 | ||
547 | #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f)) | |
548 | const field_t bnobt_rec_flds[] = { | |
549 | { "startblock", FLDT_AGBLOCK, OI(ROFF(startblock)), C1, 0, TYP_DATA }, | |
550 | { "blockcount", FLDT_EXTLEN, OI(ROFF(blockcount)), C1, 0, TYP_NONE }, | |
551 | { NULL } | |
552 | }; | |
553 | #undef ROFF | |
554 | ||
555 | const field_t cntbt_hfld[] = { | |
556 | { "", FLDT_CNTBT, OI(0), C1, 0, TYP_NONE }, | |
557 | { NULL } | |
558 | }; | |
559 | ||
c2907bd7 DC |
560 | const field_t cntbt_crc_hfld[] = { |
561 | { "", FLDT_CNTBT_CRC, OI(0), C1, 0, TYP_NONE }, | |
562 | { NULL } | |
563 | }; | |
564 | ||
b3563c19 | 565 | #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) |
49b31417 BN |
566 | const field_t cntbt_flds[] = { |
567 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
568 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
569 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
b3563c19 BN |
570 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_CNTBT }, |
571 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_CNTBT }, | |
49b31417 BN |
572 | { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, |
573 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
574 | { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, | |
575 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
576 | { "ptrs", FLDT_CNTBTPTR, btblock_ptr_offset, btblock_key_count, | |
577 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, | |
578 | { NULL } | |
579 | }; | |
c2907bd7 DC |
580 | const field_t cntbt_crc_flds[] = { |
581 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
582 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
583 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
584 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_CNTBT }, | |
585 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_CNTBT }, | |
586 | { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_CNTBT }, | |
587 | { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, | |
588 | { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, | |
589 | { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, | |
0522f1cc | 590 | { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, |
c2907bd7 DC |
591 | { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, |
592 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
593 | { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, | |
594 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
595 | { "ptrs", FLDT_CNTBTPTR, btblock_ptr_offset, btblock_key_count, | |
596 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_CNTBT }, | |
597 | { NULL } | |
598 | }; | |
49b31417 BN |
599 | #undef OFF |
600 | ||
601 | #define KOFF(f) bitize(offsetof(xfs_alloc_key_t, ar_ ## f)) | |
602 | const field_t cntbt_key_flds[] = { | |
603 | { "blockcount", FLDT_EXTLEN, OI(KOFF(blockcount)), C1, 0, TYP_NONE }, | |
604 | { "startblock", FLDT_AGBLOCK, OI(KOFF(startblock)), C1, 0, TYP_DATA }, | |
605 | { NULL } | |
606 | }; | |
607 | #undef KOFF | |
608 | ||
609 | #define ROFF(f) bitize(offsetof(xfs_alloc_rec_t, ar_ ## f)) | |
610 | const field_t cntbt_rec_flds[] = { | |
611 | { "startblock", FLDT_AGBLOCK, OI(ROFF(startblock)), C1, 0, TYP_DATA }, | |
612 | { "blockcount", FLDT_EXTLEN, OI(ROFF(blockcount)), C1, 0, TYP_NONE }, | |
613 | { NULL } | |
614 | }; | |
615 | #undef ROFF | |
a9d7b986 DW |
616 | |
617 | /* RMAP btree blocks */ | |
618 | const field_t rmapbt_crc_hfld[] = { | |
619 | { "", FLDT_RMAPBT_CRC, OI(0), C1, 0, TYP_NONE }, | |
620 | { NULL } | |
621 | }; | |
622 | ||
623 | #define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) | |
624 | const field_t rmapbt_crc_flds[] = { | |
625 | { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, | |
626 | { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, | |
627 | { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, | |
628 | { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_RMAPBT }, | |
629 | { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_RMAPBT }, | |
630 | { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_RMAPBT }, | |
631 | { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, | |
632 | { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, | |
633 | { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, | |
634 | { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, | |
635 | { "recs", FLDT_RMAPBTREC, btblock_rec_offset, btblock_rec_count, | |
636 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
637 | { "keys", FLDT_RMAPBTKEY, btblock_key_offset, btblock_key_count, | |
638 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, | |
639 | { "ptrs", FLDT_RMAPBTPTR, btblock_ptr_offset, btblock_key_count, | |
640 | FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_RMAPBT }, | |
641 | { NULL } | |
642 | }; | |
643 | #undef OFF | |
644 | ||
645 | #define KOFF(f) bitize(offsetof(struct xfs_rmap_key, rm_ ## f)) | |
646 | ||
647 | #define RMAPBK_STARTBLOCK_BITOFF 0 | |
648 | #define RMAPBK_OWNER_BITOFF (RMAPBK_STARTBLOCK_BITOFF + RMAPBT_STARTBLOCK_BITLEN) | |
649 | #define RMAPBK_ATTRFLAG_BITOFF (RMAPBK_OWNER_BITOFF + RMAPBT_OWNER_BITLEN) | |
650 | #define RMAPBK_BMBTFLAG_BITOFF (RMAPBK_ATTRFLAG_BITOFF + RMAPBT_ATTRFLAG_BITLEN) | |
651 | #define RMAPBK_EXNTFLAG_BITOFF (RMAPBK_BMBTFLAG_BITOFF + RMAPBT_BMBTFLAG_BITLEN) | |
652 | #define RMAPBK_UNUSED_OFFSET_BITOFF (RMAPBK_EXNTFLAG_BITOFF + RMAPBT_EXNTFLAG_BITLEN) | |
653 | #define RMAPBK_OFFSET_BITOFF (RMAPBK_UNUSED_OFFSET_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN) | |
654 | ||
655 | #define HI_KOFF(f) bitize(sizeof(struct xfs_rmap_key) + offsetof(struct xfs_rmap_key, rm_ ## f)) | |
656 | ||
657 | #define RMAPBK_STARTBLOCKHI_BITOFF (bitize(sizeof(struct xfs_rmap_key))) | |
658 | #define RMAPBK_OWNERHI_BITOFF (RMAPBK_STARTBLOCKHI_BITOFF + RMAPBT_STARTBLOCK_BITLEN) | |
659 | #define RMAPBK_ATTRFLAGHI_BITOFF (RMAPBK_OWNERHI_BITOFF + RMAPBT_OWNER_BITLEN) | |
660 | #define RMAPBK_BMBTFLAGHI_BITOFF (RMAPBK_ATTRFLAGHI_BITOFF + RMAPBT_ATTRFLAG_BITLEN) | |
661 | #define RMAPBK_EXNTFLAGHI_BITOFF (RMAPBK_BMBTFLAGHI_BITOFF + RMAPBT_BMBTFLAG_BITLEN) | |
662 | #define RMAPBK_UNUSED_OFFSETHI_BITOFF (RMAPBK_EXNTFLAGHI_BITOFF + RMAPBT_EXNTFLAG_BITLEN) | |
663 | #define RMAPBK_OFFSETHI_BITOFF (RMAPBK_UNUSED_OFFSETHI_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN) | |
664 | ||
665 | const field_t rmapbt_key_flds[] = { | |
666 | { "startblock", FLDT_AGBLOCK, OI(KOFF(startblock)), C1, 0, TYP_DATA }, | |
667 | { "owner", FLDT_INT64D, OI(KOFF(owner)), C1, 0, TYP_NONE }, | |
668 | { "offset", FLDT_RFILEOFFD, OI(RMAPBK_OFFSET_BITOFF), C1, 0, TYP_NONE }, | |
669 | { "attrfork", FLDT_RATTRFORKFLG, OI(RMAPBK_ATTRFLAG_BITOFF), C1, 0, | |
670 | TYP_NONE }, | |
671 | { "bmbtblock", FLDT_RBMBTFLG, OI(RMAPBK_BMBTFLAG_BITOFF), C1, 0, | |
672 | TYP_NONE }, | |
673 | { "startblock_hi", FLDT_AGBLOCK, OI(HI_KOFF(startblock)), C1, 0, TYP_DATA }, | |
674 | { "owner_hi", FLDT_INT64D, OI(HI_KOFF(owner)), C1, 0, TYP_NONE }, | |
675 | { "offset_hi", FLDT_RFILEOFFD, OI(RMAPBK_OFFSETHI_BITOFF), C1, 0, TYP_NONE }, | |
676 | { "attrfork_hi", FLDT_RATTRFORKFLG, OI(RMAPBK_ATTRFLAGHI_BITOFF), C1, 0, | |
677 | TYP_NONE }, | |
678 | { "bmbtblock_hi", FLDT_RBMBTFLG, OI(RMAPBK_BMBTFLAGHI_BITOFF), C1, 0, | |
679 | TYP_NONE }, | |
680 | { NULL } | |
681 | }; | |
682 | #undef HI_KOFF | |
683 | #undef KOFF | |
684 | ||
685 | #define ROFF(f) bitize(offsetof(struct xfs_rmap_rec, rm_ ## f)) | |
686 | ||
687 | #define RMAPBT_STARTBLOCK_BITOFF 0 | |
688 | #define RMAPBT_BLOCKCOUNT_BITOFF (RMAPBT_STARTBLOCK_BITOFF + RMAPBT_STARTBLOCK_BITLEN) | |
689 | #define RMAPBT_OWNER_BITOFF (RMAPBT_BLOCKCOUNT_BITOFF + RMAPBT_BLOCKCOUNT_BITLEN) | |
690 | #define RMAPBT_ATTRFLAG_BITOFF (RMAPBT_OWNER_BITOFF + RMAPBT_OWNER_BITLEN) | |
691 | #define RMAPBT_BMBTFLAG_BITOFF (RMAPBT_ATTRFLAG_BITOFF + RMAPBT_ATTRFLAG_BITLEN) | |
692 | #define RMAPBT_EXNTFLAG_BITOFF (RMAPBT_BMBTFLAG_BITOFF + RMAPBT_BMBTFLAG_BITLEN) | |
693 | #define RMAPBT_UNUSED_OFFSET_BITOFF (RMAPBT_EXNTFLAG_BITOFF + RMAPBT_EXNTFLAG_BITLEN) | |
694 | #define RMAPBT_OFFSET_BITOFF (RMAPBT_UNUSED_OFFSET_BITOFF + RMAPBT_UNUSED_OFFSET_BITLEN) | |
695 | ||
696 | const field_t rmapbt_rec_flds[] = { | |
697 | { "startblock", FLDT_AGBLOCK, OI(RMAPBT_STARTBLOCK_BITOFF), C1, 0, TYP_DATA }, | |
698 | { "blockcount", FLDT_REXTLEN, OI(RMAPBT_BLOCKCOUNT_BITOFF), C1, 0, TYP_NONE }, | |
699 | { "owner", FLDT_INT64D, OI(RMAPBT_OWNER_BITOFF), C1, 0, TYP_NONE }, | |
700 | { "offset", FLDT_RFILEOFFD, OI(RMAPBT_OFFSET_BITOFF), C1, 0, TYP_NONE }, | |
701 | { "extentflag", FLDT_REXTFLG, OI(RMAPBT_EXNTFLAG_BITOFF), C1, 0, | |
702 | TYP_NONE }, | |
703 | { "attrfork", FLDT_RATTRFORKFLG, OI(RMAPBT_ATTRFLAG_BITOFF), C1, 0, | |
704 | TYP_NONE }, | |
705 | { "bmbtblock", FLDT_RBMBTFLG, OI(RMAPBT_BMBTFLAG_BITOFF), C1, 0, | |
706 | TYP_NONE }, | |
707 | { NULL } | |
708 | }; | |
709 | #undef ROFF |