119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * alloc_tables.c --- Allocate tables for a newly initialized 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * filesystem. Used by mke2fs when initializing a filesystem 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1996 Theodore Ts'o. 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_STAT_H 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_TYPES_H 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs.h" 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt/* 313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * This routine searches for free blocks that can allocate a full 323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * group of bitmaps or inode tables for a flexbg group. Returns the 333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * block number with a correct offset were the bitmaps and inode 343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * tables can be allocated continously and in order. 353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic blk_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk_t start_blk, 373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_block_bitmap bmap, int offset, int size, 383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int elem_size) 393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt{ 403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int flexbg, flexbg_size; 413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t last_blk, first_free = 0; 423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dgrp_t last_grp; 433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flexbg_size = 1 << fs->super->s_log_groups_per_flex; 453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flexbg = group / flexbg_size; 463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (size > (int) (fs->super->s_blocks_per_group / 8)) 483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt size = (int) fs->super->s_blocks_per_group / 8; 493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (offset) 513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt offset -= 1; 523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt /* 543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * Don't do a long search if the previous block 553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * search is still valid. 563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (start_blk && group % flexbg_size) { 583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ext2fs_test_block_bitmap_range(bmap, start_blk + elem_size, 593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt size)) 603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return start_blk + elem_size; 613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start_blk = ext2fs_group_first_block(fs, flexbg_size * flexbg); 643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_grp = group | (flexbg_size - 1); 653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (last_grp > fs->group_desc_count) 663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_grp = fs->group_desc_count; 673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_blk = ext2fs_group_last_block(fs, last_grp); 683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt /* Find the first available block */ 703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ext2fs_get_free_blocks(fs, start_blk, last_blk, 1, bmap, 713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt &first_free)) 723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return first_free; 733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (ext2fs_get_free_blocks(fs, first_free + offset, last_blk, size, 753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt bmap, &first_free)) 763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return first_free; 773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return first_free; 793984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_block_bitmap bmap) 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t group_blk, start_blk, last_blk, new_blk, blk; 863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dgrp_t last_grp = 0; 873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int j, rem_grps = 0, flexbg_size = 0; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project group_blk = ext2fs_group_first_block(fs, group); 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_blk = ext2fs_group_last_block(fs, group); 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!bmap) 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bmap = fs->block_map; 943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (EXT2_HAS_INCOMPAT_FEATURE(fs->super, 963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT4_FEATURE_INCOMPAT_FLEX_BG) && 973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->super->s_log_groups_per_flex) { 983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flexbg_size = 1 << fs->super->s_log_groups_per_flex; 993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_grp = group | (flexbg_size - 1); 1003984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt rem_grps = last_grp - group; 1013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (last_grp > fs->group_desc_count) 1023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_grp = fs->group_desc_count; 1033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 1043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Allocate the block and inode bitmaps, if necessary 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->stride) { 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1, bmap, &start_blk); 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start_blk += fs->inode_blocks_per_group; 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start_blk += ((fs->stride * group) % 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (last_blk - start_blk + 1)); 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (start_blk >= last_blk) 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start_blk = group_blk; 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start_blk = group_blk; 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 1223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t prev_block = 0; 1233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (group && fs->group_desc[group-1].bg_block_bitmap) 1243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prev_block = fs->group_desc[group-1].bg_block_bitmap; 1253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start_blk = flexbg_offset(fs, group, prev_block, bmap, 1263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 0, rem_grps, 1); 1273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_blk = ext2fs_group_last_block(fs, last_grp); 1283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 1293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!fs->group_desc[group].bg_block_bitmap) { 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1, bmap, &new_blk); 1333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, group_blk, 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_blk, 1, bmap, &new_blk); 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_block_bitmap(bmap, new_blk); 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[group].bg_block_bitmap = new_blk; 1403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 1413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dgrp_t gr = ext2fs_group_of_blk(fs, new_blk); 1423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_free_blocks_count--; 1433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->super->s_free_blocks_count--; 1443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; 1453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_group_desc_csum_set(fs, gr); 1463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 1473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 1483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 1503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t prev_block = 0; 1513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (group && fs->group_desc[group-1].bg_inode_bitmap) 1523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prev_block = fs->group_desc[group-1].bg_inode_bitmap; 1533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt start_blk = flexbg_offset(fs, group, prev_block, bmap, 1543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flexbg_size, rem_grps, 1); 1553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_blk = ext2fs_group_last_block(fs, last_grp); 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!fs->group_desc[group].bg_inode_bitmap) { 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1, bmap, &new_blk); 1613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, group_blk, 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_blk, 1, bmap, &new_blk); 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_block_bitmap(bmap, new_blk); 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[group].bg_inode_bitmap = new_blk; 1683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 1693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dgrp_t gr = ext2fs_group_of_blk(fs, new_blk); 1703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_free_blocks_count--; 1713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->super->s_free_blocks_count--; 1723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; 1733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_group_desc_csum_set(fs, gr); 1743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Allocate the inode table 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 1813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t prev_block = 0; 1823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (group && fs->group_desc[group-1].bg_inode_table) 1833984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt prev_block = fs->group_desc[group-1].bg_inode_table; 1843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (last_grp == fs->group_desc_count) 1853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt rem_grps = last_grp - group; 1863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt group_blk = flexbg_offset(fs, group, prev_block, bmap, 1873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt flexbg_size * 2, 1883984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->inode_blocks_per_group * 1893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt rem_grps, 1903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->inode_blocks_per_group); 1913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt last_blk = ext2fs_group_last_block(fs, last_grp); 1923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 1933984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!fs->group_desc[group].bg_inode_table) { 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->inode_blocks_per_group, 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bmap, &new_blk); 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (j=0, blk = new_blk; 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project j < fs->inode_blocks_per_group; 2023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt j++, blk++) { 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_block_bitmap(bmap, blk); 2043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (flexbg_size) { 2053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt dgrp_t gr = ext2fs_group_of_blk(fs, blk); 2063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_free_blocks_count--; 2073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->super->s_free_blocks_count--; 2083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT; 2093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_group_desc_csum_set(fs, gr); 2103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 2113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[group].bg_inode_table = new_blk; 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_group_desc_csum_set(fs, group); 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_allocate_tables(ext2_filsys fs) 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dgrp_t i; 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < fs->group_desc_count; i++) { 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_allocate_group_table(fs, i, fs->block_map); 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 231