--- --- linux-2.6.16-ming/fs/ext3/balloc.c | 33 +++++++++++++++++++++------- linux-2.6.16-ming/fs/ext3/ialloc.c | 11 +++++---- linux-2.6.16-ming/fs/ext3/resize.c | 8 ++---- linux-2.6.16-ming/fs/ext3/super.c | 8 +++--- linux-2.6.16-ming/include/linux/ext3_fs.h | 4 +++ linux-2.6.16-ming/include/linux/ext3_fs_i.h | 4 +-- 6 files changed, 45 insertions(+), 23 deletions(-) diff -puN fs/ext3/balloc.c~ext3_fsblk_sector_t fs/ext3/balloc.c --- linux-2.6.16/fs/ext3/balloc.c~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/fs/ext3/balloc.c 2006-05-22 15:13:52.000000000 -0700 @@ -20,6 +20,7 @@ #include #include #include +#include /* * balloc.c contains the blocks allocation and deallocation routines @@ -39,6 +40,26 @@ #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) +unsigned int ext3_block_group(struct super_block * sb, ext3_fsblk_t blocknr) +{ + struct ext3_super_block *es = EXT3_SB(sb)->s_es; + ext3_fsblk_t blockgrp = blocknr - le32_to_cpu(es->s_first_data_block); + sector_div(blockgrp, EXT3_BLOCKS_PER_GROUP(sb)); + + return (unsigned int)blockgrp; +} + +ext3_grpblk_t ext3_block_group_offset(struct super_block * sb, ext3_fsblk_t blocknr) +{ + struct ext3_super_block *es = EXT3_SB(sb)->s_es; + ext3_fsblk_t blockgrp = blocknr - le32_to_cpu(es->s_first_data_block); + ext3_grpblk_t offset; + + offset = sector_div(blockgrp, EXT3_BLOCKS_PER_GROUP(sb)); + + return offset; +} + struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, unsigned int block_group, struct buffer_head ** bh) @@ -340,10 +361,8 @@ void ext3_free_blocks_sb(handle_t *handl do_more: overflow = 0; - block_group = (block - le32_to_cpu(es->s_first_data_block)) / - EXT3_BLOCKS_PER_GROUP(sb); - bit = (block - le32_to_cpu(es->s_first_data_block)) % - EXT3_BLOCKS_PER_GROUP(sb); + block_group = ext3_block_group(sb, block); + bit = ext3_block_group_offset (sb, block); /* * Check to see if we are freeing blocks across a group * boundary. @@ -1268,8 +1287,7 @@ ext3_fsblk_t ext3_new_blocks(handle_t *h if (goal < le32_to_cpu(es->s_first_data_block) || goal >= le32_to_cpu(es->s_blocks_count)) goal = le32_to_cpu(es->s_first_data_block); - group_no = (goal - le32_to_cpu(es->s_first_data_block)) / - EXT3_BLOCKS_PER_GROUP(sb); + group_no = ext3_block_group (sb, goal); gdp = ext3_get_group_desc(sb, group_no, &gdp_bh); if (!gdp) goto io_error; @@ -1286,8 +1304,7 @@ retry: my_rsv = NULL; if (free_blocks > 0) { - grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) % - EXT3_BLOCKS_PER_GROUP(sb)); + grp_target_blk = ext3_block_group_offset(sb, goal); bitmap_bh = read_block_bitmap(sb, group_no); if (!bitmap_bh) goto io_error; diff -puN fs/ext3/ialloc.c~ext3_fsblk_sector_t fs/ext3/ialloc.c --- linux-2.6.16/fs/ext3/ialloc.c~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/fs/ext3/ialloc.c 2006-05-22 15:13:52.000000000 -0700 @@ -23,7 +23,7 @@ #include #include #include - +#include #include #include "xattr.h" @@ -274,7 +274,8 @@ static int find_group_orlov(struct super freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter); avefreei = freei / ngroups; freeb = percpu_counter_read_positive(&sbi->s_freeblocks_counter); - avefreeb = freeb / ngroups; + avefreeb = freeb; + sector_div(avefreeb, ngroups); ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter); if ((parent == sb->s_root->d_inode) || @@ -303,13 +304,15 @@ static int find_group_orlov(struct super goto fallback; } - blocks_per_dir = (le32_to_cpu(es->s_blocks_count) - freeb) / ndirs; + blocks_per_dir = le32_to_cpu(es->s_blocks_count) - freeb; + sector_div(blocks_per_dir, ndirs); max_dirs = ndirs / ngroups + inodes_per_group / 16; min_inodes = avefreei - inodes_per_group / 4; min_blocks = avefreeb - EXT3_BLOCKS_PER_GROUP(sb) / 4; - max_debt = EXT3_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, (ext3_fsblk_t)BLOCK_COST); + max_debt = EXT3_BLOCKS_PER_GROUP(sb); + sector_div(max_debt, max(blocks_per_dir, (ext3_fsblk_t)BLOCK_COST)); if (max_debt * INODE_COST > inodes_per_group) max_debt = inodes_per_group / INODE_COST; if (max_debt > 255) diff -puN fs/ext3/resize.c~ext3_fsblk_sector_t fs/ext3/resize.c --- linux-2.6.16/fs/ext3/resize.c~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/fs/ext3/resize.c 2006-05-22 15:13:52.000000000 -0700 @@ -15,7 +15,7 @@ #include #include #include - +#include #include #include @@ -54,8 +54,7 @@ static int verify_group_input(struct sup ext3_warning(sb, __FUNCTION__, "Cannot add at group %u (only %lu groups)", input->group, sbi->s_groups_count); - else if ((start - le32_to_cpu(es->s_first_data_block)) % - EXT3_BLOCKS_PER_GROUP(sb)) + else if (ext3_block_group_offset(sb,start) != 0) ext3_warning(sb, __FUNCTION__, "Last group not full"); else if (input->reserved_blocks > input->blocks_count / 5) ext3_warning(sb, __FUNCTION__, "Reserved blocks too high (%u)", @@ -948,8 +947,7 @@ int ext3_group_extend(struct super_block } /* Handle the remaining blocks in the last group only. */ - last = (o_blocks_count - le32_to_cpu(es->s_first_data_block)) % - EXT3_BLOCKS_PER_GROUP(sb); + last = ext3_block_group_offset(sb, o_blocks_count); if (last == 0) { ext3_warning(sb, __FUNCTION__, diff -puN fs/ext3/super.c~ext3_fsblk_sector_t fs/ext3/super.c --- linux-2.6.16/fs/ext3/super.c~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/fs/ext3/super.c 2006-05-22 15:13:52.000000000 -0700 @@ -1377,8 +1377,8 @@ static int ext3_fill_super (struct super * block sizes. We need to calculate the offset from buffer start. */ if (blocksize != EXT3_MIN_BLOCK_SIZE) { - logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize; - offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize; + logic_sb_block = sb_block * EXT3_MIN_BLOCK_SIZE; + offset = sector_div(logic_sb_block, blocksize); } else { logic_sb_block = sb_block; } @@ -1483,8 +1483,8 @@ static int ext3_fill_super (struct super brelse (bh); sb_set_blocksize(sb, blocksize); - logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize; - offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize; + logic_sb_block = sb_block * EXT3_MIN_BLOCK_SIZE; + offset = sector_div(logic_sb_block, blocksize); bh = sb_bread(sb, logic_sb_block); if (!bh) { printk(KERN_ERR diff -puN include/linux/ext3_fs.h~ext3_fsblk_sector_t include/linux/ext3_fs.h --- linux-2.6.16/include/linux/ext3_fs.h~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/include/linux/ext3_fs.h 2006-05-22 15:13:52.000000000 -0700 @@ -738,6 +738,10 @@ ext3_group_first_block_no(struct super_b # define NORET_AND noreturn, /* balloc.c */ +extern unsigned int ext3_block_group(struct super_block *sb, + ext3_fsblk_t blocknr); +extern ext3_grpblk_t ext3_block_group_offset(struct super_block *sb, + ext3_fsblk_t blocknr); extern int ext3_bg_has_super(struct super_block *sb, int group); extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode, diff -puN include/linux/ext3_fs_i.h~ext3_fsblk_sector_t include/linux/ext3_fs_i.h --- linux-2.6.16/include/linux/ext3_fs_i.h~ext3_fsblk_sector_t 2006-05-22 15:13:52.000000000 -0700 +++ linux-2.6.16-ming/include/linux/ext3_fs_i.h 2006-05-22 15:13:52.000000000 -0700 @@ -25,9 +25,9 @@ typedef int ext3_grpblk_t; /* data type for filesystem-wide blocks number */ -typedef unsigned long ext3_fsblk_t; +typedef sector_t ext3_fsblk_t; -#define E3FSBLK "%lu" +#define E3FSBLK SECTOR_FMT struct ext3_reserve_window { ext3_fsblk_t _rsv_start; /* First byte reserved */ _