| From c2c92dc7916eae0ded23057404a9af50f9890b5e Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Fri, 11 Sep 2009 16:51:28 -0400 |
| Subject: [PATCH 29/85] ext4: Fix initalization of s_flex_groups |
| |
| (cherry picked from commit 7ad9bb651fc2036ea94bed94da76a4b08959a911) |
| |
| The s_flex_groups array should have been initialized using atomic_add |
| to sum up the free counts from the block groups that make up a |
| flex_bg. By using atomic_set, the value of the s_flex_groups array |
| was set to the values of the last block group in the flex_bg. |
| |
| The impact of this bug is that the block and inode allocation |
| algorithms might not pick the best flex_bg for new allocation. |
| |
| Thanks to Damien Guibouret for pointing out this problem! |
| |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/super.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -1696,12 +1696,12 @@ static int ext4_fill_flex_info(struct su |
| gdp = ext4_get_group_desc(sb, i, NULL); |
| |
| flex_group = ext4_flex_group(sbi, i); |
| - atomic_set(&sbi->s_flex_groups[flex_group].free_inodes, |
| - ext4_free_inodes_count(sb, gdp)); |
| - atomic_set(&sbi->s_flex_groups[flex_group].free_blocks, |
| - ext4_free_blks_count(sb, gdp)); |
| - atomic_set(&sbi->s_flex_groups[flex_group].used_dirs, |
| - ext4_used_dirs_count(sb, gdp)); |
| + atomic_add(ext4_free_inodes_count(sb, gdp), |
| + &sbi->s_flex_groups[flex_group].free_inodes); |
| + atomic_add(ext4_free_blks_count(sb, gdp), |
| + &sbi->s_flex_groups[flex_group].free_blocks); |
| + atomic_add(ext4_used_dirs_count(sb, gdp), |
| + &sbi->s_flex_groups[flex_group].used_dirs); |
| } |
| |
| return 1; |