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