Whamcloud - gitweb
- missed patches from suse-2.4.21-2 series added
[fs/lustre-release.git] / lustre / kernel_patches / patches / ext3-extents-in-ea-ioctl-2.4.20.patch
1 Index: linux-2.4.24/fs/ext3/extents-in-ea.c
2 ===================================================================
3 --- linux-2.4.24.orig/fs/ext3/extents-in-ea.c   2004-08-10 16:13:06.000000000 +0400
4 +++ linux-2.4.24/fs/ext3/extents-in-ea.c        2004-08-10 16:18:18.000000000 +0400
5 @@ -222,3 +222,112 @@
6         return err;
7  }
8  
9 +static int
10 +ext3_ext_store_extent_cb(struct ext3_extents_tree *tree,
11 +                       struct ext3_ext_path *path,
12 +                       struct ext3_extent *newex, int exist)
13 +{
14 +       struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private;
15 +
16 +       if (!exist)
17 +               return EXT_CONTINUE;
18 +       if (buf->err < 0)
19 +               return EXT_BREAK;
20 +       if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen)
21 +               return EXT_BREAK;
22 +
23 +       if (!copy_to_user(buf->cur, newex, sizeof(*newex))) {
24 +               buf->err++;
25 +               buf->cur += sizeof(*newex);
26 +       } else {
27 +               buf->err = -EFAULT;
28 +               return EXT_BREAK;
29 +       }
30 +       return EXT_CONTINUE;
31 +}
32 +
33 +static int
34 +ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree,
35 +                       struct ext3_ext_path *path,
36 +                       struct ext3_extent *ex, int exist)
37 +{
38 +       struct ext3_extent_tree_stats *buf =
39 +               (struct ext3_extent_tree_stats *) tree->private;
40 +       int depth;
41 +
42 +       if (!exist)
43 +               return EXT_CONTINUE;
44 +
45 +       depth = EXT_DEPTH(tree);
46 +       buf->extents_num++;
47 +       if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr))
48 +               buf->leaf_num++;
49 +       return EXT_CONTINUE;
50 +}
51 +
52 +struct ea_tree_desc {
53 +       int name_index;
54 +       char eaname[256];
55 +};
56 +
57 +int ext3_ext_in_ea_ioctl(struct inode *inode, struct file *filp,
58 +                               unsigned int cmd, unsigned long arg)
59 +{
60 +       int err = 0;
61 +
62 +       if (cmd == EXT3_IOC_EA_TREE_INIT) {
63 +               struct ea_tree_desc desc;
64 +
65 +               if (copy_from_user(&desc, (void *) arg, sizeof(desc)))
66 +                       return -EFAULT;
67 +               err = ext3_init_tree_in_ea(inode, desc.name_index,
68 +                                               desc.eaname, 64);
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;
73 +
74 +               if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
75 +                       return -EFAULT;
76 +               if (copy_from_user(&desc, buf.cur, sizeof(desc)))
77 +                       return -EFAULT;
78 +               err = ext3_init_tree_in_ea_desc(&tree, inode,
79 +                                               desc.name_index, desc.eaname);
80 +               if (err)
81 +                       goto out;
82 +               buf.cur = buf.buffer;
83 +               buf.err = 0;
84 +               tree.private = &buf;
85 +               err = ext3_ext_walk_space(&tree, buf.start, EXT_MAX_BLOCK,
86 +                                               ext3_ext_store_extent_cb);
87 +               if (err == 0)
88 +                       err = buf.err;
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;
93 +
94 +               if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
95 +                       return -EFAULT;
96 +               if (copy_from_user(&desc, buf.cur, sizeof(desc)))
97 +                       return -EFAULT;
98 +               err = ext3_ext_in_ea_alloc_space(inode, desc.name_index,
99 +                                               desc.eaname, buf.start,
100 +                                               buf.err);
101 +       } else if (cmd == EXT3_IOC_EA_TREE_REMOVE) {
102 +               struct ext3_extent_buf buf;
103 +               struct ea_tree_desc desc;
104 +
105 +               if (copy_from_user(&buf, (void *) arg, sizeof(buf)))
106 +                       return -EFAULT;
107 +               if (copy_from_user(&desc, buf.cur, sizeof(desc)))
108 +                       return -EFAULT;
109 +               err = ext3_ext_in_ea_remove_space(inode, desc.name_index,
110 +                                               desc.eaname, buf.start,
111 +                                               buf.err);
112 +       }
113 +
114 +out:
115 +       return err;
116 +}
117 +
118 Index: linux-2.4.24/fs/ext3/ioctl.c
119 ===================================================================
120 --- linux-2.4.24.orig/fs/ext3/ioctl.c   2004-08-10 16:09:22.000000000 +0400
121 +++ linux-2.4.24/fs/ext3/ioctl.c        2004-08-10 16:14:40.000000000 +0400
122 @@ -178,6 +178,13 @@
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);
133         default:
134                 return -ENOTTY;
135         }
136 Index: linux-2.4.24/include/linux/ext3_fs.h
137 ===================================================================
138 --- linux-2.4.24.orig/include/linux/ext3_fs.h   2004-08-10 16:09:22.000000000 +0400
139 +++ linux-2.4.24/include/linux/ext3_fs.h        2004-08-10 16:14:40.000000000 +0400
140 @@ -214,6 +214,14 @@
141  #define        EXT3_IOC_GET_TREE_DEPTH         _IOR('f', 6, long)
142  #define        EXT3_IOC_GET_TREE_STATS         _IOR('f', 7, long)
143  
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)
150 +
151 +
152  /*
153   * Structure of an inode on the disk
154   */