2006-10-11 12:20:50 +04:00
/*
2006-10-11 12:20:53 +04:00
* linux / fs / ext4 / bitmap . c
2006-10-11 12:20:50 +04:00
*
* 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>
2008-04-30 02:13:32 +04:00
# include "ext4.h"
2006-10-11 12:20:50 +04:00
2012-07-01 03:14:57 +04:00
unsigned int ext4_count_free ( char * bitmap , unsigned int numchars )
2006-10-11 12:20:50 +04:00
{
2012-07-31 01:41:08 +04:00
return numchars * BITS_PER_BYTE - memweight ( bitmap , numchars ) ;
2006-10-11 12:20:50 +04:00
}
2012-04-30 02:33:10 +04:00
int ext4_inode_bitmap_csum_verify ( struct super_block * sb , ext4_group_t group ,
struct ext4_group_desc * gdp ,
struct buffer_head * bh , int sz )
{
__u32 hi ;
__u32 provided , calculated ;
struct ext4_sb_info * sbi = EXT4_SB ( sb ) ;
2014-10-13 11:36:16 +04:00
if ( ! ext4_has_metadata_csum ( sb ) )
2012-04-30 02:33:10 +04:00
return 1 ;
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 , ext4_group_t group ,
struct ext4_group_desc * gdp ,
struct buffer_head * bh , int sz )
{
__u32 csum ;
struct ext4_sb_info * sbi = EXT4_SB ( sb ) ;
2014-10-13 11:36:16 +04:00
if ( ! ext4_has_metadata_csum ( sb ) )
2012-04-30 02:33:10 +04:00
return ;
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 ) ;
}
2012-04-30 02:35:10 +04:00
int ext4_block_bitmap_csum_verify ( struct super_block * sb , ext4_group_t group ,
struct ext4_group_desc * gdp ,
2012-10-22 08:34:32 +04:00
struct buffer_head * bh )
2012-04-30 02:35:10 +04:00
{
__u32 hi ;
__u32 provided , calculated ;
struct ext4_sb_info * sbi = EXT4_SB ( sb ) ;
2012-10-22 08:34:32 +04:00
int sz = EXT4_CLUSTERS_PER_GROUP ( sb ) / 8 ;
2012-04-30 02:35:10 +04:00
2014-10-13 11:36:16 +04:00
if ( ! ext4_has_metadata_csum ( sb ) )
2012-04-30 02:35:10 +04:00
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 ;
if ( provided = = calculated )
return 1 ;
return 0 ;
}
void ext4_block_bitmap_csum_set ( struct super_block * sb , ext4_group_t group ,
struct ext4_group_desc * gdp ,
2012-10-22 08:34:32 +04:00
struct buffer_head * bh )
2012-04-30 02:35:10 +04:00
{
2012-10-22 08:34:32 +04:00
int sz = EXT4_CLUSTERS_PER_GROUP ( sb ) / 8 ;
2012-04-30 02:35:10 +04:00
__u32 csum ;
struct ext4_sb_info * sbi = EXT4_SB ( sb ) ;
2014-10-13 11:36:16 +04:00
if ( ! ext4_has_metadata_csum ( sb ) )
2012-04-30 02:35:10 +04:00
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 ) ;
}