diff options
author | Darrick J. Wong <djwong@us.ibm.com> | 2012-07-30 19:04:04 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-07-30 19:04:04 -0400 |
commit | e7dc95c6773fa0a49c54846ae609df1d8c2a7286 (patch) | |
tree | f8c4dc17065e88de45190548e199a2660e7f7817 /lib/ext2fs/csum.c | |
parent | 11ac780e5f6a896e6b166314fafe66f334ca162a (diff) | |
download | e2fsprogs-e7dc95c6773fa0a49c54846ae609df1d8c2a7286.tar.gz |
libext2fs: create the block bitmap checksum
Calculate and verify the block bitmap checksum.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'lib/ext2fs/csum.c')
-rw-r--r-- | lib/ext2fs/csum.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/ext2fs/csum.c b/lib/ext2fs/csum.c index 951000a3..3918a4a7 100644 --- a/lib/ext2fs/csum.c +++ b/lib/ext2fs/csum.c @@ -70,6 +70,46 @@ errcode_t ext2fs_inode_bitmap_csum_set(ext2_filsys fs, dgrp_t group, return 0; } +int ext2fs_block_bitmap_csum_verify(ext2_filsys fs, dgrp_t group, + char *bitmap, int size) +{ + struct ext4_group_desc *gdp = (struct ext4_group_desc *) + ext2fs_group_desc(fs, fs->group_desc, group); + __u32 provided, calculated; + + if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super, + EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) + return 1; + provided = gdp->bg_block_bitmap_csum_lo; + calculated = ext2fs_crc32c_le(fs->csum_seed, (unsigned char *)bitmap, + size); + if (fs->super->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_LOCATION) + provided |= (__u32)gdp->bg_block_bitmap_csum_hi << 16; + else + calculated &= 0xFFFF; + + return provided == calculated; +} + +errcode_t ext2fs_block_bitmap_csum_set(ext2_filsys fs, dgrp_t group, + char *bitmap, int size) +{ + __u32 crc; + struct ext4_group_desc *gdp = (struct ext4_group_desc *) + ext2fs_group_desc(fs, fs->group_desc, group); + + if (!EXT2_HAS_RO_COMPAT_FEATURE(fs->super, + EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) + return 0; + + crc = ext2fs_crc32c_le(fs->csum_seed, (unsigned char *)bitmap, size); + gdp->bg_block_bitmap_csum_lo = crc & 0xFFFF; + if (fs->super->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_LOCATION) + gdp->bg_block_bitmap_csum_hi = crc >> 16; + + return 0; +} + static errcode_t ext2fs_inode_csum(ext2_filsys fs, ext2_ino_t inum, struct ext2_inode_large *inode, __u32 *crc, int has_hi) |