diff options
author | Theodore Ts'o <tytso@mit.edu> | 2018-10-21 09:32:37 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-10-21 09:34:58 -0400 |
commit | ae9c0f3666de1aec5ebb2663346dcfc116f90f50 (patch) | |
tree | 8d1641e5da6c0230ed91e8a86fa72f97ce3edc12 /resize | |
parent | 08699437143aad0fbae2d9ab18c5d6e67c4fa761 (diff) | |
download | e2fsprogs-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.c | 56 |
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; } |