Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : /* 3 : * linux/fs/ext4/bitmap.c 4 : * 5 : * Copyright (C) 1992, 1993, 1994, 1995 6 : * Remy Card (card@masi.ibp.fr) 7 : * Laboratoire MASI - Institut Blaise Pascal 8 : * Universite Pierre et Marie Curie (Paris VI) 9 : */ 10 : 11 : #include <linux/buffer_head.h> 12 : #include "ext4.h" 13 : 14 0 : unsigned int ext4_count_free(char *bitmap, unsigned int numchars) 15 : { 16 0 : return numchars * BITS_PER_BYTE - memweight(bitmap, numchars); 17 : } 18 : 19 1185 : int ext4_inode_bitmap_csum_verify(struct super_block *sb, 20 : struct ext4_group_desc *gdp, 21 : struct buffer_head *bh, int sz) 22 : { 23 1185 : __u32 hi; 24 1185 : __u32 provided, calculated; 25 1185 : struct ext4_sb_info *sbi = EXT4_SB(sb); 26 : 27 1185 : if (!ext4_has_metadata_csum(sb)) 28 : return 1; 29 : 30 1180 : provided = le16_to_cpu(gdp->bg_inode_bitmap_csum_lo); 31 1180 : calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 32 1180 : if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) { 33 1179 : hi = le16_to_cpu(gdp->bg_inode_bitmap_csum_hi); 34 1179 : provided |= (hi << 16); 35 : } else 36 1 : calculated &= 0xFFFF; 37 : 38 1180 : return provided == calculated; 39 : } 40 : 41 4733042 : void ext4_inode_bitmap_csum_set(struct super_block *sb, 42 : struct ext4_group_desc *gdp, 43 : struct buffer_head *bh, int sz) 44 : { 45 4733042 : __u32 csum; 46 4733042 : struct ext4_sb_info *sbi = EXT4_SB(sb); 47 : 48 4733042 : if (!ext4_has_metadata_csum(sb)) 49 : return; 50 : 51 4716404 : csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 52 4740191 : gdp->bg_inode_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF); 53 4740191 : if (sbi->s_desc_size >= EXT4_BG_INODE_BITMAP_CSUM_HI_END) 54 4737823 : gdp->bg_inode_bitmap_csum_hi = cpu_to_le16(csum >> 16); 55 : } 56 : 57 100292 : int ext4_block_bitmap_csum_verify(struct super_block *sb, 58 : struct ext4_group_desc *gdp, 59 : struct buffer_head *bh) 60 : { 61 100292 : __u32 hi; 62 100292 : __u32 provided, calculated; 63 100292 : struct ext4_sb_info *sbi = EXT4_SB(sb); 64 100292 : int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; 65 : 66 100292 : if (!ext4_has_metadata_csum(sb)) 67 : return 1; 68 : 69 100164 : provided = le16_to_cpu(gdp->bg_block_bitmap_csum_lo); 70 100164 : calculated = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 71 100164 : if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) { 72 100160 : hi = le16_to_cpu(gdp->bg_block_bitmap_csum_hi); 73 100160 : provided |= (hi << 16); 74 : } else 75 4 : calculated &= 0xFFFF; 76 : 77 100164 : return provided == calculated; 78 : } 79 : 80 5799107 : void ext4_block_bitmap_csum_set(struct super_block *sb, 81 : struct ext4_group_desc *gdp, 82 : struct buffer_head *bh) 83 : { 84 5799107 : int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; 85 5799107 : __u32 csum; 86 5799107 : struct ext4_sb_info *sbi = EXT4_SB(sb); 87 : 88 5799107 : if (!ext4_has_metadata_csum(sb)) 89 : return; 90 : 91 5793938 : csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)bh->b_data, sz); 92 5793689 : gdp->bg_block_bitmap_csum_lo = cpu_to_le16(csum & 0xFFFF); 93 5793689 : if (sbi->s_desc_size >= EXT4_BG_BLOCK_BITMAP_CSUM_HI_END) 94 5792861 : gdp->bg_block_bitmap_csum_hi = cpu_to_le16(csum >> 16); 95 : }