From da994e9c11749fc9a427e742273b27853b74fe1d Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Fri, 22 Aug 2008 02:46:16 -0400 Subject: [PATCH] ext2fs_extent_set_bmap(): Avoid creating extra extents for resize2fs When resize2fs moves blocks belonging to an inode, it will call ext2fs_extent_set_bmap() for logical blocks 0, 1, 2, 3, ... Optimize for this calling pattern so we don't end up creating a separate extent for each block. Signed-off-by: "Theodore Ts'o" --- lib/ext2fs/extent.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c index 0292272..9f76ccf 100644 --- a/lib/ext2fs/extent.c +++ b/lib/ext2fs/extent.c @@ -1157,6 +1157,7 @@ errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle, orig_height = info.max_depth - info.curr_level; orig_lblk = extent.e_lblk; +again: /* go to the logical spot we want to (re/un)map */ retval = ext2fs_extent_goto(handle, logical); if (retval) { @@ -1255,11 +1256,12 @@ errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle, if (retval) goto done; if (physical) { - /* insert new extent ahead of current */ - retval = ext2fs_extent_insert(handle, - 0, &newextent); - if (retval) - goto done; + /* + * We've removed the old block, now rely on + * the optimized hueristics for adding a new + * mapping with appropriate merging if necessary. + */ + goto again; } else { retval = ext2fs_extent_fix_parents(handle); if (retval) -- 1.8.3.1