1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2ac27a0ecSDave Kleikamp /* 3617ba13bSMingming Cao * linux/fs/ext4/bitmap.c 4ac27a0ecSDave Kleikamp * 5ac27a0ecSDave Kleikamp * Copyright (C) 1992, 1993, 1994, 1995 6ac27a0ecSDave Kleikamp * Remy Card (card@masi.ibp.fr) 7ac27a0ecSDave Kleikamp * Laboratoire MASI - Institut Blaise Pascal 8ac27a0ecSDave Kleikamp * Universite Pierre et Marie Curie (Paris VI) 9ac27a0ecSDave Kleikamp */ 10ac27a0ecSDave Kleikamp 11ac27a0ecSDave Kleikamp #include <linux/buffer_head.h> 123dcf5451SChristoph Hellwig #include "ext4.h" 13ac27a0ecSDave Kleikamp 14f6fb99caSTheodore Ts'o unsigned int ext4_count_free(char *bitmap, unsigned int numchars) 15ac27a0ecSDave Kleikamp { 166017b485SAkinobu Mita return numchars * BITS_PER_BYTE - memweight(bitmap, numchars); 17ac27a0ecSDave Kleikamp } 18ac27a0ecSDave Kleikamp 19b83acc77SKemeng Shi int ext4_inode_bitmap_csum_verify(struct super_block *sb, 2041a246d1SDarrick J. Wong struct ext4_group_desc *gdp, 2141a246d1SDarrick J. Wong struct buffer_head *bh, int sz) 2241a246d1SDarrick J. Wong { 2341a246d1SDarrick J. Wong __u32 hi; 2441a246d1SDarrick J. Wong __u32 provided, calculated; 2541a246d1SDarrick J. Wong struct ext4_sb_info *sbi = EXT4_SB(sb); 2641a246d1SDarrick J. Wong 279aa5d32bSDmitry Monakhov if (!ext4_has_metadata_csum(sb)) 2841a246d1SDarrick J. Wong return 1; 2941a246d1SDarrick J. Wong 3041a246d1SDarrick J. Wong provided = le16_to_cpu(gdp->bg_inode_bitmap_csum_lo); 3141a246d1SDarrick J. Wong calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 3241a246d1SDarrick J. Wong if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) { 3341a246d1SDarrick J. Wong hi = le16_to_cpu(gdp->bg_inode_bitmap_csum_hi); 3441a246d1SDarrick J. Wong provided |= (hi << 16); 3541a246d1SDarrick J. Wong } else 3641a246d1SDarrick J. Wong calculated &= 0xFFFF; 3741a246d1SDarrick J. Wong 3841a246d1SDarrick J. Wong return provided == calculated; 3941a246d1SDarrick J. Wong } 4041a246d1SDarrick J. Wong 41*4fd873c8SKemeng Shi void ext4_inode_bitmap_csum_set(struct super_block *sb, 4241a246d1SDarrick J. Wong struct ext4_group_desc *gdp, 4341a246d1SDarrick J. Wong struct buffer_head *bh, int sz) 4441a246d1SDarrick J. Wong { 4541a246d1SDarrick J. Wong __u32 csum; 4641a246d1SDarrick J. Wong struct ext4_sb_info *sbi = EXT4_SB(sb); 4741a246d1SDarrick J. Wong 489aa5d32bSDmitry Monakhov if (!ext4_has_metadata_csum(sb)) 4941a246d1SDarrick J. Wong return; 5041a246d1SDarrick J. Wong 5141a246d1SDarrick J. Wong csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 5241a246d1SDarrick J. Wong gdp->bg_inode_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF); 5341a246d1SDarrick J. Wong if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) 5441a246d1SDarrick J. Wong gdp->bg_inode_bitmap_csum_hi = cpu_to_le16(csum >> 16); 5541a246d1SDarrick J. Wong } 56fa77dcfaSDarrick J. Wong 57fa77dcfaSDarrick J. Wong int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, 58fa77dcfaSDarrick J. Wong struct ext4_group_desc *gdp, 5979f1ba49STao Ma struct buffer_head *bh) 60fa77dcfaSDarrick J. Wong { 61fa77dcfaSDarrick J. Wong __u32 hi; 62fa77dcfaSDarrick J. Wong __u32 provided, calculated; 63fa77dcfaSDarrick J. Wong struct ext4_sb_info *sbi = EXT4_SB(sb); 6479f1ba49STao Ma int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; 65fa77dcfaSDarrick J. Wong 669aa5d32bSDmitry Monakhov if (!ext4_has_metadata_csum(sb)) 67fa77dcfaSDarrick J. Wong return 1; 68fa77dcfaSDarrick J. Wong 69fa77dcfaSDarrick J. Wong provided = le16_to_cpu(gdp->bg_block_bitmap_csum_lo); 70fa77dcfaSDarrick J. Wong calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 71fa77dcfaSDarrick J. Wong if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) { 72fa77dcfaSDarrick J. Wong hi = le16_to_cpu(gdp->bg_block_bitmap_csum_hi); 73fa77dcfaSDarrick J. Wong provided |= (hi << 16); 74fa77dcfaSDarrick J. Wong } else 75fa77dcfaSDarrick J. Wong calculated &= 0xFFFF; 76fa77dcfaSDarrick J. Wong 77fa77dcfaSDarrick J. Wong if (provided == calculated) 78fa77dcfaSDarrick J. Wong return 1; 79fa77dcfaSDarrick J. Wong 80fa77dcfaSDarrick J. Wong return 0; 81fa77dcfaSDarrick J. Wong } 82fa77dcfaSDarrick J. Wong 83fa77dcfaSDarrick J. Wong void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group, 84fa77dcfaSDarrick J. Wong struct ext4_group_desc *gdp, 8579f1ba49STao Ma struct buffer_head *bh) 86fa77dcfaSDarrick J. Wong { 8779f1ba49STao Ma int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; 88fa77dcfaSDarrick J. Wong __u32 csum; 89fa77dcfaSDarrick J. Wong struct ext4_sb_info *sbi = EXT4_SB(sb); 90fa77dcfaSDarrick J. Wong 919aa5d32bSDmitry Monakhov if (!ext4_has_metadata_csum(sb)) 92fa77dcfaSDarrick J. Wong return; 93fa77dcfaSDarrick J. Wong 94fa77dcfaSDarrick J. Wong csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 95fa77dcfaSDarrick J. Wong gdp->bg_block_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF); 96fa77dcfaSDarrick J. Wong if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) 97fa77dcfaSDarrick J. Wong gdp->bg_block_bitmap_csum_hi = cpu_to_le16(csum >> 16); 98fa77dcfaSDarrick J. Wong } 99