alloc_tables.c revision bc2699f018586f21825e056eb6053686c23804fe
1/* 2 * alloc_tables.c --- Allocate tables for a newly initialized 3 * filesystem. Used by mke2fs when initializing a filesystem 4 * 5 * Copyright (C) 1996 Theodore Ts'o. 6 * 7 * %Begin-Header% 8 * This file may be redistributed under the terms of the GNU Public 9 * License. 10 * %End-Header% 11 */ 12 13#include <stdio.h> 14#include <string.h> 15#if HAVE_UNISTD_H 16#include <unistd.h> 17#endif 18#include <fcntl.h> 19#include <time.h> 20#if HAVE_SYS_STAT_H 21#include <sys/stat.h> 22#endif 23#if HAVE_SYS_TYPES_H 24#include <sys/types.h> 25#endif 26 27#include "ext2_fs.h" 28#include "ext2fs.h" 29 30errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, 31 ext2fs_block_bitmap bmap) 32{ 33 errcode_t retval; 34 blk_t group_blk, start_blk, last_blk, new_blk, blk; 35 int j; 36 37 group_blk = fs->super->s_first_data_block + 38 (group * fs->super->s_blocks_per_group); 39 40 last_blk = group_blk + fs->super->s_blocks_per_group; 41 if (last_blk >= fs->super->s_blocks_count) 42 last_blk = fs->super->s_blocks_count - 1; 43 44 if (!bmap) 45 bmap = fs->block_map; 46 47 /* 48 * Allocate the block and inode bitmaps, if necessary 49 */ 50 if (fs->stride) { 51 retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, 52 1, bmap, &start_blk); 53 if (retval) 54 return retval; 55 start_blk += fs->inode_blocks_per_group; 56 start_blk += ((fs->stride * group) % 57 (last_blk - start_blk)); 58 if (start_blk > last_blk) 59 start_blk = group_blk; 60 } else 61 start_blk = group_blk; 62 63 if (!fs->group_desc[group].bg_block_bitmap) { 64 retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, 65 1, bmap, &new_blk); 66 if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) 67 retval = ext2fs_get_free_blocks(fs, group_blk, 68 last_blk, 1, bmap, &new_blk); 69 if (retval) 70 return retval; 71 ext2fs_mark_block_bitmap(bmap, new_blk); 72 fs->group_desc[group].bg_block_bitmap = new_blk; 73 } 74 75 if (!fs->group_desc[group].bg_inode_bitmap) { 76 retval = ext2fs_get_free_blocks(fs, start_blk, last_blk, 77 1, bmap, &new_blk); 78 if (retval == EXT2_ET_BLOCK_ALLOC_FAIL) 79 retval = ext2fs_get_free_blocks(fs, group_blk, 80 last_blk, 1, bmap, &new_blk); 81 if (retval) 82 return retval; 83 ext2fs_mark_block_bitmap(bmap, new_blk); 84 fs->group_desc[group].bg_inode_bitmap = new_blk; 85 } 86 87 /* 88 * Allocate the inode table 89 */ 90 if (!fs->group_desc[group].bg_inode_table) { 91 retval = ext2fs_get_free_blocks(fs, group_blk, last_blk, 92 fs->inode_blocks_per_group, 93 bmap, &new_blk); 94 if (retval) 95 return retval; 96 for (j=0, blk = new_blk; 97 j < fs->inode_blocks_per_group; 98 j++, blk++) 99 ext2fs_mark_block_bitmap(bmap, blk); 100 fs->group_desc[group].bg_inode_table = new_blk; 101 } 102 103 104 return 0; 105} 106 107 108 109errcode_t ext2fs_allocate_tables(ext2_filsys fs) 110{ 111 errcode_t retval; 112 dgrp_t i; 113 114 for (i = 0; i < fs->group_desc_count; i++) { 115 retval = ext2fs_allocate_group_table(fs, i, fs->block_map); 116 if (retval) 117 return retval; 118 } 119 return 0; 120} 121 122