diff options
author | JP Abgrall <jpa@google.com> | 2014-03-19 19:08:39 -0700 |
---|---|---|
committer | JP Abgrall <jpa@google.com> | 2014-03-19 19:08:39 -0700 |
commit | e0ed7404719a9ddd2ba427a80db5365c8bad18c0 (patch) | |
tree | 115ce4b0113994aa23ea22ae0c3ba7587b2eaeb3 /lib/ext2fs/alloc_tables.c | |
parent | 893d0a0f84a0a9dc7cc37507f974f6a695af465f (diff) | |
download | android_external_e2fsprogs-e0ed7404719a9ddd2ba427a80db5365c8bad18c0.tar.gz android_external_e2fsprogs-e0ed7404719a9ddd2ba427a80db5365c8bad18c0.tar.bz2 android_external_e2fsprogs-e0ed7404719a9ddd2ba427a80db5365c8bad18c0.zip |
Switch back to 1.42.9 now that there is a fix
Revert "Revert changes that moved from 1.41.14 to 1.42.9"
This reverts commit 65f0aab98b20b5994a726ab90d355248bcddfffd.
Diffstat (limited to 'lib/ext2fs/alloc_tables.c')
-rw-r--r-- | lib/ext2fs/alloc_tables.c | 172 |
1 files changed, 93 insertions, 79 deletions
diff --git a/lib/ext2fs/alloc_tables.c b/lib/ext2fs/alloc_tables.c index 46465af4..885d2b23 100644 --- a/lib/ext2fs/alloc_tables.c +++ b/lib/ext2fs/alloc_tables.c @@ -26,6 +26,7 @@ #include "ext2_fs.h" #include "ext2fs.h" +#include "ext2fsP.h" /* * This routine searches for free blocks that can allocate a full @@ -33,46 +34,46 @@ * block number with a correct offset were the bitmaps and inode * tables can be allocated continously and in order. */ -static blk_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk_t start_blk, - ext2fs_block_bitmap bmap, int offset, int size, - int elem_size) +static blk64_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk64_t start_blk, + ext2fs_block_bitmap bmap, int rem_grp, + int elem_size) { - int flexbg, flexbg_size; - blk_t last_blk, first_free = 0; + int flexbg, flexbg_size, size; + blk64_t last_blk, first_free = 0; dgrp_t last_grp; flexbg_size = 1 << fs->super->s_log_groups_per_flex; flexbg = group / flexbg_size; + size = rem_grp * elem_size; if (size > (int) (fs->super->s_blocks_per_group / 8)) size = (int) fs->super->s_blocks_per_group / 8; - if (offset) - offset -= 1; - /* * Don't do a long search if the previous block * search is still valid. */ - if (start_blk && group % flexbg_size) { - if (ext2fs_test_block_bitmap_range(bmap, start_blk + elem_size, - size)) - return start_blk + elem_size; - } + if (start_blk && ext2fs_test_block_bitmap_range2(bmap, start_blk, + elem_size)) + return start_blk; - start_blk = ext2fs_group_first_block(fs, flexbg_size * flexbg); + start_blk = ext2fs_group_first_block2(fs, flexbg_size * flexbg); last_grp = group | (flexbg_size - 1); - if (last_grp > fs->group_desc_count) - last_grp = fs->group_desc_count; - last_blk = ext2fs_group_last_block(fs, last_grp); + if (last_grp > fs->group_desc_count-1) + last_grp = fs->group_desc_count-1; + last_blk = ext2fs_group_last_block2(fs, last_grp); /* Find the first available block */ - if (ext2fs_get_free_blocks(fs, start_blk, last_blk, 1, bmap, - &first_free)) + if (ext2fs_get_free_blocks2(fs, start_blk, last_blk, size, + bmap, &first_free) == 0) return first_free; - if (ext2fs_get_free_blocks(fs, first_free + offset, last_blk, size, - bmap, &first_free)) + if (ext2fs_get_free_blocks2(fs, start_blk, last_blk, elem_size, + bmap, &first_free) == 0) + return first_free; + + if (ext2fs_get_free_blocks2(fs, 0, last_blk, elem_size, bmap, + &first_free) == 0) return first_free; return first_free; @@ -81,13 +82,14 @@ static blk_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk_t start_blk, errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, ext2fs_block_bitmap bmap) { + unsigned int j; errcode_t retval; - blk_t group_blk, start_blk, last_blk, new_blk, blk; + blk64_t group_blk, start_blk, last_blk, new_blk, blk; dgrp_t last_grp = 0; - int j, rem_grps = 0, flexbg_size = 0; + int rem_grps = 0, flexbg_size = 0; - group_blk = ext2fs_group_first_block(fs, group); - last_blk = ext2fs_group_last_block(fs, group); + group_blk = ext2fs_group_first_block2(fs, group); + last_blk = ext2fs_group_last_block2(fs, group); if (!bmap) bmap = fs->block_map; @@ -97,17 +99,17 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, fs->super->s_log_groups_per_flex) { flexbg_size = 1 << fs->super->s_log_groups_per_flex; last_grp = group | (flexbg_size - 1); - rem_grps = last_grp - group; - if (last_grp > fs->group_desc_count) - last_grp = fs->group_desc_count; + if (last_grp > fs->group_desc_count-1) + last_grp = fs->group_desc_count-1; + rem_grps = last_grp - group + 1; } /* * Allocate the block and inode bitmaps, if necessary */ if (fs->stride) { - retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, - 1, bmap, &start_blk); + retval = ext2fs_get_free_blocks2(fs, group_blk, last_blk, + 1, bmap, &start_blk); if (retval) return retval; start_blk += fs->inode_blocks_per_group; @@ -119,57 +121,61 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, start_blk = group_blk; if (flexbg_size) { - blk_t prev_block = 0; - if (group && fs->group_desc[group-1].bg_block_bitmap) - prev_block = fs->group_desc[group-1].bg_block_bitmap; + blk64_t prev_block = 0; + + if (group % flexbg_size) + prev_block = ext2fs_block_bitmap_loc(fs, group - 1) + 1; start_blk = flexbg_offset(fs, group, prev_block, bmap, - 0, rem_grps, 1); - last_blk = ext2fs_group_last_block(fs, last_grp); + rem_grps, 1); + last_blk = ext2fs_group_last_block2(fs, last_grp); } - if (!fs->group_desc[group].bg_block_bitmap) { - retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, - 1, bmap, &new_blk); + if (!ext2fs_block_bitmap_loc(fs, group)) { + retval = ext2fs_get_free_blocks2(fs, start_blk, last_blk, + 1, bmap, &new_blk); if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) - retval = ext2fs_get_free_blocks(fs, group_blk, + retval = ext2fs_get_free_blocks2(fs, group_blk, last_blk, 1, bmap, &new_blk); if (retval) return retval; - ext2fs_mark_block_bitmap(bmap, new_blk); - fs->group_desc[group].bg_block_bitmap = new_blk; + ext2fs_mark_block_bitmap2(bmap, new_blk); + ext2fs_block_bitmap_loc_set(fs, group, new_blk); if (flexbg_size) { - dgrp_t gr = ext2fs_group_of_blk(fs, new_blk); - fs->group_desc[gr].bg_free_blocks_count--; - fs->super->s_free_blocks_count--; - fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; + dgrp_t gr = ext2fs_group_of_blk2(fs, new_blk); + ext2fs_bg_free_blocks_count_set(fs, gr, ext2fs_bg_free_blocks_count(fs, gr) - 1); + ext2fs_free_blocks_count_add(fs->super, -1); + ext2fs_bg_flags_clear(fs, gr, EXT2_BG_BLOCK_UNINIT); ext2fs_group_desc_csum_set(fs, gr); } } if (flexbg_size) { - blk_t prev_block = 0; - if (group && fs->group_desc[group-1].bg_inode_bitmap) - prev_block = fs->group_desc[group-1].bg_inode_bitmap; + blk64_t prev_block = 0; + if (group % flexbg_size) + prev_block = ext2fs_inode_bitmap_loc(fs, group - 1) + 1; + else + prev_block = ext2fs_block_bitmap_loc(fs, group) + + flexbg_size; start_blk = flexbg_offset(fs, group, prev_block, bmap, - flexbg_size, rem_grps, 1); - last_blk = ext2fs_group_last_block(fs, last_grp); + rem_grps, 1); + last_blk = ext2fs_group_last_block2(fs, last_grp); } - if (!fs->group_desc[group].bg_inode_bitmap) { - retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, - 1, bmap, &new_blk); + if (!ext2fs_inode_bitmap_loc(fs, group)) { + retval = ext2fs_get_free_blocks2(fs, start_blk, last_blk, + 1, bmap, &new_blk); if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) - retval = ext2fs_get_free_blocks(fs, group_blk, - last_blk, 1, bmap, &new_blk); + retval = ext2fs_get_free_blocks2(fs, group_blk, + last_blk, 1, bmap, &new_blk); if (retval) return retval; - ext2fs_mark_block_bitmap(bmap, new_blk); - fs->group_desc[group].bg_inode_bitmap = new_blk; + ext2fs_mark_block_bitmap2(bmap, new_blk); + ext2fs_inode_bitmap_loc_set(fs, group, new_blk); if (flexbg_size) { - dgrp_t gr = ext2fs_group_of_blk(fs, new_blk); - fs->group_desc[gr].bg_free_blocks_count--; - fs->super->s_free_blocks_count--; - fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; + dgrp_t gr = ext2fs_group_of_blk2(fs, new_blk); + ext2fs_bg_free_blocks_count_set(fs, gr, ext2fs_bg_free_blocks_count(fs, gr) - 1); + ext2fs_free_blocks_count_add(fs->super, -1); + ext2fs_bg_flags_clear(fs, gr, EXT2_BG_BLOCK_UNINIT); ext2fs_group_desc_csum_set(fs, gr); } } @@ -178,21 +184,22 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, * Allocate the inode table */ if (flexbg_size) { - blk_t prev_block = 0; - if (group && fs->group_desc[group-1].bg_inode_table) - prev_block = fs->group_desc[group-1].bg_inode_table; - if (last_grp == fs->group_desc_count) - rem_grps = last_grp - group; + blk64_t prev_block = 0; + + if (group % flexbg_size) + prev_block = ext2fs_inode_table_loc(fs, group - 1) + + fs->inode_blocks_per_group; + else + prev_block = ext2fs_inode_bitmap_loc(fs, group) + + flexbg_size; + group_blk = flexbg_offset(fs, group, prev_block, bmap, - flexbg_size * 2, - fs->inode_blocks_per_group * - rem_grps, - fs->inode_blocks_per_group); - last_blk = ext2fs_group_last_block(fs, last_grp); + rem_grps, fs->inode_blocks_per_group); + last_blk = ext2fs_group_last_block2(fs, last_grp); } - if (!fs->group_desc[group].bg_inode_table) { - retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, + if (!ext2fs_inode_table_loc(fs, group)) { + retval = ext2fs_get_free_blocks2(fs, group_blk, last_blk, fs->inode_blocks_per_group, bmap, &new_blk); if (retval) @@ -200,16 +207,17 @@ errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, for (j=0, blk = new_blk; j < fs->inode_blocks_per_group; j++, blk++) { - ext2fs_mark_block_bitmap(bmap, blk); + ext2fs_mark_block_bitmap2(bmap, blk); if (flexbg_size) { - dgrp_t gr = ext2fs_group_of_blk(fs, blk); - fs->group_desc[gr].bg_free_blocks_count--; - fs->super->s_free_blocks_count--; - fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; + dgrp_t gr = ext2fs_group_of_blk2(fs, blk); + ext2fs_bg_free_blocks_count_set(fs, gr, ext2fs_bg_free_blocks_count(fs, gr) - 1); + ext2fs_free_blocks_count_add(fs->super, -1); + ext2fs_bg_flags_clear(fs, gr, + EXT2_BG_BLOCK_UNINIT); ext2fs_group_desc_csum_set(fs, gr); } } - fs->group_desc[group].bg_inode_table = new_blk; + ext2fs_inode_table_loc_set(fs, group, new_blk); } ext2fs_group_desc_csum_set(fs, group); return 0; @@ -219,12 +227,18 @@ errcode_t ext2fs_allocate_tables(ext2_filsys fs) { errcode_t retval; dgrp_t i; + struct ext2fs_numeric_progress_struct progress; + + ext2fs_numeric_progress_init(fs, &progress, NULL, + fs->group_desc_count); for (i = 0; i < fs->group_desc_count; i++) { + ext2fs_numeric_progress_update(fs, &progress, i); retval = ext2fs_allocate_group_table(fs, i, fs->block_map); if (retval) return retval; } + ext2fs_numeric_progress_close(fs, &progress, NULL); return 0; } |