@ -47,6 +47,12 @@ struct ext2_inode *g_parent_inode;
static int symlinknest ;
# if defined(CONFIG_EXT4_WRITE)
struct ext2_block_group * ext4fs_get_group_descriptor
( const struct ext_filesystem * fs , uint32_t bg_idx )
{
return ( struct ext2_block_group * ) ( fs - > gdtable + ( bg_idx * fs - > gdsize ) ) ;
}
static inline void ext4fs_sb_free_inodes_dec ( struct ext2_sblock * sb )
{
sb - > free_inodes = cpu_to_le32 ( le32_to_cpu ( sb - > free_inodes ) - 1 ) ;
@ -72,6 +78,82 @@ static inline void ext4fs_bg_itable_unused_dec(struct ext2_block_group *bg)
bg - > bg_itable_unused = cpu_to_le16 ( le16_to_cpu ( bg - > bg_itable_unused ) - 1 ) ;
}
uint64_t ext4fs_sb_get_free_blocks ( const struct ext2_sblock * sb )
{
uint64_t free_blocks = le32_to_cpu ( sb - > free_blocks ) ;
free_blocks + = ( uint64_t ) le32_to_cpu ( sb - > free_blocks_high ) < < 32 ;
return free_blocks ;
}
void ext4fs_sb_set_free_blocks ( struct ext2_sblock * sb , uint64_t free_blocks )
{
sb - > free_blocks = cpu_to_le32 ( free_blocks & 0xffffffff ) ;
sb - > free_blocks_high = cpu_to_le16 ( free_blocks > > 32 ) ;
}
uint32_t ext4fs_bg_get_free_blocks ( const struct ext2_block_group * bg ,
const struct ext_filesystem * fs )
{
uint32_t free_blocks = le16_to_cpu ( bg - > free_blocks ) ;
if ( fs - > gdsize = = 64 )
free_blocks + = le16_to_cpu ( bg - > free_blocks_high ) < < 16 ;
return free_blocks ;
}
static inline
uint32_t ext4fs_bg_get_free_inodes ( const struct ext2_block_group * bg ,
const struct ext_filesystem * fs )
{
uint32_t free_inodes = le16_to_cpu ( bg - > free_inodes ) ;
if ( fs - > gdsize = = 64 )
free_inodes + = le16_to_cpu ( bg - > free_inodes_high ) < < 16 ;
return free_inodes ;
}
static inline uint16_t ext4fs_bg_get_flags ( const struct ext2_block_group * bg )
{
return le16_to_cpu ( bg - > bg_flags ) ;
}
static inline void ext4fs_bg_set_flags ( struct ext2_block_group * bg ,
uint16_t flags )
{
bg - > bg_flags = cpu_to_le16 ( flags ) ;
}
/* Block number of the block bitmap */
uint64_t ext4fs_bg_get_block_id ( const struct ext2_block_group * bg ,
const struct ext_filesystem * fs )
{
uint64_t block_nr = le32_to_cpu ( bg - > block_id ) ;
if ( fs - > gdsize = = 64 )
block_nr + = ( uint64_t ) le32_to_cpu ( bg - > block_id_high ) < < 32 ;
return block_nr ;
}
/* Block number of the inode bitmap */
uint64_t ext4fs_bg_get_inode_id ( const struct ext2_block_group * bg ,
const struct ext_filesystem * fs )
{
uint64_t block_nr = le32_to_cpu ( bg - > inode_id ) ;
if ( fs - > gdsize = = 64 )
block_nr + = ( uint64_t ) le32_to_cpu ( bg - > inode_id_high ) < < 32 ;
return block_nr ;
}
# endif
/* Block number of the inode table */
uint64_t ext4fs_bg_get_inode_table_id ( const struct ext2_block_group * bg ,
const struct ext_filesystem * fs )
{
uint64_t block_nr = le32_to_cpu ( bg - > inode_table_id ) ;
if ( fs - > gdsize = = 64 )
block_nr + =
( uint64_t ) le32_to_cpu ( bg - > inode_table_id_high ) < < 32 ;
return block_nr ;
}
# if defined(CONFIG_EXT4_WRITE)
uint32_t ext4fs_div_roundup ( uint32_t size , uint32_t n )
{
uint32_t res = size / n ;