source: MondoRescue/branches/stable/mindi-busybox/e2fsprogs/ext2fs/alloc_tables.c @ 821

Last change on this file since 821 was 821, checked in by Bruno Cornec, 13 years ago

Addition of busybox 1.2.1 as a mindi-busybox new package
This should avoid delivering binary files in mindi not built there (Fedora and Debian are quite serious about that)

File size: 2.7 KB
Line 
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        start_blk = group_blk + fs->inode_blocks_per_group;
52        start_blk += ((fs->stride * group) %
53                  (last_blk - start_blk));
54        if (start_blk > last_blk)
55            start_blk = group_blk;
56    } else
57        start_blk = group_blk;
58
59    if (!fs->group_desc[group].bg_block_bitmap) {
60        retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
61                        1, bmap, &new_blk);
62        if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
63            retval = ext2fs_get_free_blocks(fs, group_blk,
64                    last_blk, 1, bmap, &new_blk);
65        if (retval)
66            return retval;
67        ext2fs_mark_block_bitmap(bmap, new_blk);
68        fs->group_desc[group].bg_block_bitmap = new_blk;
69    }
70
71    if (!fs->group_desc[group].bg_inode_bitmap) {
72        retval = ext2fs_get_free_blocks(fs, start_blk, last_blk,
73                        1, bmap, &new_blk);
74        if (retval == EXT2_ET_BLOCK_ALLOC_FAIL)
75            retval = ext2fs_get_free_blocks(fs, group_blk,
76                    last_blk, 1, bmap, &new_blk);
77        if (retval)
78            return retval;
79        ext2fs_mark_block_bitmap(bmap, new_blk);
80        fs->group_desc[group].bg_inode_bitmap = new_blk;
81    }
82
83    /*
84     * Allocate the inode table
85     */
86    if (!fs->group_desc[group].bg_inode_table) {
87        retval = ext2fs_get_free_blocks(fs, group_blk, last_blk,
88                        fs->inode_blocks_per_group,
89                        bmap, &new_blk);
90        if (retval)
91            return retval;
92        for (j=0, blk = new_blk;
93             j < fs->inode_blocks_per_group;
94             j++, blk++)
95            ext2fs_mark_block_bitmap(bmap, blk);
96        fs->group_desc[group].bg_inode_table = new_blk;
97    }
98
99
100    return 0;
101}
102
103
104
105errcode_t ext2fs_allocate_tables(ext2_filsys fs)
106{
107    errcode_t   retval;
108    dgrp_t      i;
109
110    for (i = 0; i < fs->group_desc_count; i++) {
111        retval = ext2fs_allocate_group_table(fs, i, fs->block_map);
112        if (retval)
113            return retval;
114    }
115    return 0;
116}
117
Note: See TracBrowser for help on using the repository browser.