Though the 'sbi->s_log_groups_per_flex' contains valid data after the shift operation 'groups_per_flex' is becoming zero, which later used as a divisor. groups_per_flex = 1 << sbi->s_log_groups_per_flex Signed-off-by: Nageswara R Sastry --- diff -Naurp a/linux-2.6.32-rc6/fs/ext4/super.c b/linux-2.6.32-rc6/fs/ext4/super.c --- a/linux-2.6.32-rc6/fs/ext4/super.c 2009-11-03 20:37:49.000000000 +0100 +++ b/linux-2.6.32-rc6/fs/ext4/super.c 2009-11-04 13:21:48.000000000 +0100 @@ -1681,6 +1681,12 @@ static int ext4_fill_flex_info(struct su sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex; groups_per_flex = 1 << sbi->s_log_groups_per_flex; + /* There are some situations, after shift the value of 'groups_per_flex' + can become zero and division with 0 will result in fixpoint divide exception + */ + if (groups_per_flex == 0) + return 1; + /* We allocate both existing and potentially added groups */ flex_group_count = ((sbi->s_groups_count + groups_per_flex - 1) + ((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) <<