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