1 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/acl.c linux-2.6.4-51.0/fs/ext3/acl.c
2 --- linux-2.6.4-51.0.orig/fs/ext3/acl.c 2004-04-05 19:41:59.000000000 +0300
3 +++ linux-2.6.4-51.0/fs/ext3/acl.c 2004-04-07 11:06:33.000000000 +0300
6 #include <linux/ext3_jbd.h>
7 #include <linux/ext3_fs.h>
9 +#include <linux/ext3_xattr.h>
13 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/file.c linux-2.6.4-51.0/fs/ext3/file.c
14 --- linux-2.6.4-51.0.orig/fs/ext3/file.c 2004-04-05 19:41:59.000000000 +0300
15 +++ linux-2.6.4-51.0/fs/ext3/file.c 2004-04-07 11:06:39.000000000 +0300
17 #include <linux/jbd.h>
18 #include <linux/ext3_fs.h>
19 #include <linux/ext3_jbd.h>
21 +#include <linux/ext3_xattr.h>
25 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/ialloc.c linux-2.6.4-51.0/fs/ext3/ialloc.c
26 --- linux-2.6.4-51.0.orig/fs/ext3/ialloc.c 2004-04-06 22:17:15.000000000 +0300
27 +++ linux-2.6.4-51.0/fs/ext3/ialloc.c 2004-04-07 11:06:46.000000000 +0300
29 #include <asm/bitops.h>
30 #include <asm/byteorder.h>
33 +#include <linux/ext3_xattr.h>
37 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/inode.c linux-2.6.4-51.0/fs/ext3/inode.c
38 --- linux-2.6.4-51.0.orig/fs/ext3/inode.c 2004-04-06 22:17:15.000000000 +0300
39 +++ linux-2.6.4-51.0/fs/ext3/inode.c 2004-04-07 11:25:05.000000000 +0300
41 #include <linux/writeback.h>
42 #include <linux/mpage.h>
43 #include <linux/uio.h>
45 +#include <linux/ext3_xattr.h>
49 @@ -2340,7 +2340,7 @@ static unsigned long ext3_get_inode_bloc
52 int ext3_get_inode_loc(struct inode *inode,
53 - struct ext3_iloc *iloc, int in_mem)
54 + struct ext3_iloc *iloc, int in_mem)
57 struct buffer_head *bh;
58 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/namei.c linux-2.6.4-51.0/fs/ext3/namei.c
59 --- linux-2.6.4-51.0.orig/fs/ext3/namei.c 2004-04-06 22:17:15.000000000 +0300
60 +++ linux-2.6.4-51.0/fs/ext3/namei.c 2004-04-07 11:06:57.000000000 +0300
62 #include <linux/quotaops.h>
63 #include <linux/buffer_head.h>
64 #include <linux/smp_lock.h>
66 +#include <linux/ext3_xattr.h>
70 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/super.c linux-2.6.4-51.0/fs/ext3/super.c
71 --- linux-2.6.4-51.0.orig/fs/ext3/super.c 2004-04-06 22:17:15.000000000 +0300
72 +++ linux-2.6.4-51.0/fs/ext3/super.c 2004-04-07 11:07:05.000000000 +0300
74 #include <linux/vfs.h>
75 #include <linux/random.h>
76 #include <asm/uaccess.h>
78 +#include <linux/ext3_xattr.h>
81 static int ext3_load_journal(struct super_block *, struct ext3_super_block *);
82 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/symlink.c linux-2.6.4-51.0/fs/ext3/symlink.c
83 --- linux-2.6.4-51.0.orig/fs/ext3/symlink.c 2004-04-05 19:41:59.000000000 +0300
84 +++ linux-2.6.4-51.0/fs/ext3/symlink.c 2004-04-07 11:07:16.000000000 +0300
87 #include <linux/jbd.h>
88 #include <linux/ext3_fs.h>
90 +#include <linux/ext3_xattr.h>
93 ext3_readlink(struct dentry *dentry, char __user *buffer, int buflen)
94 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/xattr.c linux-2.6.4-51.0/fs/ext3/xattr.c
95 --- linux-2.6.4-51.0.orig/fs/ext3/xattr.c 2004-04-06 22:17:15.000000000 +0300
96 +++ linux-2.6.4-51.0/fs/ext3/xattr.c 2004-04-07 11:22:34.000000000 +0300
98 #include <linux/mbcache.h>
99 #include <linux/quotaops.h>
100 #include <linux/rwsem.h>
102 +#include <linux/ext3_xattr.h>
105 #define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data))
106 @@ -348,7 +348,7 @@ cleanup:
109 ext3_xattr_ibody_get(struct inode *inode, int name_index, const char *name,
110 - void *buffer, size_t buffer_size)
111 + void *buffer, size_t buffer_size)
113 int size, name_len = strlen(name), storage_size;
114 struct ext3_xattr_entry *last;
115 @@ -360,7 +360,7 @@ ext3_xattr_ibody_get(struct inode *inode
116 if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
119 - ret = ext3_get_inode_loc(inode, &iloc);
120 + ret = ext3_get_inode_loc(inode, &iloc, 1);
123 raw_inode = ext3_raw_inode(&iloc);
124 @@ -542,7 +542,7 @@ ext3_xattr_ibody_list(struct inode *inod
125 if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
128 - ret = ext3_get_inode_loc(inode, &iloc);
129 + ret = ext3_get_inode_loc(inode, &iloc, 1);
132 raw_inode = ext3_raw_inode(&iloc);
133 @@ -693,7 +693,7 @@ ext3_xattr_ibody_find(struct inode *inod
134 if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
137 - err = ext3_get_inode_loc(inode, &iloc);
138 + err = ext3_get_inode_loc(inode, &iloc, 1);
141 raw_inode = ext3_raw_inode(&iloc);
142 @@ -824,7 +824,7 @@ ext3_xattr_ibody_set(handle_t *handle, s
143 if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
146 - err = ext3_get_inode_loc(inode, &iloc);
147 + err = ext3_get_inode_loc(inode, &iloc, 1);
150 raw_inode = ext3_raw_inode(&iloc);
151 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/xattr.h linux-2.6.4-51.0/fs/ext3/xattr.h
152 --- linux-2.6.4-51.0.orig/fs/ext3/xattr.h 2004-04-06 22:17:15.000000000 +0300
153 +++ linux-2.6.4-51.0/fs/ext3/xattr.h 1970-01-01 03:00:00.000000000 +0300
156 - File: fs/ext3/xattr.h
158 - On-disk format of extended attributes for the ext3 filesystem.
160 - (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
163 -#include <linux/config.h>
164 -#include <linux/xattr.h>
166 -/* Magic value in attribute blocks */
167 -#define EXT3_XATTR_MAGIC 0xEA020000
169 -/* Maximum number of references to one attribute block */
170 -#define EXT3_XATTR_REFCOUNT_MAX 1024
173 -#define EXT3_XATTR_INDEX_MAX 10
174 -#define EXT3_XATTR_INDEX_USER 1
175 -#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2
176 -#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3
177 -#define EXT3_XATTR_INDEX_TRUSTED 4
178 -#define EXT3_XATTR_INDEX_LUSTRE 5
179 -#define EXT3_XATTR_INDEX_SECURITY 6
181 -struct ext3_xattr_header {
182 - __u32 h_magic; /* magic number for identification */
183 - __u32 h_refcount; /* reference count */
184 - __u32 h_blocks; /* number of disk blocks used */
185 - __u32 h_hash; /* hash value of all attributes */
186 - __u32 h_reserved[4]; /* zero right now */
189 -struct ext3_xattr_entry {
190 - __u8 e_name_len; /* length of name */
191 - __u8 e_name_index; /* attribute name index */
192 - __u16 e_value_offs; /* offset in disk block of value */
193 - __u32 e_value_block; /* disk block attribute is stored on (n/i) */
194 - __u32 e_value_size; /* size of attribute value */
195 - __u32 e_hash; /* hash value of name and value */
196 - char e_name[0]; /* attribute name */
199 -#define EXT3_XATTR_PAD_BITS 2
200 -#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS)
201 -#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1)
202 -#define EXT3_XATTR_LEN(name_len) \
203 - (((name_len) + EXT3_XATTR_ROUND + \
204 - sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND)
205 -#define EXT3_XATTR_NEXT(entry) \
206 - ( (struct ext3_xattr_entry *)( \
207 - (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) )
208 -#define EXT3_XATTR_SIZE(size) \
209 - (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND)
211 -# ifdef CONFIG_EXT3_FS_XATTR
213 -struct ext3_xattr_handler {
215 - size_t (*list)(char *list, struct inode *inode, const char *name,
217 - int (*get)(struct inode *inode, const char *name, void *buffer,
219 - int (*set)(struct inode *inode, const char *name, const void *buffer,
220 - size_t size, int flags);
223 -extern int ext3_xattr_register(int, struct ext3_xattr_handler *);
224 -extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *);
226 -extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int);
227 -extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t);
228 -extern ssize_t ext3_listxattr(struct dentry *, char *, size_t);
229 -extern int ext3_removexattr(struct dentry *, const char *);
231 -extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t);
232 -extern int ext3_xattr_list(struct inode *, char *, size_t);
233 -extern int ext3_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
234 -extern int ext3_xattr_set_handle(handle_t *, struct inode *, int, const char *,const void *,size_t,int);
235 -extern int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *,const void *,size_t,int);
237 -extern void ext3_xattr_delete_inode(handle_t *, struct inode *);
238 -extern void ext3_xattr_put_super(struct super_block *);
240 -extern int init_ext3_xattr(void);
241 -extern void exit_ext3_xattr(void);
243 -# else /* CONFIG_EXT3_FS_XATTR */
244 -# define ext3_setxattr NULL
245 -# define ext3_getxattr NULL
246 -# define ext3_listxattr NULL
247 -# define ext3_removexattr NULL
250 -ext3_xattr_get(struct inode *inode, int name_index, const char *name,
251 - void *buffer, size_t size, int flags)
253 - return -EOPNOTSUPP;
257 -ext3_xattr_list(struct inode *inode, void *buffer, size_t size)
259 - return -EOPNOTSUPP;
263 -ext3_xattr_set(struct inode *inode, int name_index, const char *name,
264 - const void *value, size_t size, int flags)
266 - return -EOPNOTSUPP;
270 -ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
271 - const char *name, const void *value, size_t size, int flags)
273 - return -EOPNOTSUPP;
277 -ext3_xattr_delete_inode(handle_t *handle, struct inode *inode)
282 -ext3_xattr_put_super(struct super_block *sb)
287 -init_ext3_xattr(void)
293 -exit_ext3_xattr(void)
297 -# endif /* CONFIG_EXT3_FS_XATTR */
299 -extern struct ext3_xattr_handler ext3_xattr_user_handler;
300 -extern struct ext3_xattr_handler ext3_xattr_trusted_handler;
301 -extern struct ext3_xattr_handler ext3_xattr_security_handler;
302 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/xattr_security.c linux-2.6.4-51.0/fs/ext3/xattr_security.c
303 --- linux-2.6.4-51.0.orig/fs/ext3/xattr_security.c 2004-04-05 19:41:59.000000000 +0300
304 +++ linux-2.6.4-51.0/fs/ext3/xattr_security.c 2004-04-07 11:06:22.000000000 +0300
306 #include <linux/smp_lock.h>
307 #include <linux/ext3_jbd.h>
308 #include <linux/ext3_fs.h>
310 +#include <linux/ext3_xattr.h>
313 ext3_xattr_security_list(char *list, struct inode *inode,
314 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/xattr_trusted.c linux-2.6.4-51.0/fs/ext3/xattr_trusted.c
315 --- linux-2.6.4-51.0.orig/fs/ext3/xattr_trusted.c 2004-04-05 19:41:59.000000000 +0300
316 +++ linux-2.6.4-51.0/fs/ext3/xattr_trusted.c 2004-04-07 11:07:41.000000000 +0300
318 #include <linux/smp_lock.h>
319 #include <linux/ext3_jbd.h>
320 #include <linux/ext3_fs.h>
322 +#include <linux/ext3_xattr.h>
324 #define XATTR_TRUSTED_PREFIX "trusted."
326 diff -rupN linux-2.6.4-51.0.orig/fs/ext3/xattr_user.c linux-2.6.4-51.0/fs/ext3/xattr_user.c
327 --- linux-2.6.4-51.0.orig/fs/ext3/xattr_user.c 2004-04-05 19:41:59.000000000 +0300
328 +++ linux-2.6.4-51.0/fs/ext3/xattr_user.c 2004-04-07 11:07:47.000000000 +0300
330 #include <linux/smp_lock.h>
331 #include <linux/ext3_jbd.h>
332 #include <linux/ext3_fs.h>
334 +#include <linux/ext3_xattr.h>
336 #define XATTR_USER_PREFIX "user."
338 diff -rupN linux-2.6.4-51.0.orig/include/linux/ext3_fs.h linux-2.6.4-51.0/include/linux/ext3_fs.h
339 --- linux-2.6.4-51.0.orig/include/linux/ext3_fs.h 2004-04-06 22:17:15.000000000 +0300
340 +++ linux-2.6.4-51.0/include/linux/ext3_fs.h 2004-04-07 11:13:26.000000000 +0300
341 @@ -741,6 +741,9 @@ extern void ext3_truncate (struct inode
342 extern void ext3_set_inode_flags(struct inode *);
343 extern void ext3_set_aops(struct inode *inode);
345 +extern int ext3_get_inode_loc(struct inode *inode,
346 + struct ext3_iloc *iloc, int in_mem);
349 extern int ext3_ioctl (struct inode *, struct file *, unsigned int,
351 diff -rupN linux-2.6.4-51.0.orig/include/linux/ext3_xattr.h linux-2.6.4-51.0/include/linux/ext3_xattr.h
352 --- linux-2.6.4-51.0.orig/include/linux/ext3_xattr.h 1970-01-01 03:00:00.000000000 +0300
353 +++ linux-2.6.4-51.0/include/linux/ext3_xattr.h 2004-04-07 11:08:34.000000000 +0300
356 + File: linux/include/linux/ext3_xattr.h
358 + On-disk format of extended attributes for the ext3 filesystem.
360 + (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
363 +#ifndef _LINUX_EXT3_XATTR_H
364 +#define _LINUX_EXT3_XATTR_H
366 +#include <linux/config.h>
367 +#include <linux/xattr.h>
369 +/* Magic value in attribute blocks */
370 +#define EXT3_XATTR_MAGIC 0xEA020000
372 +/* Maximum number of references to one attribute block */
373 +#define EXT3_XATTR_REFCOUNT_MAX 1024
376 +#define EXT3_XATTR_INDEX_MAX 10
377 +#define EXT3_XATTR_INDEX_USER 1
378 +#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2
379 +#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3
380 +#define EXT3_XATTR_INDEX_TRUSTED 4
381 +#define EXT3_XATTR_INDEX_LUSTRE 5
382 +#define EXT3_XATTR_INDEX_SECURITY 6
384 +struct ext3_xattr_header {
385 + __u32 h_magic; /* magic number for identification */
386 + __u32 h_refcount; /* reference count */
387 + __u32 h_blocks; /* number of disk blocks used */
388 + __u32 h_hash; /* hash value of all attributes */
389 + __u32 h_reserved[4]; /* zero right now */
392 +struct ext3_xattr_entry {
393 + __u8 e_name_len; /* length of name */
394 + __u8 e_name_index; /* attribute name index */
395 + __u16 e_value_offs; /* offset in disk block of value */
396 + __u32 e_value_block; /* disk block attribute is stored on (n/i) */
397 + __u32 e_value_size; /* size of attribute value */
398 + __u32 e_hash; /* hash value of name and value */
399 + char e_name[0]; /* attribute name */
402 +#define EXT3_XATTR_PAD_BITS 2
403 +#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS)
404 +#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1)
405 +#define EXT3_XATTR_LEN(name_len) \
406 + (((name_len) + EXT3_XATTR_ROUND + \
407 + sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND)
408 +#define EXT3_XATTR_NEXT(entry) \
409 + ( (struct ext3_xattr_entry *)( \
410 + (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) )
411 +#define EXT3_XATTR_SIZE(size) \
412 + (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND)
414 +# ifdef CONFIG_EXT3_FS_XATTR
416 +struct ext3_xattr_handler {
418 + size_t (*list)(char *list, struct inode *inode, const char *name,
420 + int (*get)(struct inode *inode, const char *name, void *buffer,
422 + int (*set)(struct inode *inode, const char *name, const void *buffer,
423 + size_t size, int flags);
426 +extern int ext3_xattr_register(int, struct ext3_xattr_handler *);
427 +extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *);
429 +extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int);
430 +extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t);
431 +extern ssize_t ext3_listxattr(struct dentry *, char *, size_t);
432 +extern int ext3_removexattr(struct dentry *, const char *);
434 +extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t);
435 +extern int ext3_xattr_list(struct inode *, char *, size_t);
436 +extern int ext3_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
437 +extern int ext3_xattr_set_handle(handle_t *, struct inode *, int, const char *,const void *,size_t,int);
438 +extern int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *,const void *,size_t,int);
440 +extern void ext3_xattr_delete_inode(handle_t *, struct inode *);
441 +extern void ext3_xattr_put_super(struct super_block *);
443 +extern int init_ext3_xattr(void);
444 +extern void exit_ext3_xattr(void);
446 +# else /* CONFIG_EXT3_FS_XATTR */
447 +# define ext3_setxattr NULL
448 +# define ext3_getxattr NULL
449 +# define ext3_listxattr NULL
450 +# define ext3_removexattr NULL
453 +ext3_xattr_get(struct inode *inode, int name_index, const char *name,
454 + void *buffer, size_t size, int flags)
456 + return -EOPNOTSUPP;
460 +ext3_xattr_list(struct inode *inode, void *buffer, size_t size)
462 + return -EOPNOTSUPP;
466 +ext3_xattr_set(struct inode *inode, int name_index, const char *name,
467 + const void *value, size_t size, int flags)
469 + return -EOPNOTSUPP;
473 +ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
474 + const char *name, const void *value, size_t size, int flags)
476 + return -EOPNOTSUPP;
480 +ext3_xattr_delete_inode(handle_t *handle, struct inode *inode)
485 +ext3_xattr_put_super(struct super_block *sb)
490 +init_ext3_xattr(void)
496 +exit_ext3_xattr(void)
500 +# endif /* CONFIG_EXT3_FS_XATTR */
502 +extern struct ext3_xattr_handler ext3_xattr_user_handler;
503 +extern struct ext3_xattr_handler ext3_xattr_trusted_handler;
504 +extern struct ext3_xattr_handler ext3_xattr_security_handler;