]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - db/bmroot.c
xfsprogs: Release v4.18.0
[thirdparty/xfsprogs-dev.git] / db / bmroot.c
CommitLineData
959ef981 1// SPDX-License-Identifier: GPL-2.0
2bd0ea18 2/*
da23017d
NS
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
2bd0ea18
NS
5 */
6
6b803e5a 7#include "libxfs.h"
2bd0ea18
NS
8#include "type.h"
9#include "faddr.h"
10#include "fprint.h"
11#include "field.h"
12#include "bmroot.h"
13#include "io.h"
14#include "print.h"
15#include "bit.h"
4ca431fc 16#include "init.h"
2bd0ea18
NS
17
18static int bmroota_key_count(void *obj, int startoff);
19static int bmroota_key_offset(void *obj, int startoff, int idx);
20static int bmroota_ptr_count(void *obj, int startoff);
21static int bmroota_ptr_offset(void *obj, int startoff, int idx);
22static int bmrootd_key_count(void *obj, int startoff);
23static int bmrootd_key_offset(void *obj, int startoff, int idx);
24static int bmrootd_ptr_count(void *obj, int startoff);
25static int bmrootd_ptr_offset(void *obj, int startoff, int idx);
26
27#define OFF(f) bitize(offsetof(xfs_bmdr_block_t, bb_ ## f))
28const field_t bmroota_flds[] = {
29 { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE },
30 { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE },
31 { "keys", FLDT_BMROOTAKEY, bmroota_key_offset, bmroota_key_count,
32 FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE },
33 { "ptrs", FLDT_BMROOTAPTR, bmroota_ptr_offset, bmroota_ptr_count,
34 FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTA },
35 { NULL }
36};
37const field_t bmrootd_flds[] = {
38 { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE },
39 { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE },
40 { "keys", FLDT_BMROOTDKEY, bmrootd_key_offset, bmrootd_key_count,
41 FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE },
42 { "ptrs", FLDT_BMROOTDPTR, bmrootd_ptr_offset, bmrootd_ptr_count,
43 FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_BMAPBTD },
44 { NULL }
45};
46
47#define KOFF(f) bitize(offsetof(xfs_bmdr_key_t, br_ ## f))
48const field_t bmroota_key_flds[] = {
49 { "startoff", FLDT_DFILOFFA, OI(KOFF(startoff)), C1, 0, TYP_NONE },
50 { NULL }
51};
52const field_t bmrootd_key_flds[] = {
53 { "startoff", FLDT_DFILOFFD, OI(KOFF(startoff)), C1, 0, TYP_NONE },
54 { NULL }
55};
56
57static int
58bmroota_key_count(
59 void *obj,
60 int startoff)
61{
62 xfs_bmdr_block_t *block;
63#ifdef DEBUG
64 xfs_dinode_t *dip = obj;
65#endif
66
67 ASSERT(bitoffs(startoff) == 0);
68 ASSERT(obj == iocur_top->data);
69 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
70 ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip));
5e656dbb
BN
71 ASSERT(be16_to_cpu(block->bb_level) > 0);
72 return be16_to_cpu(block->bb_numrecs);
2bd0ea18
NS
73}
74
75static int
76bmroota_key_offset(
77 void *obj,
78 int startoff,
79 int idx)
80{
81 xfs_bmdr_block_t *block;
6bddecbc
DC
82#ifdef DEBUG
83 xfs_dinode_t *dip = obj;
84#endif
2bd0ea18
NS
85 xfs_bmdr_key_t *kp;
86
87 ASSERT(bitoffs(startoff) == 0);
88 ASSERT(obj == iocur_top->data);
2bd0ea18
NS
89 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
90 ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip));
5e656dbb 91 ASSERT(be16_to_cpu(block->bb_level) > 0);
b3563c19 92 kp = XFS_BMDR_KEY_ADDR(block, idx);
2bd0ea18
NS
93 return bitize((int)((char *)kp - (char *)block));
94}
95
96static int
97bmroota_ptr_count(
98 void *obj,
99 int startoff)
100{
101 xfs_bmdr_block_t *block;
102#ifdef DEBUG
103 xfs_dinode_t *dip = obj;
104#endif
105
106 ASSERT(bitoffs(startoff) == 0);
107 ASSERT(obj == iocur_top->data);
108 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
109 ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip));
5e656dbb
BN
110 ASSERT(be16_to_cpu(block->bb_level) > 0);
111 return be16_to_cpu(block->bb_numrecs);
2bd0ea18
NS
112}
113
114static int
115bmroota_ptr_offset(
116 void *obj,
117 int startoff,
118 int idx)
119{
120 xfs_bmdr_block_t *block;
121 xfs_dinode_t *dip;
122 xfs_bmdr_ptr_t *pp;
123
124 ASSERT(bitoffs(startoff) == 0);
125 ASSERT(obj == iocur_top->data);
126 dip = obj;
127 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
128 ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip));
5e656dbb 129 ASSERT(be16_to_cpu(block->bb_level) > 0);
b3563c19 130 pp = XFS_BMDR_PTR_ADDR(block, idx,
e2f60652 131 libxfs_bmdr_maxrecs(XFS_DFORK_ASIZE(dip, mp), 0));
2bd0ea18
NS
132 return bitize((int)((char *)pp - (char *)block));
133}
134
135int
136bmroota_size(
137 void *obj,
138 int startoff,
139 int idx)
140{
141 xfs_dinode_t *dip;
142#ifdef DEBUG
143 xfs_bmdr_block_t *block;
144#endif
145
146 ASSERT(bitoffs(startoff) == 0);
147 ASSERT(obj == iocur_top->data);
148 ASSERT(idx == 0);
149 dip = obj;
150#ifdef DEBUG
151 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
152 ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip));
153#endif
154 return bitize((int)XFS_DFORK_ASIZE(dip, mp));
155}
156
157static int
158bmrootd_key_count(
159 void *obj,
160 int startoff)
161{
162 xfs_bmdr_block_t *block;
163#ifdef DEBUG
164 xfs_dinode_t *dip = obj;
165#endif
166
167 ASSERT(bitoffs(startoff) == 0);
168 ASSERT(obj == iocur_top->data);
169 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
170 ASSERT((char *)block == XFS_DFORK_DPTR(dip));
5e656dbb
BN
171 ASSERT(be16_to_cpu(block->bb_level) > 0);
172 return be16_to_cpu(block->bb_numrecs);
2bd0ea18
NS
173}
174
175static int
176bmrootd_key_offset(
177 void *obj,
178 int startoff,
179 int idx)
180{
181 xfs_bmdr_block_t *block;
182 xfs_bmdr_key_t *kp;
2bd0ea18
NS
183
184 ASSERT(bitoffs(startoff) == 0);
185 ASSERT(obj == iocur_top->data);
2bd0ea18 186 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
5e656dbb 187 ASSERT(be16_to_cpu(block->bb_level) > 0);
b3563c19 188 kp = XFS_BMDR_KEY_ADDR(block, idx);
2bd0ea18
NS
189 return bitize((int)((char *)kp - (char *)block));
190}
191
192static int
193bmrootd_ptr_count(
194 void *obj,
195 int startoff)
196{
197 xfs_bmdr_block_t *block;
198#ifdef DEBUG
199 xfs_dinode_t *dip = obj;
200#endif
201
202 ASSERT(bitoffs(startoff) == 0);
203 ASSERT(obj == iocur_top->data);
204 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
205 ASSERT((char *)block == XFS_DFORK_DPTR(dip));
5e656dbb
BN
206 ASSERT(be16_to_cpu(block->bb_level) > 0);
207 return be16_to_cpu(block->bb_numrecs);
2bd0ea18
NS
208}
209
210static int
211bmrootd_ptr_offset(
212 void *obj,
213 int startoff,
214 int idx)
215{
216 xfs_bmdr_block_t *block;
217 xfs_bmdr_ptr_t *pp;
218 xfs_dinode_t *dip;
219
220 ASSERT(bitoffs(startoff) == 0);
221 ASSERT(obj == iocur_top->data);
222 dip = obj;
223 block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff));
5e656dbb 224 ASSERT(be16_to_cpu(block->bb_level) > 0);
b3563c19 225 pp = XFS_BMDR_PTR_ADDR(block, idx,
e2f60652 226 libxfs_bmdr_maxrecs(XFS_DFORK_DSIZE(dip, mp), 0));
2bd0ea18
NS
227 return bitize((int)((char *)pp - (char *)block));
228}
229
230int
231bmrootd_size(
232 void *obj,
233 int startoff,
234 int idx)
235{
236 xfs_dinode_t *dip;
237
238 ASSERT(bitoffs(startoff) == 0);
239 ASSERT(obj == iocur_top->data);
240 ASSERT(idx == 0);
241 dip = obj;
242 return bitize((int)XFS_DFORK_DSIZE(dip, mp));
243}