alloc_tables.c revision 9ba400027fb00ce43d14673346bbfb6f5719985a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * alloc_tables.c --- Allocate tables for a newly initialized
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filesystem.  Used by mke2fs when initializing a filesystem
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 1996 Theodore Ts'o.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * %Begin-Header%
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This file may be redistributed under the terms of the GNU Public
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License.
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * %End-Header%
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if HAVE_UNISTD_H
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
174f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown#endif
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
19713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn#include <time.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if HAVE_SYS_STAT_H
21cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn#include <sys/stat.h>
224f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown#endif
236f357d3284a833cc50a990e14b39f389b8972254Jeff Brown#if HAVE_SYS_TYPES_H
242175e9c366998ed7bd1a4501b94a02f4f49b932cJeff Brown#include <sys/types.h>
252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown#endif
26182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
27182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski#include "ext2_fs.h"
284f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown#include "ext2fs.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown/*
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This routine searches for free blocks that can allocate a full
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group of bitmaps or inode tables for a flexbg group.  Returns the
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * block number with a correct offset were the bitmaps and inode
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tables can be allocated continously and in order.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic blk_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk_t start_blk,
37d7786b41b78ba8592daea708b024b5a75e441992Mike Lockwood			   ext2fs_block_bitmap bmap, int offset, int size)
3843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker{
393b971598ed28d45c176e3f9b076fc743a406296dJeff Brown	int		flexbg, flexbg_size, elem_size;
403b971598ed28d45c176e3f9b076fc743a406296dJeff Brown	blk_t		last_blk, first_free = 0;
414ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown	dgrp_t	       	last_grp;
42131206b8a9d07400d7c98aea50cc45c38769448fJeff Brown
439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	flexbg_size = 1 << fs->super->s_log_groups_per_flex;
448b61983ee81f4819319d22e05ddf473a9c64be77Amith Yamasani	flexbg = group / flexbg_size;
452139276ce8b54aba5faa858ca69ed5f01445c269Jeff Brown
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	if (size > fs->super->s_blocks_per_group / 8)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		size = fs->super->s_blocks_per_group / 8;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	/*
509630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	 * Dont do a long search if the previous block
5192e66dd6835cd5fefad463c79d0589166e8fd3a7Jim Miller	 * search is still valid.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	 */
536f357d3284a833cc50a990e14b39f389b8972254Jeff Brown	if (start_blk && group % flexbg_size) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		if (size > flexbg_size)
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			elem_size = fs->inode_blocks_per_group;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		else
57dbcf2d7482562eff45ac727cea799b37a260e399Nick Kralevich			elem_size = 1;
583edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown		if (ext2fs_test_block_bitmap_range(bmap, start_blk + elem_size,
59d49359631bc2642be73dc162a8a73207df1e0bafJeff Brown						   size))
607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn			return start_blk + elem_size;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
62567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	start_blk = ext2fs_group_first_block(fs, flexbg_size * flexbg);
648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato	last_grp = group | (flexbg_size - 1);
659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	if (last_grp > fs->group_desc_count)
66037c33eae74bee2774897d969d48947f9abe254fJeff Brown		last_grp = fs->group_desc_count;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	last_blk = ext2fs_group_last_block(fs, last_grp);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	/* Find the first available block */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	if (ext2fs_get_free_blocks(fs, start_blk, last_blk, 1, bmap,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				   &first_free))
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return first_free;
739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	if (ext2fs_get_free_blocks(fs, first_free + offset, last_blk, size,
75fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown				   bmap, &first_free))
76fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown		return first_free;
77fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
78fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown	return first_free;
79fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown}
809630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
819630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownerrcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown				      ext2fs_block_bitmap bmap)
839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown{
842175e9c366998ed7bd1a4501b94a02f4f49b932cJeff Brown	errcode_t	retval;
859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	blk_t		group_blk, start_blk, last_blk, new_blk, blk;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	dgrp_t		last_grp;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	int		j, rem_grps, flexbg_size = 0;
8888c997a5abb3b2b2df1fb17fa3af40b34fbdd590Jeff Brown
899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	group_blk = ext2fs_group_first_block(fs, group);
909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	last_blk = ext2fs_group_last_block(fs, group);
919630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	if (!bmap)
932687550272ba061448f5d5b914700dc335299ee7Jeff Brown		bmap = fs->block_map;
949630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
95e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown	if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
96e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown				      EXT4_FEATURE_INCOMPAT_FLEX_BG) &&
979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	    fs->super->s_log_groups_per_flex) {
989630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		flexbg_size = 1 << fs->super->s_log_groups_per_flex;
999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		last_grp = group | (flexbg_size - 1);
1009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		rem_grps = last_grp - group;
1019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (last_grp > fs->group_desc_count)
1029630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			last_grp = fs->group_desc_count;
1039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	}
1049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	/*
1069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	 * Allocate the block and inode bitmaps, if necessary
1079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	 */
1089630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	if (fs->stride) {
1099630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		retval = ext2fs_get_free_blocks(fs, group_blk, last_blk,
1109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						1, bmap, &start_blk);
1119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval)
1129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			return retval;
1139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		start_blk += fs->inode_blocks_per_group;
1149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		start_blk += ((fs->stride * group) %
1159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			      (last_blk - start_blk + 1));
11693cbbb25a56356cd36523809783a277fe92e312eJeff Brown		if (start_blk >= last_blk)
11793cbbb25a56356cd36523809783a277fe92e312eJeff Brown			start_blk = group_blk;
118ec6aa5945408ce97034d24e1ba5d80bed88cebf4Jeff Brown	} else
1193ee549ca2404067bb8b2fcbaa741ec118c76bf3eJeff Brown		start_blk = group_blk;
120e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown
121e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown	if (flexbg_size) {
1229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		int prev_block = 0;
1239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (group && fs->group_desc[group-1].bg_block_bitmap)
1249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			prev_block = fs->group_desc[group-1].bg_block_bitmap;
1259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		start_blk = flexbg_offset(fs, group, prev_block, bmap,
1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						 0, rem_grps);
1279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		last_blk = ext2fs_group_last_block(fs, last_grp);
1289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	}
12910428748f98518dbaef8c56cf1ad75aabd75da45Jeff Brown
1302687550272ba061448f5d5b914700dc335299ee7Jeff Brown	if (!fs->group_desc[group].bg_block_bitmap) {
1319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
1329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						1, bmap, &new_blk);
1339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
1349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			retval = ext2fs_get_free_blocks(fs, group_blk,
13505af6adb8d4fd5ea069c9aead5a877da9085daa8Jeff Brown					last_blk, 1, bmap, &new_blk);
1369630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval)
13727736f5c0ada99bf2a7e007a1dec0ad51f65fa52Jeff Brown			return retval;
13827736f5c0ada99bf2a7e007a1dec0ad51f65fa52Jeff Brown		ext2fs_mark_block_bitmap(bmap, new_blk);
1399630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		fs->group_desc[group].bg_block_bitmap = new_blk;
14005af6adb8d4fd5ea069c9aead5a877da9085daa8Jeff Brown		if (flexbg_size) {
141ff532540f18e3b2181da0550fe55045418a3b84eJeff Brown			dgrp_t gr = ext2fs_group_of_blk(fs, new_blk);
142e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown			fs->group_desc[gr].bg_free_blocks_count--;
143e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown			fs->super->s_free_blocks_count--;
144e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown			fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT;
145e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown			ext2fs_group_desc_csum_set(fs, gr);
146e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown		}
1470a571123544058578b4ef1558c276a4050519652Jeff Brown	}
1480a571123544058578b4ef1558c276a4050519652Jeff Brown
1490a571123544058578b4ef1558c276a4050519652Jeff Brown	if (flexbg_size) {
15062b8a49856cc0822905dcb7a213f082b92fa69e3Ruchi Kandoi		int prev_block = 0;
151b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown		if (group && fs->group_desc[group-1].bg_inode_bitmap)
1522c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown			prev_block = fs->group_desc[group-1].bg_inode_bitmap;
1532c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown		start_blk = flexbg_offset(fs, group, prev_block, bmap,
1542c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown						 flexbg_size, rem_grps);
155182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski		last_blk = ext2fs_group_last_block(fs, last_grp);
1562139276ce8b54aba5faa858ca69ed5f01445c269Jeff Brown	}
1574ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
1589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	if (!fs->group_desc[group].bg_inode_bitmap) {
159713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn		retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
1609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						1, bmap, &new_blk);
1619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
1623b971598ed28d45c176e3f9b076fc743a406296dJeff Brown			retval = ext2fs_get_free_blocks(fs, group_blk,
1639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown					last_blk, 1, bmap, &new_blk);
164567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown		if (retval)
165182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski			return retval;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		ext2fs_mark_block_bitmap(bmap, new_blk);
1679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		fs->group_desc[group].bg_inode_bitmap = new_blk;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		if (flexbg_size) {
1699630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			dgrp_t gr = ext2fs_group_of_blk(fs, new_blk);
1709630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			fs->group_desc[gr].bg_free_blocks_count--;
1719630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			fs->super->s_free_blocks_count--;
1720e5bb7f1c9558bcf76af4f31dd5a11e78bcbdc9dMike Lockwood			fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT;
1739630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			ext2fs_group_desc_csum_set(fs, gr);
1749630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		}
1759630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	}
176fbe96706bb9754f9ea3f6345f32e058a45ad10b4Jeff Brown
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	/*
1782687550272ba061448f5d5b914700dc335299ee7Jeff Brown	 * Allocate the inode table
1792687550272ba061448f5d5b914700dc335299ee7Jeff Brown	 */
1802687550272ba061448f5d5b914700dc335299ee7Jeff Brown	if (flexbg_size) {
1812687550272ba061448f5d5b914700dc335299ee7Jeff Brown		int prev_block = 0;
1829630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (group && fs->group_desc[group-1].bg_inode_table)
1839630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			prev_block = fs->group_desc[group-1].bg_inode_table;
184bc632a28e4fba4a659baf39b9fd3d06d10cfda97John Spurlock		group_blk = flexbg_offset(fs, group, prev_block, bmap,
1859630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						 flexbg_size * 2,
1869630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						 fs->inode_blocks_per_group *
1879630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						 rem_grps);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		last_blk = ext2fs_group_last_block(fs, last_grp);
1899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	}
1909630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
1912d7bb81ac4c04447a1e04fef82986b939823dea4Mike Lockwood	if (!fs->group_desc[group].bg_inode_table) {
1929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		retval = ext2fs_get_free_blocks(fs, group_blk, last_blk,
1939630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown						fs->inode_blocks_per_group,
194b28654167466277fa262606810115164d9d24d67Mike Lockwood						bmap, &new_blk);
1959630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval)
1969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			return retval;
1979630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		for (j=0, blk = new_blk;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		     j < fs->inode_blocks_per_group;
1999630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		     j++, blk++) {
2009630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			ext2fs_mark_block_bitmap(bmap, blk);
2019630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			if (flexbg_size) {
202df83afaf299666e99c519aa86e7e082b7c116e95Dianne Hackborn				dgrp_t gr = ext2fs_group_of_blk(fs, blk);
2039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown				fs->group_desc[gr].bg_free_blocks_count--;
2049630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown				fs->super->s_free_blocks_count--;
2059630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown				fs->group_desc[gr].bg_flags &= ~EXT2_BG_BLOCK_UNINIT;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				ext2fs_group_desc_csum_set(fs, gr);
2070a571123544058578b4ef1558c276a4050519652Jeff Brown			}
2080a571123544058578b4ef1558c276a4050519652Jeff Brown		}
2090a571123544058578b4ef1558c276a4050519652Jeff Brown		fs->group_desc[group].bg_inode_table = new_blk;
210e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown	}
211e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown	ext2fs_group_desc_csum_set(fs, group);
212e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown	return 0;
213e333e674a758c39885d4d9779a1aad387fb0e6aaJeff Brown}
2149630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownerrcode_t ext2fs_allocate_tables(ext2_filsys fs)
216609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato{
2179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	errcode_t	retval;
2189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown	dgrp_t		i;
2199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	for (i = 0; i < fs->group_desc_count; i++) {
2219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		retval = ext2fs_allocate_group_table(fs, i, fs->block_map);
2229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown		if (retval)
2239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown			return retval;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
22527f7a866f5dad2dac82ac04a9fc312308220ba92Jeff Brown	return 0;
22627f7a866f5dad2dac82ac04a9fc312308220ba92Jeff Brown}
22727f7a866f5dad2dac82ac04a9fc312308220ba92Jeff Brown
22827f7a866f5dad2dac82ac04a9fc312308220ba92Jeff Brown