diff options
author | Eric Sandeen <sandeen@redhat.com> | 2011-06-28 10:01:31 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-06-28 10:01:31 -0400 |
commit | f86186b44b4164600cce03d0d93ad48ec21fa429 (patch) | |
tree | 48aafabbbe46d22de84e4e9b3ebf7c5b35fd6d1e /fs/ext4/indirect.c | |
parent | dae1e52cb1267bf8f52e5e47a80fab566d7e8aa4 (diff) |
ext4: refactor duplicated block placement code
I found that ext4_ext_find_goal() and ext4_find_near()
share the same code for returning a coloured start block
based on i_block_group.
We can refactor this into a common function so that they
don't diverge in the future.
Thanks to adilger for suggesting the new function name.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/indirect.c')
-rw-r--r-- | fs/ext4/indirect.c | 28 |
1 files changed, 1 insertions, 27 deletions
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index c3e85a86e821..6c271115dbb6 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c | |||
@@ -207,11 +207,6 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) | |||
207 | struct ext4_inode_info *ei = EXT4_I(inode); | 207 | struct ext4_inode_info *ei = EXT4_I(inode); |
208 | __le32 *start = ind->bh ? (__le32 *) ind->bh->b_data : ei->i_data; | 208 | __le32 *start = ind->bh ? (__le32 *) ind->bh->b_data : ei->i_data; |
209 | __le32 *p; | 209 | __le32 *p; |
210 | ext4_fsblk_t bg_start; | ||
211 | ext4_fsblk_t last_block; | ||
212 | ext4_grpblk_t colour; | ||
213 | ext4_group_t block_group; | ||
214 | int flex_size = ext4_flex_bg_size(EXT4_SB(inode->i_sb)); | ||
215 | 210 | ||
216 | /* Try to find previous block */ | 211 | /* Try to find previous block */ |
217 | for (p = ind->p - 1; p >= start; p--) { | 212 | for (p = ind->p - 1; p >= start; p--) { |
@@ -227,28 +222,7 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) | |||
227 | * It is going to be referred to from the inode itself? OK, just put it | 222 | * It is going to be referred to from the inode itself? OK, just put it |
228 | * into the same cylinder group then. | 223 | * into the same cylinder group then. |
229 | */ | 224 | */ |
230 | block_group = ei->i_block_group; | 225 | return ext4_inode_to_goal_block(inode); |
231 | if (flex_size >= EXT4_FLEX_SIZE_DIR_ALLOC_SCHEME) { | ||
232 | block_group &= ~(flex_size-1); | ||
233 | if (S_ISREG(inode->i_mode)) | ||
234 | block_group++; | ||
235 | } | ||
236 | bg_start = ext4_group_first_block_no(inode->i_sb, block_group); | ||
237 | last_block = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es) - 1; | ||
238 | |||
239 | /* | ||
240 | * If we are doing delayed allocation, we don't need take | ||
241 | * colour into account. | ||
242 | */ | ||
243 | if (test_opt(inode->i_sb, DELALLOC)) | ||
244 | return bg_start; | ||
245 | |||
246 | if (bg_start + EXT4_BLOCKS_PER_GROUP(inode->i_sb) <= last_block) | ||
247 | colour = (current->pid % 16) * | ||
248 | (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); | ||
249 | else | ||
250 | colour = (current->pid % 16) * ((last_block - bg_start) / 16); | ||
251 | return bg_start + colour; | ||
252 | } | 226 | } |
253 | 227 | ||
254 | /** | 228 | /** |