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