[PATCH] ext4 64 bit divide fix
With CONFIG_LBD=n, sector_div() expands to a plain old divide. But ext4 is _not_ passing in a sector_t as the first argument, so... fs/built-in.o: In function `ext4_get_group_no_and_offset': fs/ext4/balloc.c:39: undefined reference to `__umoddi3' fs/ext4/balloc.c:41: undefined reference to `__udivdi3' fs/built-in.o: In function `find_group_orlov': fs/ext4/ialloc.c:278: undefined reference to `__udivdi3' fs/built-in.o: In function `ext4_fill_super': fs/ext4/super.c:1488: undefined reference to `__udivdi3' fs/ext4/super.c:1488: undefined reference to `__umoddi3' fs/ext4/super.c:1594: undefined reference to `__udivdi3' fs/ext4/super.c:1601: undefined reference to `__umoddi3' Fix that up by calling do_div() directly. Also cast the arg to u64. do_div() is only defined on u64, and ext4_fsblk_t is supposed to be opaque. Note especially the changes to find_group_orlov(). It was attempting to do do_div(int, unsigned long long); which is royally screwed up. Switched it to plain old divide. Cc: <linux-ext4@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:

committed by
Linus Torvalds

parent
72b64b5940
commit
f4e5bc244f
@@ -275,7 +275,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent)
|
||||
avefreei = freei / ngroups;
|
||||
freeb = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
|
||||
avefreeb = freeb;
|
||||
sector_div(avefreeb, ngroups);
|
||||
do_div(avefreeb, ngroups);
|
||||
ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
|
||||
|
||||
if ((parent == sb->s_root->d_inode) ||
|
||||
@@ -305,14 +305,14 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent)
|
||||
}
|
||||
|
||||
blocks_per_dir = ext4_blocks_count(es) - freeb;
|
||||
sector_div(blocks_per_dir, ndirs);
|
||||
do_div(blocks_per_dir, ndirs);
|
||||
|
||||
max_dirs = ndirs / ngroups + inodes_per_group / 16;
|
||||
min_inodes = avefreei - inodes_per_group / 4;
|
||||
min_blocks = avefreeb - EXT4_BLOCKS_PER_GROUP(sb) / 4;
|
||||
|
||||
max_debt = EXT4_BLOCKS_PER_GROUP(sb);
|
||||
sector_div(max_debt, max(blocks_per_dir, (ext4_fsblk_t)BLOCK_COST));
|
||||
max_debt /= max_t(int, blocks_per_dir, BLOCK_COST);
|
||||
if (max_debt * INODE_COST > inodes_per_group)
|
||||
max_debt = inodes_per_group / INODE_COST;
|
||||
if (max_debt > 255)
|
||||
|
Reference in New Issue
Block a user