Whamcloud - gitweb
Add 64-bit alloc interface
authorJose R. Santos <jrs@us.ibm.com>
Mon, 1 Jun 2009 20:15:40 +0000 (16:15 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 1 Jun 2009 20:15:40 +0000 (16:15 -0400)
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>
lib/ext2fs/alloc.c
lib/ext2fs/ext2fs.h

index ade5149..a139908 100644 (file)
@@ -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,
index ccdd767..b1a5339 100644 (file)
@@ -555,12 +555,20 @@ extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
                                  ext2fs_inode_bitmap map, ext2_ino_t *ret);
 extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
                                  ext2fs_block_bitmap map, blk_t *ret);
+extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
+                                  ext2fs_block_bitmap map, blk64_t *ret);
 extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
                                        blk_t finish, int num,
                                        ext2fs_block_bitmap map,
                                        blk_t *ret);
+extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
+                                        blk64_t finish, int num,
+                                        ext2fs_block_bitmap map,
+                                        blk64_t *ret);
 extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
                                    char *block_buf, blk_t *ret);
+extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
+                                    char *block_buf, blk64_t *ret);
 extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
                                            errcode_t (*func)(ext2_filsys fs,
                                                              blk64_t goal,