1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_ATTR_LEAF_H__
19#define __XFS_ATTR_LEAF_H__
20
21
22
23
24
25
26
27
28
29
30
31struct attrlist;
32struct attrlist_cursor_kern;
33struct xfs_attr_list_context;
34struct xfs_dabuf;
35struct xfs_da_args;
36struct xfs_da_state;
37struct xfs_da_state_blk;
38struct xfs_inode;
39struct xfs_trans;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73#define XFS_ATTR_LEAF_MAPSIZE 3
74
75typedef struct xfs_attr_leaf_map {
76 __be16 base;
77 __be16 size;
78} xfs_attr_leaf_map_t;
79
80typedef struct xfs_attr_leaf_hdr {
81 xfs_da_blkinfo_t info;
82 __be16 count;
83 __be16 usedbytes;
84 __be16 firstused;
85 __u8 holes;
86 __u8 pad1;
87 xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE];
88
89} xfs_attr_leaf_hdr_t;
90
91typedef struct xfs_attr_leaf_entry {
92 __be32 hashval;
93 __be16 nameidx;
94 __u8 flags;
95 __u8 pad2;
96} xfs_attr_leaf_entry_t;
97
98typedef struct xfs_attr_leaf_name_local {
99 __be16 valuelen;
100 __u8 namelen;
101 __u8 nameval[1];
102} xfs_attr_leaf_name_local_t;
103
104typedef struct xfs_attr_leaf_name_remote {
105 __be32 valueblk;
106 __be32 valuelen;
107 __u8 namelen;
108 __u8 name[1];
109} xfs_attr_leaf_name_remote_t;
110
111typedef struct xfs_attr_leafblock {
112 xfs_attr_leaf_hdr_t hdr;
113 xfs_attr_leaf_entry_t entries[1];
114 xfs_attr_leaf_name_local_t namelist;
115 xfs_attr_leaf_name_remote_t valuelist;
116} xfs_attr_leafblock_t;
117
118
119
120
121
122
123#define XFS_ATTR_LOCAL_BIT 0
124#define XFS_ATTR_ROOT_BIT 1
125#define XFS_ATTR_SECURE_BIT 2
126#define XFS_ATTR_INCOMPLETE_BIT 7
127#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT)
128#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT)
129#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT)
130#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT)
131
132
133
134
135
136#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE)
137#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE)
138#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK)
139#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK)
140#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\
141 ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0))
142#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\
143 ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0))
144
145
146
147
148
149#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t))
150
151
152
153
154static inline xfs_attr_leaf_name_remote_t *
155xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx)
156{
157 return (xfs_attr_leaf_name_remote_t *)
158 &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)];
159}
160
161static inline xfs_attr_leaf_name_local_t *
162xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx)
163{
164 return (xfs_attr_leaf_name_local_t *)
165 &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)];
166}
167
168static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx)
169{
170 return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)];
171}
172
173
174
175
176
177
178static inline int xfs_attr_leaf_entsize_remote(int nlen)
179{
180 return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \
181 XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1);
182}
183
184static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen)
185{
186 return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) +
187 XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1);
188}
189
190static inline int xfs_attr_leaf_entsize_local_max(int bsize)
191{
192 return (((bsize) >> 1) + ((bsize) >> 2));
193}
194
195
196
197
198typedef struct xfs_attr_inactive_list {
199 xfs_dablk_t valueblk;
200 int valuelen;
201} xfs_attr_inactive_list_t;
202
203
204
205
206
207
208
209
210
211void xfs_attr_shortform_create(struct xfs_da_args *args);
212void xfs_attr_shortform_add(struct xfs_da_args *args, int forkoff);
213int xfs_attr_shortform_lookup(struct xfs_da_args *args);
214int xfs_attr_shortform_getvalue(struct xfs_da_args *args);
215int xfs_attr_shortform_to_leaf(struct xfs_da_args *args);
216int xfs_attr_shortform_remove(struct xfs_da_args *args);
217int xfs_attr_shortform_list(struct xfs_attr_list_context *context);
218int xfs_attr_shortform_allfit(struct xfs_dabuf *bp, struct xfs_inode *dp);
219int xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes);
220
221
222
223
224
225int xfs_attr_leaf_to_node(struct xfs_da_args *args);
226int xfs_attr_leaf_to_shortform(struct xfs_dabuf *bp,
227 struct xfs_da_args *args, int forkoff);
228int xfs_attr_leaf_clearflag(struct xfs_da_args *args);
229int xfs_attr_leaf_setflag(struct xfs_da_args *args);
230int xfs_attr_leaf_flipflags(xfs_da_args_t *args);
231
232
233
234
235int xfs_attr_leaf_split(struct xfs_da_state *state,
236 struct xfs_da_state_blk *oldblk,
237 struct xfs_da_state_blk *newblk);
238int xfs_attr_leaf_lookup_int(struct xfs_dabuf *leaf,
239 struct xfs_da_args *args);
240int xfs_attr_leaf_getvalue(struct xfs_dabuf *bp, struct xfs_da_args *args);
241int xfs_attr_leaf_add(struct xfs_dabuf *leaf_buffer,
242 struct xfs_da_args *args);
243int xfs_attr_leaf_remove(struct xfs_dabuf *leaf_buffer,
244 struct xfs_da_args *args);
245int xfs_attr_leaf_list_int(struct xfs_dabuf *bp,
246 struct xfs_attr_list_context *context);
247
248
249
250
251int xfs_attr_leaf_toosmall(struct xfs_da_state *state, int *retval);
252void xfs_attr_leaf_unbalance(struct xfs_da_state *state,
253 struct xfs_da_state_blk *drop_blk,
254 struct xfs_da_state_blk *save_blk);
255int xfs_attr_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp);
256
257
258
259
260xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_dabuf *bp, int *count);
261int xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp,
262 struct xfs_dabuf *leaf2_bp);
263int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize,
264 int *local);
265#endif
266