diff options
author | Theodore Ts'o <tytso@mit.edu> | 2009-09-11 16:51:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-14 08:06:39 -0800 |
commit | 1de54d1bc0248c2b0f21e22b48f145271d38cbd5 (patch) | |
tree | eb3f84c1b605645a0a86099d0e06948ac099108e /fs | |
parent | d78f2ac343787f48e97c87676fccaef850a50cbe (diff) |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/super.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index d9ed5c21948..655cca69b1e 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1696,12 +1696,12 @@ static int ext4_fill_flex_info(struct super_block *sb) 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; |