]>
Commit | Line | Data |
---|---|---|
ac27a0ec | 1 | /* |
617ba13b | 2 | File: fs/ext4/xattr.h |
ac27a0ec | 3 | |
617ba13b | 4 | On-disk format of extended attributes for the ext4 filesystem. |
ac27a0ec DK |
5 | |
6 | (C) 2001 Andreas Gruenbacher, <[email protected]> | |
7 | */ | |
8 | ||
9 | #include <linux/xattr.h> | |
10 | ||
11 | /* Magic value in attribute blocks */ | |
617ba13b | 12 | #define EXT4_XATTR_MAGIC 0xEA020000 |
ac27a0ec DK |
13 | |
14 | /* Maximum number of references to one attribute block */ | |
617ba13b | 15 | #define EXT4_XATTR_REFCOUNT_MAX 1024 |
ac27a0ec DK |
16 | |
17 | /* Name indexes */ | |
617ba13b MC |
18 | #define EXT4_XATTR_INDEX_USER 1 |
19 | #define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS 2 | |
20 | #define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT 3 | |
21 | #define EXT4_XATTR_INDEX_TRUSTED 4 | |
22 | #define EXT4_XATTR_INDEX_LUSTRE 5 | |
23 | #define EXT4_XATTR_INDEX_SECURITY 6 | |
67cf5b09 | 24 | #define EXT4_XATTR_INDEX_SYSTEM 7 |
617ba13b MC |
25 | |
26 | struct ext4_xattr_header { | |
ac27a0ec DK |
27 | __le32 h_magic; /* magic number for identification */ |
28 | __le32 h_refcount; /* reference count */ | |
29 | __le32 h_blocks; /* number of disk blocks used */ | |
30 | __le32 h_hash; /* hash value of all attributes */ | |
e6153918 DW |
31 | __le32 h_checksum; /* crc32c(uuid+id+xattrblock) */ |
32 | /* id = inum if refcount=1, blknum otherwise */ | |
33 | __u32 h_reserved[3]; /* zero right now */ | |
ac27a0ec DK |
34 | }; |
35 | ||
617ba13b | 36 | struct ext4_xattr_ibody_header { |
ac27a0ec DK |
37 | __le32 h_magic; /* magic number for identification */ |
38 | }; | |
39 | ||
617ba13b | 40 | struct ext4_xattr_entry { |
ac27a0ec DK |
41 | __u8 e_name_len; /* length of name */ |
42 | __u8 e_name_index; /* attribute name index */ | |
43 | __le16 e_value_offs; /* offset in disk block of value */ | |
44 | __le32 e_value_block; /* disk block attribute is stored on (n/i) */ | |
45 | __le32 e_value_size; /* size of attribute value */ | |
46 | __le32 e_hash; /* hash value of name and value */ | |
47 | char e_name[0]; /* attribute name */ | |
48 | }; | |
49 | ||
617ba13b MC |
50 | #define EXT4_XATTR_PAD_BITS 2 |
51 | #define EXT4_XATTR_PAD (1<<EXT4_XATTR_PAD_BITS) | |
52 | #define EXT4_XATTR_ROUND (EXT4_XATTR_PAD-1) | |
53 | #define EXT4_XATTR_LEN(name_len) \ | |
54 | (((name_len) + EXT4_XATTR_ROUND + \ | |
55 | sizeof(struct ext4_xattr_entry)) & ~EXT4_XATTR_ROUND) | |
56 | #define EXT4_XATTR_NEXT(entry) \ | |
af5bc92d TT |
57 | ((struct ext4_xattr_entry *)( \ |
58 | (char *)(entry) + EXT4_XATTR_LEN((entry)->e_name_len))) | |
617ba13b MC |
59 | #define EXT4_XATTR_SIZE(size) \ |
60 | (((size) + EXT4_XATTR_ROUND) & ~EXT4_XATTR_ROUND) | |
ac27a0ec | 61 | |
6dd4ee7c KS |
62 | #define IHDR(inode, raw_inode) \ |
63 | ((struct ext4_xattr_ibody_header *) \ | |
64 | ((void *)raw_inode + \ | |
65 | EXT4_GOOD_OLD_INODE_SIZE + \ | |
66 | EXT4_I(inode)->i_extra_isize)) | |
67 | #define IFIRST(hdr) ((struct ext4_xattr_entry *)((hdr)+1)) | |
68 | ||
879b3825 TM |
69 | #define BHDR(bh) ((struct ext4_xattr_header *)((bh)->b_data)) |
70 | #define ENTRY(ptr) ((struct ext4_xattr_entry *)(ptr)) | |
71 | #define BFIRST(bh) ENTRY(BHDR(bh)+1) | |
72 | #define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) | |
73 | ||
74 | ||
75 | struct ext4_xattr_info { | |
76 | int name_index; | |
77 | const char *name; | |
78 | const void *value; | |
79 | size_t value_len; | |
80 | }; | |
81 | ||
82 | struct ext4_xattr_search { | |
83 | struct ext4_xattr_entry *first; | |
84 | void *base; | |
85 | void *end; | |
86 | struct ext4_xattr_entry *here; | |
87 | int not_found; | |
88 | }; | |
89 | ||
90 | struct ext4_xattr_ibody_find { | |
91 | struct ext4_xattr_search s; | |
92 | struct ext4_iloc iloc; | |
93 | }; | |
94 | ||
03010a33 | 95 | # ifdef CONFIG_EXT4_FS_XATTR |
ac27a0ec | 96 | |
11e27528 SH |
97 | extern const struct xattr_handler ext4_xattr_user_handler; |
98 | extern const struct xattr_handler ext4_xattr_trusted_handler; | |
99 | extern const struct xattr_handler ext4_xattr_acl_access_handler; | |
100 | extern const struct xattr_handler ext4_xattr_acl_default_handler; | |
101 | extern const struct xattr_handler ext4_xattr_security_handler; | |
ac27a0ec | 102 | |
617ba13b | 103 | extern ssize_t ext4_listxattr(struct dentry *, char *, size_t); |
ac27a0ec | 104 | |
617ba13b | 105 | extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t); |
617ba13b MC |
106 | extern int ext4_xattr_set(struct inode *, int, const char *, const void *, size_t, int); |
107 | extern int ext4_xattr_set_handle(handle_t *, struct inode *, int, const char *, const void *, size_t, int); | |
ac27a0ec | 108 | |
617ba13b MC |
109 | extern void ext4_xattr_delete_inode(handle_t *, struct inode *); |
110 | extern void ext4_xattr_put_super(struct super_block *); | |
ac27a0ec | 111 | |
6dd4ee7c KS |
112 | extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, |
113 | struct ext4_inode *raw_inode, handle_t *handle); | |
114 | ||
5dabfc78 TT |
115 | extern int __init ext4_init_xattr(void); |
116 | extern void ext4_exit_xattr(void); | |
ac27a0ec | 117 | |
11e27528 | 118 | extern const struct xattr_handler *ext4_xattr_handlers[]; |
ac27a0ec | 119 | |
879b3825 TM |
120 | extern int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i, |
121 | struct ext4_xattr_ibody_find *is); | |
122 | extern int ext4_xattr_ibody_get(struct inode *inode, int name_index, | |
123 | const char *name, | |
124 | void *buffer, size_t buffer_size); | |
125 | extern int ext4_xattr_ibody_set(handle_t *handle, struct inode *inode, | |
126 | struct ext4_xattr_info *i, | |
127 | struct ext4_xattr_ibody_find *is); | |
128 | ||
67cf5b09 TM |
129 | extern int ext4_has_inline_data(struct inode *inode); |
130 | extern int ext4_get_inline_size(struct inode *inode); | |
131 | extern int ext4_get_max_inline_size(struct inode *inode); | |
132 | extern int ext4_find_inline_data_nolock(struct inode *inode); | |
133 | extern void ext4_write_inline_data(struct inode *inode, | |
134 | struct ext4_iloc *iloc, | |
135 | void *buffer, loff_t pos, | |
136 | unsigned int len); | |
137 | extern int ext4_prepare_inline_data(handle_t *handle, struct inode *inode, | |
138 | unsigned int len); | |
139 | extern int ext4_init_inline_data(handle_t *handle, struct inode *inode, | |
140 | unsigned int len); | |
141 | extern int ext4_destroy_inline_data(handle_t *handle, struct inode *inode); | |
46c7f254 TM |
142 | |
143 | extern int ext4_readpage_inline(struct inode *inode, struct page *page); | |
f19d5870 TM |
144 | extern int ext4_try_to_write_inline_data(struct address_space *mapping, |
145 | struct inode *inode, | |
146 | loff_t pos, unsigned len, | |
147 | unsigned flags, | |
148 | struct page **pagep); | |
149 | extern int ext4_write_inline_data_end(struct inode *inode, | |
150 | loff_t pos, unsigned len, | |
151 | unsigned copied, | |
152 | struct page *page); | |
3fdcfb66 TM |
153 | extern struct buffer_head * |
154 | ext4_journalled_write_inline_data(struct inode *inode, | |
155 | unsigned len, | |
156 | struct page *page); | |
9c3569b5 TM |
157 | extern int ext4_da_write_inline_data_begin(struct address_space *mapping, |
158 | struct inode *inode, | |
159 | loff_t pos, unsigned len, | |
160 | unsigned flags, | |
161 | struct page **pagep, | |
162 | void **fsdata); | |
163 | extern int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, | |
164 | unsigned len, unsigned copied, | |
165 | struct page *page); | |
3c47d541 TM |
166 | extern int ext4_try_add_inline_entry(handle_t *handle, struct dentry *dentry, |
167 | struct inode *inode); | |
168 | extern int ext4_try_create_inline_dir(handle_t *handle, | |
169 | struct inode *parent, | |
170 | struct inode *inode); | |
65d165d9 TM |
171 | extern int ext4_read_inline_dir(struct file *filp, |
172 | void *dirent, filldir_t filldir, | |
173 | int *has_inline_data); | |
e8e948e7 TM |
174 | extern struct buffer_head *ext4_find_inline_entry(struct inode *dir, |
175 | const struct qstr *d_name, | |
176 | struct ext4_dir_entry_2 **res_dir, | |
177 | int *has_inline_data); | |
03010a33 | 178 | # else /* CONFIG_EXT4_FS_XATTR */ |
ac27a0ec DK |
179 | |
180 | static inline int | |
617ba13b | 181 | ext4_xattr_get(struct inode *inode, int name_index, const char *name, |
ac27a0ec DK |
182 | void *buffer, size_t size, int flags) |
183 | { | |
184 | return -EOPNOTSUPP; | |
185 | } | |
186 | ||
ac27a0ec | 187 | static inline int |
617ba13b | 188 | ext4_xattr_set(struct inode *inode, int name_index, const char *name, |
ac27a0ec DK |
189 | const void *value, size_t size, int flags) |
190 | { | |
191 | return -EOPNOTSUPP; | |
192 | } | |
193 | ||
194 | static inline int | |
617ba13b | 195 | ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, |
ac27a0ec DK |
196 | const char *name, const void *value, size_t size, int flags) |
197 | { | |
198 | return -EOPNOTSUPP; | |
199 | } | |
200 | ||
201 | static inline void | |
617ba13b | 202 | ext4_xattr_delete_inode(handle_t *handle, struct inode *inode) |
ac27a0ec DK |
203 | { |
204 | } | |
205 | ||
206 | static inline void | |
617ba13b | 207 | ext4_xattr_put_super(struct super_block *sb) |
ac27a0ec DK |
208 | { |
209 | } | |
210 | ||
5dabfc78 | 211 | static __init inline int |
19ef2014 | 212 | ext4_init_xattr(void) |
ac27a0ec DK |
213 | { |
214 | return 0; | |
215 | } | |
216 | ||
217 | static inline void | |
5dabfc78 | 218 | ext4_exit_xattr(void) |
ac27a0ec DK |
219 | { |
220 | } | |
221 | ||
6dd4ee7c KS |
222 | static inline int |
223 | ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, | |
224 | struct ext4_inode *raw_inode, handle_t *handle) | |
225 | { | |
226 | return -EOPNOTSUPP; | |
227 | } | |
228 | ||
617ba13b | 229 | #define ext4_xattr_handlers NULL |
ac27a0ec | 230 | |
879b3825 TM |
231 | static inline int |
232 | ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i, | |
233 | struct ext4_xattr_ibody_find *is) | |
234 | { | |
235 | return -EOPNOTSUPP; | |
236 | } | |
237 | ||
238 | static inline int | |
239 | ext4_xattr_ibody_set(handle_t *handle, struct inode *inode, | |
240 | struct ext4_xattr_info *i, | |
241 | struct ext4_xattr_ibody_find *is) | |
242 | { | |
243 | return -EOPNOTSUPP; | |
244 | } | |
245 | ||
246 | static inline int | |
247 | ext4_xattr_ibody_get(struct inode *inode, int name_index, | |
248 | const char *name, | |
249 | void *buffer, size_t buffer_size) | |
250 | { | |
251 | return -EOPNOTSUPP; | |
252 | } | |
253 | ||
67cf5b09 TM |
254 | static inline int ext4_find_inline_data_nolock(struct inode *inode) |
255 | { | |
256 | return 0; | |
257 | } | |
258 | ||
259 | static inline int ext4_has_inline_data(struct inode *inode) | |
260 | { | |
261 | return 0; | |
262 | } | |
263 | ||
264 | static inline int ext4_get_inline_size(struct inode *inode) | |
265 | { | |
266 | return 0; | |
267 | } | |
268 | ||
269 | static inline int ext4_get_max_inline_size(struct inode *inode) | |
270 | { | |
271 | return 0; | |
272 | } | |
273 | ||
274 | static inline void ext4_write_inline_data(struct inode *inode, | |
275 | struct ext4_iloc *iloc, | |
276 | void *buffer, loff_t pos, | |
277 | unsigned int len) | |
278 | { | |
279 | return; | |
280 | } | |
281 | ||
282 | static inline int ext4_init_inline_data(handle_t *handle, | |
283 | struct inode *inode, | |
284 | unsigned int len) | |
285 | { | |
286 | return 0; | |
287 | } | |
288 | ||
289 | static inline int ext4_destroy_inline_data(handle_t *handle, | |
290 | struct inode *inode) | |
291 | { | |
292 | return 0; | |
293 | } | |
46c7f254 TM |
294 | |
295 | static inline int ext4_readpage_inline(struct inode *inode, struct page *page) | |
296 | { | |
297 | return 0; | |
298 | } | |
f19d5870 TM |
299 | |
300 | static inline int ext4_try_to_write_inline_data(struct address_space *mapping, | |
301 | struct inode *inode, | |
302 | loff_t pos, unsigned len, | |
303 | unsigned flags, | |
304 | struct page **pagep) | |
305 | { | |
306 | return 0; | |
307 | } | |
308 | ||
309 | static inline int ext4_write_inline_data_end(struct inode *inode, | |
310 | loff_t pos, unsigned len, | |
311 | unsigned copied, | |
312 | struct page *page) | |
313 | { | |
314 | return 0; | |
315 | } | |
3fdcfb66 TM |
316 | |
317 | static inline struct buffer_head * | |
318 | ext4_journalled_write_inline_data(struct inode *inode, | |
319 | unsigned len, | |
320 | struct page *page) | |
321 | { | |
322 | return NULL; | |
323 | } | |
9c3569b5 TM |
324 | |
325 | static inline int | |
326 | ext4_da_write_inline_data_begin(struct address_space *mapping, | |
327 | struct inode *inode, | |
328 | loff_t pos, unsigned len, | |
329 | unsigned flags, | |
330 | struct page **pagep, | |
331 | void **fsdata) | |
332 | { | |
333 | return 0; | |
334 | } | |
335 | ||
336 | static inline int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, | |
337 | unsigned len, unsigned copied, | |
338 | struct page *page) | |
339 | { | |
340 | return 0; | |
341 | } | |
3c47d541 TM |
342 | |
343 | static inline int ext4_try_add_inline_entry(handle_t *handle, | |
344 | struct dentry *dentry, | |
345 | struct inode *inode) | |
346 | { | |
347 | return 0; | |
348 | } | |
349 | ||
350 | static inline int ext4_try_create_inline_dir(handle_t *handle, | |
351 | struct inode *parent, | |
352 | struct inode *inode) | |
353 | { | |
354 | return 0; | |
355 | } | |
65d165d9 TM |
356 | static inline int ext4_read_inline_dir(struct file *filp, |
357 | void *dirent, filldir_t filldir, | |
358 | int *has_inline_data) | |
359 | { | |
360 | return 0; | |
361 | } | |
e8e948e7 TM |
362 | |
363 | static inline struct buffer_head * | |
364 | ext4_find_inline_entry(struct inode *dir, | |
365 | const struct qstr *d_name, | |
366 | struct ext4_dir_entry_2 **res_dir, | |
367 | int *has_inline_data) | |
368 | { | |
369 | return NULL; | |
370 | } | |
03010a33 | 371 | # endif /* CONFIG_EXT4_FS_XATTR */ |
ac27a0ec | 372 | |
03010a33 | 373 | #ifdef CONFIG_EXT4_FS_SECURITY |
617ba13b | 374 | extern int ext4_init_security(handle_t *handle, struct inode *inode, |
2a7dba39 | 375 | struct inode *dir, const struct qstr *qstr); |
ac27a0ec | 376 | #else |
617ba13b | 377 | static inline int ext4_init_security(handle_t *handle, struct inode *inode, |
2a7dba39 | 378 | struct inode *dir, const struct qstr *qstr) |
ac27a0ec DK |
379 | { |
380 | return 0; | |
381 | } | |
382 | #endif |