]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: Fix ext2fs_bmap() to work with extents and BMAP_ALLOC
authorTheodore Ts'o <tytso@mit.edu>
Wed, 27 Aug 2008 22:37:11 +0000 (18:37 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 27 Aug 2008 22:37:11 +0000 (18:37 -0400)
Fix bugs with extents support when allocating blocks.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/bmap.c
lib/ext2fs/extent.c

index e56a99acb537bcf1939557df004234256ed0aadb..be7ccbc976a62ffb7d48dca30450c50500b5b1c9 100644 (file)
@@ -172,7 +172,7 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
                if (retval) {
                        /* If the extent is not found, return phys_blk = 0 */
                        if (retval == EXT2_ET_EXTENT_NOT_FOUND)
-                               retval = 0;
+                               goto got_block;
                        goto done;
                }
                retval = ext2fs_extent_get(handle, EXT2_EXTENT_CURRENT, &extent);
@@ -184,6 +184,7 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
                        if (ret_flags && extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT)
                                *ret_flags |= BMAP_RET_UNINIT;
                }
+       got_block:
                if ((*phys_blk == 0) && (bmap_flags & BMAP_ALLOC)) {
                        retval = ext2fs_alloc_block(fs, b, block_buf, &b);
                        if (retval)
@@ -192,6 +193,10 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
                                                        (blk64_t) b, 0);
                        if (retval)
                                goto done;
+                       /* Update inode after setting extent */
+                       retval = ext2fs_read_inode(fs, ino, inode);
+                       if (retval)
+                               return retval;
                        blocks_alloc++;
                        *phys_blk = b;
                }
index 9f76ccf7ae17d5f898eeb1bccdbbd2d0d9e908c0..a2cf679f3fe8495506af6511bf889901241af453 100644 (file)
@@ -600,8 +600,11 @@ static errcode_t extent_goto(ext2_extent_handle_t handle,
        errcode_t               retval;
 
        retval = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent);
-       if (retval)
+       if (retval) {
+               if (retval == EXT2_ET_EXTENT_NO_NEXT)
+                       retval = EXT2_ET_EXTENT_NOT_FOUND;
                return retval;
+       }
 
        if (leaf_level > handle->max_depth) {
 #ifdef DEBUG