]>
Commit | Line | Data |
---|---|---|
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 | |
18 | static int bmroota_key_count(void *obj, int startoff); | |
19 | static int bmroota_key_offset(void *obj, int startoff, int idx); | |
20 | static int bmroota_ptr_count(void *obj, int startoff); | |
21 | static int bmroota_ptr_offset(void *obj, int startoff, int idx); | |
22 | static int bmrootd_key_count(void *obj, int startoff); | |
23 | static int bmrootd_key_offset(void *obj, int startoff, int idx); | |
24 | static int bmrootd_ptr_count(void *obj, int startoff); | |
25 | static int bmrootd_ptr_offset(void *obj, int startoff, int idx); | |
26 | ||
27 | #define OFF(f) bitize(offsetof(xfs_bmdr_block_t, bb_ ## f)) | |
28 | const 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 | }; | |
37 | const 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)) | |
48 | const field_t bmroota_key_flds[] = { | |
49 | { "startoff", FLDT_DFILOFFA, OI(KOFF(startoff)), C1, 0, TYP_NONE }, | |
50 | { NULL } | |
51 | }; | |
52 | const field_t bmrootd_key_flds[] = { | |
53 | { "startoff", FLDT_DFILOFFD, OI(KOFF(startoff)), C1, 0, TYP_NONE }, | |
54 | { NULL } | |
55 | }; | |
56 | ||
57 | static int | |
58 | bmroota_key_count( | |
59 | void *obj, | |
60 | int startoff) | |
61 | { | |
62 | xfs_bmdr_block_t *block; | |
63 | #ifdef DEBUG | |
7328ea6e | 64 | struct xfs_dinode *dip = obj; |
2bd0ea18 NS |
65 | #endif |
66 | ||
67 | ASSERT(bitoffs(startoff) == 0); | |
68 | ASSERT(obj == iocur_top->data); | |
69 | block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff)); | |
8c6cccd7 | 70 | ASSERT(dip->di_forkoff != 0 && (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 | ||
75 | static int | |
76 | bmroota_key_offset( | |
77 | void *obj, | |
78 | int startoff, | |
79 | int idx) | |
80 | { | |
81 | xfs_bmdr_block_t *block; | |
6bddecbc | 82 | #ifdef DEBUG |
7328ea6e | 83 | struct xfs_dinode *dip = obj; |
6bddecbc | 84 | #endif |
2bd0ea18 NS |
85 | xfs_bmdr_key_t *kp; |
86 | ||
87 | ASSERT(bitoffs(startoff) == 0); | |
88 | ASSERT(obj == iocur_top->data); | |
2bd0ea18 | 89 | block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff)); |
8c6cccd7 | 90 | ASSERT(dip->di_forkoff != 0 && (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 | ||
96 | static int | |
97 | bmroota_ptr_count( | |
98 | void *obj, | |
99 | int startoff) | |
100 | { | |
101 | xfs_bmdr_block_t *block; | |
102 | #ifdef DEBUG | |
7328ea6e | 103 | struct xfs_dinode *dip = obj; |
2bd0ea18 NS |
104 | #endif |
105 | ||
106 | ASSERT(bitoffs(startoff) == 0); | |
107 | ASSERT(obj == iocur_top->data); | |
108 | block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff)); | |
8c6cccd7 | 109 | ASSERT(dip->di_forkoff != 0 && (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 | ||
114 | static int | |
115 | bmroota_ptr_offset( | |
116 | void *obj, | |
117 | int startoff, | |
118 | int idx) | |
119 | { | |
120 | xfs_bmdr_block_t *block; | |
7328ea6e | 121 | struct xfs_dinode *dip; |
2bd0ea18 NS |
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)); | |
8c6cccd7 | 128 | ASSERT(dip->di_forkoff != 0 && (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 | ||
135 | int | |
136 | bmroota_size( | |
137 | void *obj, | |
138 | int startoff, | |
139 | int idx) | |
140 | { | |
7328ea6e | 141 | struct xfs_dinode *dip; |
2bd0ea18 NS |
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)); | |
8c6cccd7 | 152 | ASSERT(dip->di_forkoff != 0 && (char *)block == XFS_DFORK_APTR(dip)); |
2bd0ea18 NS |
153 | #endif |
154 | return bitize((int)XFS_DFORK_ASIZE(dip, mp)); | |
155 | } | |
156 | ||
157 | static int | |
158 | bmrootd_key_count( | |
159 | void *obj, | |
160 | int startoff) | |
161 | { | |
162 | xfs_bmdr_block_t *block; | |
163 | #ifdef DEBUG | |
7328ea6e | 164 | struct xfs_dinode *dip = obj; |
2bd0ea18 NS |
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 | ||
175 | static int | |
176 | bmrootd_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 | ||
192 | static int | |
193 | bmrootd_ptr_count( | |
194 | void *obj, | |
195 | int startoff) | |
196 | { | |
197 | xfs_bmdr_block_t *block; | |
198 | #ifdef DEBUG | |
7328ea6e | 199 | struct xfs_dinode *dip = obj; |
2bd0ea18 NS |
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 | ||
210 | static int | |
211 | bmrootd_ptr_offset( | |
212 | void *obj, | |
213 | int startoff, | |
214 | int idx) | |
215 | { | |
216 | xfs_bmdr_block_t *block; | |
217 | xfs_bmdr_ptr_t *pp; | |
7328ea6e | 218 | struct xfs_dinode *dip; |
2bd0ea18 NS |
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 | ||
230 | int | |
231 | bmrootd_size( | |
232 | void *obj, | |
233 | int startoff, | |
234 | int idx) | |
235 | { | |
7328ea6e | 236 | struct xfs_dinode *dip; |
2bd0ea18 NS |
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 | } |