static uint32_t ext4_balloc_bitmap_csum(struct ext4_sblock *sb, void *bitmap) { uint32_t checksum = 0; if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_METADATA_CSUM)) { uint32_t blocks_per_group = ext4_get32(sb, blocks_per_group); /* First calculate crc32 checksum against fs uuid */ checksum = ext4_crc32c(EXT4_CRC32_INIT, sb->uuid, sizeof(sb->uuid)); /* Then calculate crc32 checksum against block_group_desc */ checksum = ext4_crc32c(checksum, bitmap, blocks_per_group / 8); } return checksum; }
static struct inode *open_ext4_db(char *file) { int fd; struct ext4_extent_header *ihdr; struct inode *inode; struct db_handle *db; struct block_device *bdev; fd = device_open(file); bdev = bdev_alloc(fd, 12); inode = inode_alloc(bdev->bd_super); /* For testing purpose, those data is hard-coded. */ inode->i_writeback = inode_sb_writeback; memset(inode->i_uuid, 0xCC, sizeof(inode->i_uuid)); inode->i_inum = 45; inode->i_csum = ext4_crc32c(~0, inode->i_uuid, sizeof(inode->i_uuid)); inode->i_csum = ext4_crc32c(inode->i_csum, &inode->i_inum, sizeof(inode->i_inum)); inode->i_csum = ext4_crc32c(inode->i_csum, &inode->i_generation, sizeof(inode->i_generation)); if (!device_size(bdev)) exit(EXIT_FAILURE); db = db_open(inode->i_sb); ihdr = ext4_ext_inode_hdr(inode); memcpy(ihdr, db->db_header->db_tree_base, sizeof(inode->i_data)); if (ihdr->eh_magic != EXT4_EXT_MAGIC) { ext4_ext_init_i_blocks(ihdr); inode->i_data_dirty = 1; } inode->i_db = db; return inode; }
static uint32_t ext4_dir_dx_checksum(struct ext4_inode_ref *inode_ref, void *dirent, int count_offset, int count, struct ext4_directory_dx_tail *t) { uint32_t orig_checksum, checksum = 0; struct ext4_sblock *sb = &inode_ref->fs->sb; int size; /* Compute the checksum only if the filesystem supports it */ if (ext4_sb_feature_ro_com(sb, EXT4_FRO_COM_METADATA_CSUM)) { uint32_t ino_index = to_le32(inode_ref->index); uint32_t ino_gen = to_le32(ext4_inode_get_generation(inode_ref->inode)); size = count_offset + (count * sizeof(struct ext4_directory_dx_tail)); orig_checksum = t->checksum; t->checksum = 0; /* First calculate crc32 checksum against fs uuid */ checksum = ext4_crc32c(EXT4_CRC32_INIT, sb->uuid, sizeof(sb->uuid)); /* Then calculate crc32 checksum against inode number * and inode generation */ checksum = ext4_crc32c(checksum, &ino_index, sizeof(ino_index)); checksum = ext4_crc32c(checksum, &ino_gen, sizeof(ino_gen)); /* After that calculate crc32 checksum against all the dx_entry */ checksum = ext4_crc32c(checksum, dirent, size); /* Finally calculate crc32 checksum for dx_tail */ checksum = ext4_crc32c(checksum, t, sizeof(struct ext4_directory_dx_tail)); t->checksum = orig_checksum; } return checksum; }