1 /* vi: set sw=4 ts=4: */
3 * alloc.c --- allocate new inodes, blocks for ext2fs
5 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
8 * This file may be redistributed under the terms of the GNU Public
24 #include <sys/types.h>
31 * Right now, just search forward from the parent directory's block
32 * group to find the next free inode.
34 * Should have a special policy for directories.
36 errcode_t
ext2fs_new_inode(ext2_filsys fs
, ext2_ino_t dir
,
37 int mode
EXT2FS_ATTR((unused
)),
38 ext2fs_inode_bitmap map
, ext2_ino_t
*ret
)
40 ext2_ino_t dir_group
= 0;
42 ext2_ino_t start_inode
;
44 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
49 return EXT2_ET_NO_INODE_BITMAP
;
52 dir_group
= (dir
- 1) / EXT2_INODES_PER_GROUP(fs
->super
);
54 start_inode
= (dir_group
* EXT2_INODES_PER_GROUP(fs
->super
)) + 1;
55 if (start_inode
< EXT2_FIRST_INODE(fs
->super
))
56 start_inode
= EXT2_FIRST_INODE(fs
->super
);
60 if (!ext2fs_fast_test_inode_bitmap(map
, i
))
63 if (i
> fs
->super
->s_inodes_count
)
64 i
= EXT2_FIRST_INODE(fs
->super
);
65 } while (i
!= start_inode
);
67 if (ext2fs_test_inode_bitmap(map
, i
))
68 return EXT2_ET_INODE_ALLOC_FAIL
;
74 * Stupid algorithm --- we now just search forward starting from the
75 * goal. Should put in a smarter one someday....
77 errcode_t
ext2fs_new_block(ext2_filsys fs
, blk_t goal
,
78 ext2fs_block_bitmap map
, blk_t
*ret
)
82 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
87 return EXT2_ET_NO_BLOCK_BITMAP
;
88 if (!goal
|| (goal
>= fs
->super
->s_blocks_count
))
89 goal
= fs
->super
->s_first_data_block
;
92 if (!ext2fs_fast_test_block_bitmap(map
, i
)) {
97 if (i
>= fs
->super
->s_blocks_count
)
98 i
= fs
->super
->s_first_data_block
;
100 return EXT2_ET_BLOCK_ALLOC_FAIL
;
104 * This function zeros out the allocated block, and updates all of the
105 * appropriate filesystem records.
107 errcode_t
ext2fs_alloc_block(ext2_filsys fs
, blk_t goal
,
108 char *block_buf
, blk_t
*ret
)
115 retval
= ext2fs_get_mem(fs
->blocksize
, &buf
);
120 memset(block_buf
, 0, fs
->blocksize
);
122 if (!fs
->block_map
) {
123 retval
= ext2fs_read_block_bitmap(fs
);
128 retval
= ext2fs_new_block(fs
, goal
, 0, &block
);
132 retval
= io_channel_write_blk(fs
->io
, block
, 1, block_buf
);
136 ext2fs_block_alloc_stats(fs
, block
, +1);
142 ext2fs_free_mem(&buf
);
146 errcode_t
ext2fs_get_free_blocks(ext2_filsys fs
, blk_t start
, blk_t finish
,
147 int num
, ext2fs_block_bitmap map
, blk_t
*ret
)
151 EXT2_CHECK_MAGIC(fs
, EXT2_ET_MAGIC_EXT2FS_FILSYS
);
156 return EXT2_ET_NO_BLOCK_BITMAP
;
158 b
= fs
->super
->s_first_data_block
;
164 if (b
+num
-1 > fs
->super
->s_blocks_count
)
165 b
= fs
->super
->s_first_data_block
;
166 if (ext2fs_fast_test_block_bitmap_range(map
, b
, num
)) {
171 } while (b
!= finish
);
172 return EXT2_ET_BLOCK_ALLOC_FAIL
;