From 15e3f31df837e58e0c817984c36c4180beec3caf Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 5 Jan 2014 11:36:39 +0000 Subject: [PATCH] Use same code for block moving with and without flex_bg --- realloc-inodes.c | 53 +++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/realloc-inodes.c b/realloc-inodes.c index 2953c5c..8d72d86 100644 --- a/realloc-inodes.c +++ b/realloc-inodes.c @@ -6,7 +6,6 @@ * TODO support undo, but not by undo_io_manager because it is VERY slow * TODO check the bad block inode before block moving * TODO check if the block mover does block_alloc_stats - * TODO try to remove duplicate code constructs * TODO write some tests: for inode moving (image with many files), * for block moving, including extent blocks (one sparse file with many extents), * for calculating block group statistics (block moving between different groups) @@ -296,7 +295,7 @@ int extend_move_blocks(realloc_data *rd) { ext2fs_block_bitmap reserve_map; blk64_t it_start, blk_diff, b_per_g; - dgrp_t grp, n_flex, n_grp, flex_count; + dgrp_t n_flex, n_grp, flex_count; int retval, flexbg_size; if (rd->new_inode_blocks_per_group == rd->fs->inode_blocks_per_group) { @@ -317,44 +316,30 @@ int extend_move_blocks(realloc_data *rd) if (EXT2_HAS_INCOMPAT_FEATURE(rd->fs->super, EXT4_FEATURE_INCOMPAT_FLEX_BG) && rd->fs->super->s_log_groups_per_flex) { - // flex_bg flexbg_size = 1 << rd->fs->super->s_log_groups_per_flex; - flex_count = (rd->fs->group_desc_count + flexbg_size - 1) / flexbg_size; - for (n_flex = 0; n_flex < flex_count; n_flex++) - { - n_grp = flexbg_size; - if (n_flex*flexbg_size+n_grp > rd->fs->group_desc_count) - { - n_grp = rd->fs->group_desc_count-n_flex*flexbg_size; - } - it_start = ext2fs_inode_table_loc(rd->fs, n_flex*flexbg_size); - // Check group boundaries - if ((it_start + rd->new_inode_blocks_per_group*n_grp - 1) / b_per_g - != (it_start + rd->fs->inode_blocks_per_group*n_grp - 1) / b_per_g) - { - retval = ENOSPC; - goto out; - } - it_start += rd->fs->inode_blocks_per_group*n_grp; - ext2fs_mark_block_bitmap_range2(reserve_map, it_start, blk_diff*n_grp); - } } else { - // No flex_bg - for (grp = 0; grp < rd->fs->group_desc_count; grp++) + flexbg_size = 1; + } + flex_count = (rd->fs->group_desc_count + flexbg_size - 1) / flexbg_size; + for (n_flex = 0; n_flex < flex_count; n_flex++) + { + n_grp = flexbg_size; + if (n_flex*flexbg_size+n_grp > rd->fs->group_desc_count) { - it_start = ext2fs_inode_table_loc(rd->fs, grp); - // Check group boundaries - if ((it_start + rd->new_inode_blocks_per_group - 1) / b_per_g - != (it_start + rd->fs->inode_blocks_per_group - 1) / b_per_g) - { - retval = ENOSPC; - goto out; - } - it_start += rd->fs->inode_blocks_per_group; - ext2fs_mark_block_bitmap_range2(reserve_map, it_start, rd->new_inode_blocks_per_group-rd->fs->inode_blocks_per_group); + n_grp = rd->fs->group_desc_count-n_flex*flexbg_size; } + it_start = ext2fs_inode_table_loc(rd->fs, n_flex*flexbg_size); + // Check group boundaries + if ((it_start + rd->new_inode_blocks_per_group*n_grp - 1) / b_per_g + != (it_start + rd->fs->inode_blocks_per_group*n_grp - 1) / b_per_g) + { + retval = ENOSPC; + goto out; + } + it_start += rd->fs->inode_blocks_per_group*n_grp; + ext2fs_mark_block_bitmap_range2(reserve_map, it_start, blk_diff*n_grp); } retval = ext2fs_move_blocks(rd->fs, reserve_map, rd->fs->block_map, 0); ext2fs_mark_bb_dirty(rd->fs);