alloc_tables.c revision bc2699f018586f21825e056eb6053686c23804fe
1554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com/*
2554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * alloc_tables.c --- Allocate tables for a newly initialized
3554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * filesystem.  Used by mke2fs when initializing a filesystem
4554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com *
5554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Copyright (C) 1996 Theodore Ts'o.
6554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com *
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina * %Begin-Header%
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina * This file may be redistributed under the terms of the GNU Public
9a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com * License.
10554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * %End-Header%
11a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com */
12554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
13554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <stdio.h>
14c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com#include <string.h>
15554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#if HAVE_UNISTD_H
16554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <unistd.h>
17f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#endif
18554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <fcntl.h>
19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#include <time.h>
20644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#if HAVE_SYS_STAT_H
21554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <sys/stat.h>
22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#endif
23554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#if HAVE_SYS_TYPES_H
24554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <sys/types.h>
25554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#endif
26554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
27554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "ext2_fs.h"
283361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org#include "ext2fs.h"
293361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org
30554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comerrcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
31554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com				      ext2fs_block_bitmap bmap)
32554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com{
33554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	errcode_t	retval;
34554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	blk_t		group_blk, start_blk, last_blk, new_blk, blk;
35554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	int		j;
36554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
37554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	group_blk = fs->super->s_first_data_block +
38554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		(group * fs->super->s_blocks_per_group);
39f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina
40554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	last_blk = group_blk + fs->super->s_blocks_per_group;
41554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	if (last_blk >= fs->super->s_blocks_count)
42554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		last_blk = fs->super->s_blocks_count - 1;
43554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
4415e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com	if (!bmap)
4515e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com		bmap = fs->block_map;
46554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
4777472f06f88b85e85fb690584c85d0a42e74b685sugoi@google.com	/*
4815e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com	 * Allocate the block and inode bitmaps, if necessary
4915e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com	 */
5015e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com	if (fs->stride) {
51554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		retval = ext2fs_get_free_blocks(fs, group_blk, last_blk,
52554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com						1, bmap, &start_blk);
53f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina		if (retval)
54554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			return retval;
55644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org		start_blk += fs->inode_blocks_per_group;
56644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org		start_blk += ((fs->stride * group) %
57554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			      (last_blk - start_blk));
58644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org		if (start_blk > last_blk)
59554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			start_blk = group_blk;
60554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	} else
61554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		start_blk = group_blk;
62554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
63554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	if (!fs->group_desc[group].bg_block_bitmap) {
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org		retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
65554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com						1, bmap, &new_blk);
663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org		if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
67554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			retval = ext2fs_get_free_blocks(fs, group_blk,
68554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com					last_blk, 1, bmap, &new_blk);
69554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		if (retval)
70554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			return retval;
71554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		ext2fs_mark_block_bitmap(bmap, new_blk);
72554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		fs->group_desc[group].bg_block_bitmap = new_blk;
73554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	}
74554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com
75554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com	if (!fs->group_desc[group].bg_inode_bitmap) {
76554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
77f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina						1, bmap, &new_blk);
78554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com		if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
79554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com			retval = ext2fs_get_free_blocks(fs, group_blk,
80f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina					last_blk, 1, bmap, &new_blk);
81a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		if (retval)
82644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org			return retval;
83644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org		ext2fs_mark_block_bitmap(bmap, new_blk);
84a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		fs->group_desc[group].bg_inode_bitmap = new_blk;
85644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org	}
86a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
87a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	/*
88a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	 * Allocate the inode table
89a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	 */
90a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	if (!fs->group_desc[group].bg_inode_table) {
913361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org		retval = ext2fs_get_free_blocks(fs, group_blk, last_blk,
923361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org						fs->inode_blocks_per_group,
93a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com						bmap, &new_blk);
94a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		if (retval)
95a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com			return retval;
96a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		for (j=0, blk = new_blk;
97a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		     j < fs->inode_blocks_per_group;
98a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		     j++, blk++)
99a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com			ext2fs_mark_block_bitmap(bmap, blk);
100a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		fs->group_desc[group].bg_inode_table = new_blk;
101a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	}
102a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
103f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina
104a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	return 0;
105a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com}
106a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
107a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
108f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina
109a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.comerrcode_t ext2fs_allocate_tables(ext2_filsys fs)
110644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org{
111644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org	errcode_t	retval;
112a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	dgrp_t		i;
113644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
114a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	for (i = 0; i < fs->group_desc_count; i++) {
115a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		retval = ext2fs_allocate_group_table(fs, i, fs->block_map);
116a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com		if (retval)
117a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com			return retval;
118a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com	}
1193361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org	return 0;
1203361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org}
121a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com
122a02bc1519cf49afa31fb38bed097dd5014880d04bungeman@google.com