99 lines · 2.6 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/* *  linux/fs/ext4/bitmap.c * * Copyright (C) 1992, 1993, 1994, 1995 * Remy Card (card@masi.ibp.fr) * Laboratoire MASI - Institut Blaise Pascal * Universite Pierre et Marie Curie (Paris VI) */ #include <linux/buffer_head.h>#include "ext4.h" unsigned int ext4_count_free(char *bitmap, unsigned int numchars){	return numchars * BITS_PER_BYTE - memweight(bitmap, numchars);} int ext4_inode_bitmap_csum_verify(struct super_block *sb,				  struct ext4_group_desc *gdp,				  struct buffer_head *bh){	__u32 hi;	__u32 provided, calculated;	struct ext4_sb_info *sbi = EXT4_SB(sb);	int sz; 	if (!ext4_has_metadata_csum(sb))		return 1; 	sz = EXT4_INODES_PER_GROUP(sb) >> 3;	provided = le16_to_cpu(gdp->bg_inode_bitmap_csum_lo);	calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);	if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) {		hi = le16_to_cpu(gdp->bg_inode_bitmap_csum_hi);		provided |= (hi << 16);	} else		calculated &= 0xFFFF; 	return provided == calculated;} void ext4_inode_bitmap_csum_set(struct super_block *sb,				struct ext4_group_desc *gdp,				struct buffer_head *bh){	__u32 csum;	struct ext4_sb_info *sbi = EXT4_SB(sb);	int sz; 	if (!ext4_has_metadata_csum(sb))		return; 	sz = EXT4_INODES_PER_GROUP(sb) >> 3;	csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);	gdp->bg_inode_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF);	if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END)		gdp->bg_inode_bitmap_csum_hi = cpu_to_le16(csum >> 16);} int ext4_block_bitmap_csum_verify(struct super_block *sb,				  struct ext4_group_desc *gdp,				  struct buffer_head *bh){	__u32 hi;	__u32 provided, calculated;	struct ext4_sb_info *sbi = EXT4_SB(sb);	int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; 	if (!ext4_has_metadata_csum(sb))		return 1; 	provided = le16_to_cpu(gdp->bg_block_bitmap_csum_lo);	calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);	if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) {		hi = le16_to_cpu(gdp->bg_block_bitmap_csum_hi);		provided |= (hi << 16);	} else		calculated &= 0xFFFF; 	return provided == calculated;} void ext4_block_bitmap_csum_set(struct super_block *sb,				struct ext4_group_desc *gdp,				struct buffer_head *bh){	int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;	__u32 csum;	struct ext4_sb_info *sbi = EXT4_SB(sb); 	if (!ext4_has_metadata_csum(sb))		return; 	csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz);	gdp->bg_block_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF);	if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END)		gdp->bg_block_bitmap_csum_hi = cpu_to_le16(csum >> 16);}