mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-28 16:53:49 +00:00
66eafbde7d
There are some little improve: 1. remove repeat code to calculate checksum length of inode bitmap 2. remove unnecessary checksum length calculation if checksum is not enabled. 3. use more efficient bit shift operation instead of div opreation. Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Link: https://patch.msgid.link/20240820132234.2759926-6-shikemeng@huaweicloud.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
100 lines
2.6 KiB
C
100 lines
2.6 KiB
C
// 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);
|
|
}
|