From: Darrick J. Wong Date: Mon, 30 Jul 2012 22:44:04 +0000 (-0400) Subject: libext2fs: precompute FS UUID checksum seed X-Git-Tag: v1.43-WIP-2012-09-22~65 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4ffbe3afa9d05a28712c8f5c11b5b76be3dc99fc;p=thirdparty%2Fe2fsprogs.git 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 Signed-off-by: Theodore Ts'o --- diff --git a/e2fsck/super.c b/e2fsck/super.c index 160991d6d..a5e8005b3 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -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; } diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 0728999f7..ed8f0bd0a 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -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 +_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 */ diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c index fbe9acdee..3675518f3 100644 --- a/lib/ext2fs/openfs.c +++ b/lib/ext2fs/openfs.c @@ -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 diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 01b2111b0..94db901a9 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -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