diff options
author | Yongqiang Yang <xiaoqiangnk@gmail.com> | 2012-01-03 23:22:50 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-01-03 23:22:50 -0500 |
commit | 28c7bac0091687e6116ebd6c179e154ae4053c90 (patch) | |
tree | 1ede48e76c7618d06ea3e34de74cdc13e3f2f129 /fs/ext4 | |
parent | bb08c1e7d8c072da338f6d905a89376b36023017 (diff) |
ext4: add a structure which will be used by 64bit-resize interface
This patch adds a structure which will be used by 64bit-resize interface.
Two functions which allocate and destroy the structure respectively are
added.
Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/resize.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 3bb4e7b502ec..6076d5e4b513 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -134,6 +134,61 @@ static int verify_group_input(struct super_block *sb, | |||
134 | return err; | 134 | return err; |
135 | } | 135 | } |
136 | 136 | ||
137 | /* | ||
138 | * ext4_new_flex_group_data is used by 64bit-resize interface to add a flex | ||
139 | * group each time. | ||
140 | */ | ||
141 | struct ext4_new_flex_group_data { | ||
142 | struct ext4_new_group_data *groups; /* new_group_data for groups | ||
143 | in the flex group */ | ||
144 | __u16 *bg_flags; /* block group flags of groups | ||
145 | in @groups */ | ||
146 | ext4_group_t count; /* number of groups in @groups | ||
147 | */ | ||
148 | }; | ||
149 | |||
150 | /* | ||
151 | * alloc_flex_gd() allocates a ext4_new_flex_group_data with size of | ||
152 | * @flexbg_size. | ||
153 | * | ||
154 | * Returns NULL on failure otherwise address of the allocated structure. | ||
155 | */ | ||
156 | static struct ext4_new_flex_group_data *alloc_flex_gd(unsigned long flexbg_size) | ||
157 | { | ||
158 | struct ext4_new_flex_group_data *flex_gd; | ||
159 | |||
160 | flex_gd = kmalloc(sizeof(*flex_gd), GFP_NOFS); | ||
161 | if (flex_gd == NULL) | ||
162 | goto out3; | ||
163 | |||
164 | flex_gd->count = flexbg_size; | ||
165 | |||
166 | flex_gd->groups = kmalloc(sizeof(struct ext4_new_group_data) * | ||
167 | flexbg_size, GFP_NOFS); | ||
168 | if (flex_gd->groups == NULL) | ||
169 | goto out2; | ||
170 | |||
171 | flex_gd->bg_flags = kmalloc(flexbg_size * sizeof(__u16), GFP_NOFS); | ||
172 | if (flex_gd->bg_flags == NULL) | ||
173 | goto out1; | ||
174 | |||
175 | return flex_gd; | ||
176 | |||
177 | out1: | ||
178 | kfree(flex_gd->groups); | ||
179 | out2: | ||
180 | kfree(flex_gd); | ||
181 | out3: | ||
182 | return NULL; | ||
183 | } | ||
184 | |||
185 | static void free_flex_gd(struct ext4_new_flex_group_data *flex_gd) | ||
186 | { | ||
187 | kfree(flex_gd->bg_flags); | ||
188 | kfree(flex_gd->groups); | ||
189 | kfree(flex_gd); | ||
190 | } | ||
191 | |||
137 | static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, | 192 | static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, |
138 | ext4_fsblk_t blk) | 193 | ext4_fsblk_t blk) |
139 | { | 194 | { |