diff options
Diffstat (limited to 'lib/ext2fs/block.c')
-rw-r--r-- | lib/ext2fs/block.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/ext2fs/block.c b/lib/ext2fs/block.c index 85a1803d..b8c68798 100644 --- a/lib/ext2fs/block.c +++ b/lib/ext2fs/block.c @@ -389,7 +389,7 @@ errcode_t ext2fs_block_iterate3(ext2_filsys fs, if (inode.i_flags & EXT4_EXTENTS_FL) { ext2_extent_handle_t handle; - struct ext2fs_extent extent; + struct ext2fs_extent extent, next; e2_blkcnt_t blockcnt = 0; blk64_t blk, new_blk; int op = EXT2_EXTENT_ROOT; @@ -401,7 +401,11 @@ errcode_t ext2fs_block_iterate3(ext2_filsys fs, goto abort_exit; while (1) { - ctx.errcode = ext2fs_extent_get(handle, op, &extent); + if (op == EXT2_EXTENT_CURRENT) + ctx.errcode = 0; + else + ctx.errcode = ext2fs_extent_get(handle, op, + &extent); if (ctx.errcode) { if (ctx.errcode != EXT2_ET_EXTENT_NO_NEXT) break; @@ -456,14 +460,21 @@ errcode_t ext2fs_block_iterate3(ext2_filsys fs, uninit = 0; if (extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT) uninit = EXT2_EXTENT_SET_BMAP_UNINIT; + + /* + * Get the next extent before we start messing + * with the current extent + */ + retval = ext2fs_extent_get(handle, op, &next); + #if 0 printf("lblk %llu pblk %llu len %d blockcnt %llu\n", extent.e_lblk, extent.e_pblk, extent.e_len, blockcnt); #endif - if (extent.e_lblk + extent.e_len <= blockcnt) + if (extent.e_lblk + extent.e_len <= (blk64_t) blockcnt) continue; - if (extent.e_lblk > blockcnt) + if (extent.e_lblk > (blk64_t) blockcnt) blockcnt = extent.e_lblk; j = blockcnt - extent.e_lblk; blk += j; @@ -487,6 +498,10 @@ errcode_t ext2fs_block_iterate3(ext2_filsys fs, if (ret & BLOCK_ABORT) goto extent_done; } + if (retval == 0) { + extent = next; + op = EXT2_EXTENT_CURRENT; + } } extent_done: |