libext2fs: precompute FS UUID checksum seed

Precompute the FS UUID checksum seed that is used for all metadata
checksumming operations and store it in ext2_filsys.

Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
pu
Darrick J. Wong 2012-07-30 18:44:04 -04:00 committed by Theodore Ts'o
parent 9bca9a39b7
commit 4ffbe3afa9
4 changed files with 18 additions and 0 deletions

View File

@ -716,6 +716,7 @@ void check_super_block(e2fsck_t ctx)
if (!(ctx->options & E2F_OPT_READONLY) && uuid_is_null(sb->s_uuid)) {
if (fix_problem(ctx, PR_0_ADD_UUID, &pctx)) {
uuid_generate(sb->s_uuid);
ext2fs_init_csum_seed(fs);
fs->flags |= EXT2_FLAG_DIRTY;
fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
}

View File

@ -271,6 +271,9 @@ struct struct_ext2_filsys {
/* progress operation functions */
struct ext2fs_progress_ops *progress_ops;
/* Precomputed FS UUID checksum for seeding other checksums */
__u32 csum_seed;
};
#if EXT2_FLAT_INCLUDES
@ -1431,6 +1434,7 @@ extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
/* inline functions */
extern void ext2fs_init_csum_seed(ext2_filsys fs);
extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
extern errcode_t ext2fs_get_memalign(unsigned long size,
unsigned long align, void *ptr);
@ -1483,6 +1487,16 @@ extern int ext2fs_fstat(int fd, ext2fs_struct_stat *buf);
#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
#include <string.h>
_INLINE_ void ext2fs_init_csum_seed(ext2_filsys fs)
{
if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
return;
fs->csum_seed = ext2fs_crc32c_le(~0, fs->super->s_uuid,
sizeof(fs->super->s_uuid));
}
/*
* Allocate memory
*/

View File

@ -315,6 +315,8 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
retval = EXT2_ET_CORRUPT_SUPERBLOCK;
goto cleanup;
}
/* Precompute the FS UUID to seed other checksums */
ext2fs_init_csum_seed(fs);
/*
* Read group descriptors

View File

@ -2323,6 +2323,7 @@ int main (int argc, char *argv[])
}
} else
uuid_generate(fs->super->s_uuid);
ext2fs_init_csum_seed(fs);
/*
* Initialize the directory index variables