aboutsummaryrefslogtreecommitdiff
path: root/resize
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2018-10-21 09:32:37 -0400
committerTheodore Ts'o <tytso@mit.edu>2018-10-21 09:34:58 -0400
commitae9c0f3666de1aec5ebb2663346dcfc116f90f50 (patch)
tree8d1641e5da6c0230ed91e8a86fa72f97ce3edc12 /resize
parent08699437143aad0fbae2d9ab18c5d6e67c4fa761 (diff)
downloade2fsprogs-ae9c0f3666de1aec5ebb2663346dcfc116f90f50.tar.gz
libext2fs: refactor code which fixes up the checksums in an extent tree
The code to recalculate the checksums in an extent tree (which is needed after an inode is relocated so it has a different inode number) was duplicated in tune2fs and resize2fs. In addition, this work could be done in a much more efficient way inside lib/ext2fs/extent.c. This commit creates a new library function which corrects the checksums in an inode's extent tree, named: ext2fs_fix_extents_checksums() Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'resize')
-rw-r--r--resize/resize2fs.c56
1 files changed, 2 insertions, 54 deletions
diff --git a/resize/resize2fs.c b/resize/resize2fs.c
index 38032e5c..c2e10471 100644
--- a/resize/resize2fs.c
+++ b/resize/resize2fs.c
@@ -1927,59 +1927,6 @@ out:
return err;
}
-/* Rewrite extents */
-static errcode_t rewrite_extents(ext2_filsys fs, ext2_ino_t ino)
-{
- ext2_extent_handle_t handle;
- struct ext2fs_extent extent;
- errcode_t errcode;
- struct ext2_extent_info info;
-
- errcode = ext2fs_extent_open(fs, ino, &handle);
- if (errcode)
- return errcode;
-
- errcode = ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent);
- if (errcode)
- goto out;
-
- do {
- errcode = ext2fs_extent_get_info(handle, &info);
- if (errcode)
- break;
-
- /*
- * If this is the first extent in an extent block that we
- * haven't visited, rewrite the extent to force the ETB
- * checksum to be rewritten.
- */
- if (info.curr_entry == 1 && info.curr_level != 0 &&
- !(extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT)) {
- errcode = ext2fs_extent_replace(handle, 0, &extent);
- if (errcode)
- break;
- }
-
- /* Skip to the end of a block of leaf nodes */
- if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) {
- errcode = ext2fs_extent_get(handle,
- EXT2_EXTENT_LAST_SIB,
- &extent);
- if (errcode)
- break;
- }
-
- errcode = ext2fs_extent_get(handle, EXT2_EXTENT_NEXT, &extent);
- } while (errcode == 0);
-
-out:
- /* Ok if we run off the end */
- if (errcode == EXT2_ET_EXTENT_NO_NEXT)
- errcode = 0;
- ext2fs_extent_free(handle);
- return errcode;
-}
-
static void quiet_com_err_proc(const char *whoami EXT2FS_ATTR((unused)),
errcode_t code EXT2FS_ATTR((unused)),
const char *fmt EXT2FS_ATTR((unused)),
@@ -2276,7 +2223,8 @@ remap_blocks:
/* Fix up extent block checksums with the new inode number */
if (ext2fs_has_feature_metadata_csum(rfs->old_fs->super) &&
(inode->i_flags & EXT4_EXTENTS_FL)) {
- retval = rewrite_extents(rfs->old_fs, new_inode);
+ retval = ext2fs_fix_extents_checksums(rfs->old_fs,
+ new_inode, NULL);
if (retval)
goto errout;
}