diff options
author | Jose R. Santos <jrs@us.ibm.com> | 2009-06-01 16:15:40 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-06-01 16:15:40 -0400 |
commit | 8a5e1812ae21d3d847a4df1067a105f284eb187c (patch) | |
tree | d92fc2bdccadd03d0e8bae980fc52827a804dda8 /lib/ext2fs/alloc.c | |
parent | e8328e31a98a92b39611314612a40b6113921fe2 (diff) | |
download | e2fsprogs-8a5e1812ae21d3d847a4df1067a105f284eb187c.tar.gz |
Add 64-bit alloc interface
Add new ext2fs_new_block2(), ext2fs_get_free_blocks2() and
ext2fs_alloc_block2() that take and return blk64_t.
Signed-off-by: Jose R. Santos <jrs@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'lib/ext2fs/alloc.c')
-rw-r--r-- | lib/ext2fs/alloc.c | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/lib/ext2fs/alloc.c b/lib/ext2fs/alloc.c index ade51494..a1399081 100644 --- a/lib/ext2fs/alloc.c +++ b/lib/ext2fs/alloc.c @@ -146,10 +146,10 @@ errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, * Stupid algorithm --- we now just search forward starting from the * goal. Should put in a smarter one someday.... */ -errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal, - ext2fs_block_bitmap map, blk_t *ret) +errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal, + ext2fs_block_bitmap map, blk64_t *ret) { - blk_t i; + blk64_t i; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); @@ -170,7 +170,8 @@ errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal, (i - fs->super->s_first_data_block) / EXT2_BLOCKS_PER_GROUP(fs->super)); - if (!ext2fs_fast_test_block_bitmap(map, i)) { + /* FIXME-64 */ + if (!ext2fs_fast_test_block_bitmap(map, (blk_t) i)) { *ret = i; return 0; } @@ -181,15 +182,26 @@ errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal, return EXT2_ET_BLOCK_ALLOC_FAIL; } +errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal, + ext2fs_block_bitmap map, blk_t *ret) +{ + errcode_t retval; + blk64_t val; + retval = ext2fs_new_block2(fs, goal, map, &val); + if (!retval) + *ret = (blk_t) val; + return retval; +} + /* * This function zeros out the allocated block, and updates all of the * appropriate filesystem records. */ -errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal, - char *block_buf, blk_t *ret) +errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal, + char *block_buf, blk64_t *ret) { errcode_t retval; - blk_t block; + blk64_t block; char *buf = 0; if (!block_buf) { @@ -201,29 +213,27 @@ errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal, memset(block_buf, 0, fs->blocksize); if (fs->get_alloc_block) { - blk64_t new; - - retval = (fs->get_alloc_block)(fs, (blk64_t) goal, &new); + retval = (fs->get_alloc_block)(fs, goal, &block); if (retval) goto fail; - block = (blk_t) new; } else { if (!fs->block_map) { + /* FIXME-64 */ retval = ext2fs_read_block_bitmap(fs); if (retval) goto fail; } - retval = ext2fs_new_block(fs, goal, 0, &block); + retval = ext2fs_new_block2(fs, goal, 0, &block); if (retval) goto fail; } - retval = io_channel_write_blk(fs->io, block, 1, block_buf); + retval = io_channel_write_blk64(fs->io, block, 1, block_buf); if (retval) goto fail; - ext2fs_block_alloc_stats(fs, block, +1); + ext2fs_block_alloc_stats2(fs, block, +1); *ret = block; fail: @@ -232,10 +242,21 @@ fail: return retval; } -errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start, blk_t finish, - int num, ext2fs_block_bitmap map, blk_t *ret) +errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal, + char *block_buf, blk_t *ret) +{ + errcode_t retval; + blk64_t val; + retval = ext2fs_alloc_block2(fs, goal, block_buf, &val); + if (!retval) + *ret = (blk_t) val; + return retval; +} + +errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start, blk64_t finish, + int num, ext2fs_block_bitmap map, blk64_t *ret) { - blk_t b = start; + blk64_t b = start; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); @@ -252,7 +273,9 @@ errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start, blk_t finish, do { if (b+num-1 > fs->super->s_blocks_count) b = fs->super->s_first_data_block; - if (ext2fs_fast_test_block_bitmap_range(map, b, num)) { + /* FIXME-64 */ + if (ext2fs_fast_test_block_bitmap_range(map, (blk_t) b, + (blk_t) num)) { *ret = b; return 0; } @@ -261,6 +284,17 @@ errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start, blk_t finish, return EXT2_ET_BLOCK_ALLOC_FAIL; } +errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start, blk_t finish, + int num, ext2fs_block_bitmap map, blk_t *ret) +{ + errcode_t retval; + blk64_t val; + retval = ext2fs_get_free_blocks2(fs, start, finish, num, map, &val); + if(!retval) + *ret = (blk_t) val; + return retval; +} + void ext2fs_set_alloc_block_callback(ext2_filsys fs, errcode_t (*func)(ext2_filsys fs, blk64_t goal, |