OSDN Git Service

ext2fs_extent_set_bmap(): Avoid creating extra extents for resize2fs
authorTheodore Ts'o <tytso@mit.edu>
Fri, 22 Aug 2008 06:46:16 +0000 (02:46 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 22 Aug 2008 06:46:16 +0000 (02:46 -0400)
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" <tytso@mit.edu>
lib/ext2fs/extent.c

index 0292272..9f76ccf 100644 (file)
@@ -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)