1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef __XFS_DA_BTREE_H__
20#define __XFS_DA_BTREE_H__
21
22struct xfs_bmap_free;
23struct xfs_inode;
24struct xfs_trans;
25struct zone;
26
27
28
29
30
31
32
33
34
35
36
37#define XFS_DA_NODE_MAGIC 0xfebe
38#define XFS_ATTR_LEAF_MAGIC 0xfbee
39#define XFS_DIR2_LEAF1_MAGIC 0xd2f1
40#define XFS_DIR2_LEAFN_MAGIC 0xd2ff
41
42typedef struct xfs_da_blkinfo {
43 __be32 forw;
44 __be32 back;
45 __be16 magic;
46 __be16 pad;
47} xfs_da_blkinfo_t;
48
49
50
51
52
53
54
55
56
57#define XFS_DA3_NODE_MAGIC 0x3ebe
58#define XFS_ATTR3_LEAF_MAGIC 0x3bee
59#define XFS_DIR3_LEAF1_MAGIC 0x3df1
60#define XFS_DIR3_LEAFN_MAGIC 0x3dff
61
62struct xfs_da3_blkinfo {
63
64
65
66
67
68 struct xfs_da_blkinfo hdr;
69 __be32 crc;
70 __be64 blkno;
71 __be64 lsn;
72 uuid_t uuid;
73 __be64 owner;
74};
75
76
77
78
79
80
81
82
83
84
85#define XFS_DA_NODE_MAXDEPTH 5
86
87typedef struct xfs_da_node_hdr {
88 struct xfs_da_blkinfo info;
89 __be16 __count;
90 __be16 __level;
91} xfs_da_node_hdr_t;
92
93struct xfs_da3_node_hdr {
94 struct xfs_da3_blkinfo info;
95 __be16 __count;
96 __be16 __level;
97 __be32 __pad32;
98};
99
100#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc))
101
102typedef struct xfs_da_node_entry {
103 __be32 hashval;
104 __be32 before;
105} xfs_da_node_entry_t;
106
107typedef struct xfs_da_intnode {
108 struct xfs_da_node_hdr hdr;
109 struct xfs_da_node_entry __btree[];
110} xfs_da_intnode_t;
111
112struct xfs_da3_intnode {
113 struct xfs_da3_node_hdr hdr;
114 struct xfs_da_node_entry __btree[];
115};
116
117
118
119
120
121
122struct xfs_da3_icnode_hdr {
123 __uint32_t forw;
124 __uint32_t back;
125 __uint16_t magic;
126 __uint16_t count;
127 __uint16_t level;
128};
129
130extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to,
131 struct xfs_da_intnode *from);
132extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to,
133 struct xfs_da3_icnode_hdr *from);
134
135static inline int
136xfs_da3_node_hdr_size(struct xfs_da_intnode *dap)
137{
138 if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC))
139 return sizeof(struct xfs_da3_node_hdr);
140 return sizeof(struct xfs_da_node_hdr);
141}
142
143static inline struct xfs_da_node_entry *
144xfs_da3_node_tree_p(struct xfs_da_intnode *dap)
145{
146 if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) {
147 struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap;
148 return dap3->__btree;
149 }
150 return dap->__btree;
151}
152
153extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to,
154 struct xfs_da_intnode *from);
155extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to,
156 struct xfs_da3_icnode_hdr *from);
157
158#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize
159
160
161
162
163
164
165
166
167enum xfs_dacmp {
168 XFS_CMP_DIFFERENT,
169 XFS_CMP_EXACT,
170 XFS_CMP_CASE
171};
172
173
174
175
176typedef struct xfs_da_args {
177 const __uint8_t *name;
178 int namelen;
179 __uint8_t *value;
180 int valuelen;
181 int flags;
182 xfs_dahash_t hashval;
183 xfs_ino_t inumber;
184 struct xfs_inode *dp;
185 xfs_fsblock_t *firstblock;
186 struct xfs_bmap_free *flist;
187 struct xfs_trans *trans;
188 xfs_extlen_t total;
189 int whichfork;
190 xfs_dablk_t blkno;
191 int index;
192 xfs_dablk_t rmtblkno;
193 int rmtblkcnt;
194 xfs_dablk_t blkno2;
195 int index2;
196 xfs_dablk_t rmtblkno2;
197 int rmtblkcnt2;
198 int op_flags;
199 enum xfs_dacmp cmpresult;
200} xfs_da_args_t;
201
202
203
204
205#define XFS_DA_OP_JUSTCHECK 0x0001
206#define XFS_DA_OP_RENAME 0x0002
207#define XFS_DA_OP_ADDNAME 0x0004
208#define XFS_DA_OP_OKNOENT 0x0008
209#define XFS_DA_OP_CILOOKUP 0x0010
210
211#define XFS_DA_OP_FLAGS \
212 { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \
213 { XFS_DA_OP_RENAME, "RENAME" }, \
214 { XFS_DA_OP_ADDNAME, "ADDNAME" }, \
215 { XFS_DA_OP_OKNOENT, "OKNOENT" }, \
216 { XFS_DA_OP_CILOOKUP, "CILOOKUP" }
217
218
219
220
221
222
223
224
225typedef struct xfs_da_state_blk {
226 struct xfs_buf *bp;
227 xfs_dablk_t blkno;
228 xfs_daddr_t disk_blkno;
229 int index;
230 xfs_dahash_t hashval;
231 int magic;
232} xfs_da_state_blk_t;
233
234typedef struct xfs_da_state_path {
235 int active;
236 xfs_da_state_blk_t blk[XFS_DA_NODE_MAXDEPTH];
237} xfs_da_state_path_t;
238
239typedef struct xfs_da_state {
240 xfs_da_args_t *args;
241 struct xfs_mount *mp;
242 unsigned int blocksize;
243 unsigned int node_ents;
244 xfs_da_state_path_t path;
245 xfs_da_state_path_t altpath;
246 unsigned char inleaf;
247 unsigned char extravalid;
248 unsigned char extraafter;
249 xfs_da_state_blk_t extrablk;
250
251} xfs_da_state_t;
252
253
254
255
256#define XFS_DA_LOGOFF(BASE, ADDR) ((char *)(ADDR) - (char *)(BASE))
257#define XFS_DA_LOGRANGE(BASE, ADDR, SIZE) \
258 (uint)(XFS_DA_LOGOFF(BASE, ADDR)), \
259 (uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1)
260
261
262
263
264struct xfs_nameops {
265 xfs_dahash_t (*hashname)(struct xfs_name *);
266 enum xfs_dacmp (*compname)(struct xfs_da_args *,
267 const unsigned char *, int);
268};
269
270
271
272
273
274
275
276
277
278int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno,
279 int level, struct xfs_buf **bpp, int whichfork);
280int xfs_da3_split(xfs_da_state_t *state);
281
282
283
284
285int xfs_da3_join(xfs_da_state_t *state);
286void xfs_da3_fixhashpath(struct xfs_da_state *state,
287 struct xfs_da_state_path *path_to_to_fix);
288
289
290
291
292int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result);
293int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
294 int forward, int release, int *result);
295
296
297
298int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
299 xfs_da_state_blk_t *new_blk);
300int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
301 xfs_dablk_t bno, xfs_daddr_t mappedbno,
302 struct xfs_buf **bpp, int which_fork);
303
304extern const struct xfs_buf_ops xfs_da3_node_buf_ops;
305
306
307
308
309int xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno);
310int xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno,
311 int count);
312int xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp,
313 xfs_dablk_t bno, xfs_daddr_t mappedbno,
314 struct xfs_buf **bp, int whichfork);
315int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
316 xfs_dablk_t bno, xfs_daddr_t mappedbno,
317 struct xfs_buf **bpp, int whichfork,
318 const struct xfs_buf_ops *ops);
319xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp,
320 xfs_dablk_t bno, xfs_daddr_t mapped_bno,
321 int whichfork, const struct xfs_buf_ops *ops);
322int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
323 struct xfs_buf *dead_buf);
324
325uint xfs_da_hashname(const __uint8_t *name_string, int name_length);
326enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args,
327 const unsigned char *name, int len);
328
329
330xfs_da_state_t *xfs_da_state_alloc(void);
331void xfs_da_state_free(xfs_da_state_t *state);
332
333extern struct kmem_zone *xfs_da_state_zone;
334extern const struct xfs_nameops xfs_default_nameops;
335
336#endif
337