1
2
3
4
5
6
7#ifndef __XFS_DA_BTREE_H__
8#define __XFS_DA_BTREE_H__
9
10struct xfs_inode;
11struct xfs_trans;
12struct zone;
13
14
15
16
17
18
19struct xfs_da_geometry {
20 unsigned int blksize;
21 unsigned int fsbcount;
22 uint8_t fsblog;
23 uint8_t blklog;
24 unsigned int node_hdr_size;
25 unsigned int node_ents;
26 unsigned int magicpct;
27 xfs_dablk_t datablk;
28 unsigned int leaf_hdr_size;
29 unsigned int leaf_max_ents;
30 xfs_dablk_t leafblk;
31 unsigned int free_hdr_size;
32 unsigned int free_max_bests;
33 xfs_dablk_t freeblk;
34
35 xfs_dir2_data_aoff_t data_first_offset;
36 size_t data_entry_offset;
37};
38
39
40
41
42
43
44
45
46enum xfs_dacmp {
47 XFS_CMP_DIFFERENT,
48 XFS_CMP_EXACT,
49 XFS_CMP_CASE
50};
51
52
53
54
55typedef struct xfs_da_args {
56 struct xfs_da_geometry *geo;
57 const uint8_t *name;
58 int namelen;
59 uint8_t filetype;
60 void *value;
61 int valuelen;
62 unsigned int attr_filter;
63 unsigned int attr_flags;
64 xfs_dahash_t hashval;
65 xfs_ino_t inumber;
66 struct xfs_inode *dp;
67 struct xfs_trans *trans;
68 xfs_extlen_t total;
69 int whichfork;
70 xfs_dablk_t blkno;
71 int index;
72 xfs_dablk_t rmtblkno;
73 int rmtblkcnt;
74 int rmtvaluelen;
75 xfs_dablk_t blkno2;
76 int index2;
77 xfs_dablk_t rmtblkno2;
78 int rmtblkcnt2;
79 int rmtvaluelen2;
80 int op_flags;
81 enum xfs_dacmp cmpresult;
82} xfs_da_args_t;
83
84
85
86
87#define XFS_DA_OP_JUSTCHECK 0x0001
88#define XFS_DA_OP_RENAME 0x0002
89#define XFS_DA_OP_ADDNAME 0x0004
90#define XFS_DA_OP_OKNOENT 0x0008
91#define XFS_DA_OP_CILOOKUP 0x0010
92#define XFS_DA_OP_NOTIME 0x0020
93
94#define XFS_DA_OP_FLAGS \
95 { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \
96 { XFS_DA_OP_RENAME, "RENAME" }, \
97 { XFS_DA_OP_ADDNAME, "ADDNAME" }, \
98 { XFS_DA_OP_OKNOENT, "OKNOENT" }, \
99 { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \
100 { XFS_DA_OP_NOTIME, "NOTIME" }
101
102
103
104
105
106
107
108
109typedef struct xfs_da_state_blk {
110 struct xfs_buf *bp;
111 xfs_dablk_t blkno;
112 xfs_daddr_t disk_blkno;
113 int index;
114 xfs_dahash_t hashval;
115 int magic;
116} xfs_da_state_blk_t;
117
118typedef struct xfs_da_state_path {
119 int active;
120 xfs_da_state_blk_t blk[XFS_DA_NODE_MAXDEPTH];
121} xfs_da_state_path_t;
122
123typedef struct xfs_da_state {
124 xfs_da_args_t *args;
125 struct xfs_mount *mp;
126 xfs_da_state_path_t path;
127 xfs_da_state_path_t altpath;
128 unsigned char inleaf;
129 unsigned char extravalid;
130 unsigned char extraafter;
131 xfs_da_state_blk_t extrablk;
132
133} xfs_da_state_t;
134
135
136
137
138
139
140struct xfs_da3_icnode_hdr {
141 uint32_t forw;
142 uint32_t back;
143 uint16_t magic;
144 uint16_t count;
145 uint16_t level;
146
147
148
149
150
151 struct xfs_da_node_entry *btree;
152};
153
154
155
156
157#define XFS_DA_LOGOFF(BASE, ADDR) ((char *)(ADDR) - (char *)(BASE))
158#define XFS_DA_LOGRANGE(BASE, ADDR, SIZE) \
159 (uint)(XFS_DA_LOGOFF(BASE, ADDR)), \
160 (uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1)
161
162
163
164
165
166
167
168
169int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno,
170 int level, struct xfs_buf **bpp, int whichfork);
171int xfs_da3_split(xfs_da_state_t *state);
172
173
174
175
176int xfs_da3_join(xfs_da_state_t *state);
177void xfs_da3_fixhashpath(struct xfs_da_state *state,
178 struct xfs_da_state_path *path_to_to_fix);
179
180
181
182
183int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result);
184int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
185 int forward, int release, int *result);
186
187
188
189int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
190 xfs_da_state_blk_t *new_blk);
191int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
192 xfs_dablk_t bno, struct xfs_buf **bpp, int whichfork);
193int xfs_da3_node_read_mapped(struct xfs_trans *tp, struct xfs_inode *dp,
194 xfs_daddr_t mappedbno, struct xfs_buf **bpp,
195 int whichfork);
196
197
198
199
200
201#define XFS_DABUF_MAP_HOLE_OK (1 << 0)
202
203int xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno);
204int xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno,
205 int count);
206int xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp,
207 xfs_dablk_t bno, struct xfs_buf **bp, int whichfork);
208int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
209 xfs_dablk_t bno, unsigned int flags, struct xfs_buf **bpp,
210 int whichfork, const struct xfs_buf_ops *ops);
211int xfs_da_reada_buf(struct xfs_inode *dp, xfs_dablk_t bno,
212 unsigned int flags, int whichfork,
213 const struct xfs_buf_ops *ops);
214int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
215 struct xfs_buf *dead_buf);
216
217uint xfs_da_hashname(const uint8_t *name_string, int name_length);
218enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args,
219 const unsigned char *name, int len);
220
221
222xfs_da_state_t *xfs_da_state_alloc(void);
223void xfs_da_state_free(xfs_da_state_t *state);
224
225void xfs_da3_node_hdr_from_disk(struct xfs_mount *mp,
226 struct xfs_da3_icnode_hdr *to, struct xfs_da_intnode *from);
227void xfs_da3_node_hdr_to_disk(struct xfs_mount *mp,
228 struct xfs_da_intnode *to, struct xfs_da3_icnode_hdr *from);
229
230extern struct kmem_zone *xfs_da_state_zone;
231
232#endif
233