diff options
author | Mike Frysinger <vapier@gentoo.org> | 2005-05-09 22:10:42 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2005-05-09 22:10:42 +0000 |
commit | 1fd98e039d146dcff02a5350f509cabca65fd29c (patch) | |
tree | 1564707d41a6271bb44cf3fa5b88b9cc70fedd35 /e2fsprogs/ext2fs/alloc_tables.c | |
parent | b32011943a0764872ca1ea17f13b53176ace8e69 (diff) | |
download | busybox-w32-1fd98e039d146dcff02a5350f509cabca65fd29c.tar.gz busybox-w32-1fd98e039d146dcff02a5350f509cabca65fd29c.tar.bz2 busybox-w32-1fd98e039d146dcff02a5350f509cabca65fd29c.zip |
import ext2fs lib to prep for new e2fsprogs
Diffstat (limited to 'e2fsprogs/ext2fs/alloc_tables.c')
-rw-r--r-- | e2fsprogs/ext2fs/alloc_tables.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/e2fsprogs/ext2fs/alloc_tables.c b/e2fsprogs/ext2fs/alloc_tables.c new file mode 100644 index 000000000..0326321be --- /dev/null +++ b/e2fsprogs/ext2fs/alloc_tables.c | |||
@@ -0,0 +1,117 @@ | |||
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 | |||
30 | errcode_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 | |||
105 | errcode_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 | |||