1 Index: linux-2.4.20/fs/ext3/extents-in-ea.c
2 ===================================================================
3 --- linux-2.4.20.orig/fs/ext3/extents-in-ea.c 2004-01-24 14:54:37.000000000 +0300
4 +++ linux-2.4.20/fs/ext3/extents-in-ea.c 2004-01-24 14:55:10.000000000 +0300
10 +ext3_ext_store_extent_cb(struct ext3_extents_tree *tree,
11 + struct ext3_ext_path *path,
12 + struct ext3_extent *newex, int exist)
14 + struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private;
17 + return EXT_CONTINUE;
20 + if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen)
23 + if (!copy_to_user(buf->cur, newex, sizeof(*newex))) {
25 + buf->cur += sizeof(*newex);
30 + return EXT_CONTINUE;
34 +ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree,
35 + struct ext3_ext_path *path,
36 + struct ext3_extent *ex, int exist)
38 + struct ext3_extent_tree_stats *buf =
39 + (struct ext3_extent_tree_stats *) tree->private;
43 + return EXT_CONTINUE;
45 + depth = EXT_DEPTH(tree);
47 + if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr))
49 + return EXT_CONTINUE;
52 +struct ea_tree_desc {
57 +int ext3_ext_in_ea_ioctl(struct inode *inode, struct file *filp,
58 + unsigned int cmd, unsigned long arg)
62 + if (cmd == EXT3_IOC_EA_TREE_INIT) {
63 + struct ea_tree_desc desc;
65 + if (copy_from_user(&desc, (void *) arg, sizeof(desc)))
67 + err = ext3_init_tree_in_ea(inode, desc.name_index,
69 + } else if (cmd == EXT3_IOC_GET_EA_EXTENTS) {
70 + struct ext3_extents_tree tree;
71 + struct ext3_extent_buf buf;
72 + struct ea_tree_desc desc;
74 + if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
76 + if (copy_from_user(&desc, buf.cur, sizeof(desc)))
78 + err = ext3_init_tree_in_ea_desc(&tree, inode,
79 + desc.name_index, desc.eaname);
82 + buf.cur = buf.buffer;
84 + tree.private = &buf;
85 + err = ext3_ext_walk_space(&tree, buf.start, 0xffffffff,
86 + ext3_ext_store_extent_cb);
89 + ext3_release_tree_in_ea_desc(&tree);
90 + } else if (cmd == EXT3_IOC_EA_TREE_ALLOCATE) {
91 + struct ext3_extent_buf buf;
92 + struct ea_tree_desc desc;
94 + if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
96 + if (copy_from_user(&desc, buf.cur, sizeof(desc)))
98 + err = ext3_ext_in_ea_alloc_space(inode, desc.name_index,
99 + desc.eaname, buf.start,
101 + } else if (cmd == EXT3_IOC_EA_TREE_REMOVE) {
102 + struct ext3_extent_buf buf;
103 + struct ea_tree_desc desc;
105 + if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
107 + if (copy_from_user(&desc, buf.cur, sizeof(desc)))
109 + err = ext3_ext_in_ea_remove_space(inode, desc.name_index,
110 + desc.eaname, buf.start,
118 Index: linux-2.4.20/fs/ext3/ioctl.c
119 ===================================================================
120 --- linux-2.4.20.orig/fs/ext3/ioctl.c 2004-01-24 14:54:31.000000000 +0300
121 +++ linux-2.4.20/fs/ext3/ioctl.c 2004-01-24 14:55:04.000000000 +0300
123 case EXT3_IOC_GET_TREE_STATS:
124 case EXT3_IOC_GET_TREE_DEPTH:
125 return ext3_ext_ioctl(inode, filp, cmd, arg);
126 + case EXT3_IOC_GET_EA_EXTENTS:
127 + case EXT3_IOC_GET_EA_TREE_DEPTH:
128 + case EXT3_IOC_GET_EA_TREE_STATS:
129 + case EXT3_IOC_EA_TREE_INIT:
130 + case EXT3_IOC_EA_TREE_ALLOCATE:
131 + case EXT3_IOC_EA_TREE_REMOVE:
132 + return ext3_ext_in_ea_ioctl(inode, filp, cmd, arg);
136 Index: linux-2.4.20/include/linux/ext3_fs.h
137 ===================================================================
138 --- linux-2.4.20.orig/include/linux/ext3_fs.h 2004-01-24 01:28:06.000000000 +0300
139 +++ linux-2.4.20/include/linux/ext3_fs.h 2004-01-24 14:55:04.000000000 +0300
141 #define EXT3_IOC_GET_TREE_DEPTH _IOR('f', 6, long)
142 #define EXT3_IOC_GET_TREE_STATS _IOR('f', 7, long)
144 +#define EXT3_IOC_GET_EA_EXTENTS _IOR('f', 10, long)
145 +#define EXT3_IOC_GET_EA_TREE_DEPTH _IOR('f', 11, long)
146 +#define EXT3_IOC_GET_EA_TREE_STATS _IOR('f', 12, long)
147 +#define EXT3_IOC_EA_TREE_INIT _IOW('f', 13, long)
148 +#define EXT3_IOC_EA_TREE_ALLOCATE _IOW('f', 14, long)
149 +#define EXT3_IOC_EA_TREE_REMOVE _IOW('f', 15, long)
153 * Structure of an inode on the disk