@@ -4053,46 +4053,27 @@ static noinline_for_stack int
4053
4053
ext4_mb_mark_diskspace_used (struct ext4_allocation_context * ac ,
4054
4054
handle_t * handle , unsigned int reserv_clstrs )
4055
4055
{
4056
- struct buffer_head * bitmap_bh = NULL ;
4057
4056
struct ext4_group_desc * gdp ;
4058
- struct buffer_head * gdp_bh ;
4059
4057
struct ext4_sb_info * sbi ;
4060
4058
struct super_block * sb ;
4061
4059
ext4_fsblk_t block ;
4062
4060
int err , len ;
4061
+ int flags = 0 ;
4062
+ ext4_grpblk_t changed ;
4063
4063
4064
4064
BUG_ON (ac -> ac_status != AC_STATUS_FOUND );
4065
4065
BUG_ON (ac -> ac_b_ex .fe_len <= 0 );
4066
4066
4067
4067
sb = ac -> ac_sb ;
4068
4068
sbi = EXT4_SB (sb );
4069
4069
4070
- bitmap_bh = ext4_read_block_bitmap (sb , ac -> ac_b_ex .fe_group );
4071
- if (IS_ERR (bitmap_bh )) {
4072
- return PTR_ERR (bitmap_bh );
4073
- }
4074
-
4075
- BUFFER_TRACE (bitmap_bh , "getting write access" );
4076
- err = ext4_journal_get_write_access (handle , sb , bitmap_bh ,
4077
- EXT4_JTR_NONE );
4078
- if (err )
4079
- goto out_err ;
4080
-
4081
- err = - EIO ;
4082
- gdp = ext4_get_group_desc (sb , ac -> ac_b_ex .fe_group , & gdp_bh );
4070
+ gdp = ext4_get_group_desc (sb , ac -> ac_b_ex .fe_group , NULL );
4083
4071
if (!gdp )
4084
- goto out_err ;
4085
-
4072
+ return - EIO ;
4086
4073
ext4_debug ("using block group %u(%d)\n" , ac -> ac_b_ex .fe_group ,
4087
4074
ext4_free_group_clusters (sb , gdp ));
4088
4075
4089
- BUFFER_TRACE (gdp_bh , "get_write_access" );
4090
- err = ext4_journal_get_write_access (handle , sb , gdp_bh , EXT4_JTR_NONE );
4091
- if (err )
4092
- goto out_err ;
4093
-
4094
4076
block = ext4_grp_offs_to_block (sb , & ac -> ac_b_ex );
4095
-
4096
4077
len = EXT4_C2B (sbi , ac -> ac_b_ex .fe_len );
4097
4078
if (!ext4_inode_block_valid (ac -> ac_inode , block , len )) {
4098
4079
ext4_error (sb , "Allocating blocks %llu-%llu which overlap "
@@ -4101,41 +4082,29 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
4101
4082
* Fix the bitmap and return EFSCORRUPTED
4102
4083
* We leak some of the blocks here.
4103
4084
*/
4104
- ext4_lock_group ( sb , ac -> ac_b_ex . fe_group );
4105
- mb_set_bits ( bitmap_bh -> b_data , ac -> ac_b_ex .fe_start ,
4106
- ac -> ac_b_ex .fe_len );
4107
- ext4_unlock_group ( sb , ac -> ac_b_ex .fe_group );
4108
- err = ext4_handle_dirty_metadata ( handle , NULL , bitmap_bh );
4085
+ err = ext4_mb_mark_context ( handle , sb , true,
4086
+ ac -> ac_b_ex .fe_group ,
4087
+ ac -> ac_b_ex .fe_start ,
4088
+ ac -> ac_b_ex .fe_len ,
4089
+ 0 , NULL );
4109
4090
if (!err )
4110
4091
err = - EFSCORRUPTED ;
4111
- goto out_err ;
4092
+ return err ;
4112
4093
}
4113
4094
4114
- ext4_lock_group (sb , ac -> ac_b_ex .fe_group );
4115
4095
#ifdef AGGRESSIVE_CHECK
4116
- {
4117
- int i ;
4118
- for (i = 0 ; i < ac -> ac_b_ex .fe_len ; i ++ ) {
4119
- BUG_ON (mb_test_bit (ac -> ac_b_ex .fe_start + i ,
4120
- bitmap_bh -> b_data ));
4121
- }
4122
- }
4096
+ flags |= EXT4_MB_BITMAP_MARKED_CHECK ;
4123
4097
#endif
4124
- mb_set_bits (bitmap_bh -> b_data , ac -> ac_b_ex .fe_start ,
4125
- ac -> ac_b_ex .fe_len );
4126
- if (ext4_has_group_desc_csum (sb ) &&
4127
- (gdp -> bg_flags & cpu_to_le16 (EXT4_BG_BLOCK_UNINIT ))) {
4128
- gdp -> bg_flags &= cpu_to_le16 (~EXT4_BG_BLOCK_UNINIT );
4129
- ext4_free_group_clusters_set (sb , gdp ,
4130
- ext4_free_clusters_after_init (sb ,
4131
- ac -> ac_b_ex .fe_group , gdp ));
4132
- }
4133
- len = ext4_free_group_clusters (sb , gdp ) - ac -> ac_b_ex .fe_len ;
4134
- ext4_free_group_clusters_set (sb , gdp , len );
4135
- ext4_block_bitmap_csum_set (sb , gdp , bitmap_bh );
4136
- ext4_group_desc_csum_set (sb , ac -> ac_b_ex .fe_group , gdp );
4098
+ err = ext4_mb_mark_context (handle , sb , true, ac -> ac_b_ex .fe_group ,
4099
+ ac -> ac_b_ex .fe_start , ac -> ac_b_ex .fe_len ,
4100
+ flags , & changed );
4101
+
4102
+ if (err && changed == 0 )
4103
+ return err ;
4137
4104
4138
- ext4_unlock_group (sb , ac -> ac_b_ex .fe_group );
4105
+ #ifdef AGGRESSIVE_CHECK
4106
+ BUG_ON (changed != ac -> ac_b_ex .fe_len );
4107
+ #endif
4139
4108
percpu_counter_sub (& sbi -> s_freeclusters_counter , ac -> ac_b_ex .fe_len );
4140
4109
/*
4141
4110
* Now reduce the dirty block count also. Should not go negative
@@ -4145,21 +4114,6 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
4145
4114
percpu_counter_sub (& sbi -> s_dirtyclusters_counter ,
4146
4115
reserv_clstrs );
4147
4116
4148
- if (sbi -> s_log_groups_per_flex ) {
4149
- ext4_group_t flex_group = ext4_flex_group (sbi ,
4150
- ac -> ac_b_ex .fe_group );
4151
- atomic64_sub (ac -> ac_b_ex .fe_len ,
4152
- & sbi_array_rcu_deref (sbi , s_flex_groups ,
4153
- flex_group )-> free_clusters );
4154
- }
4155
-
4156
- err = ext4_handle_dirty_metadata (handle , NULL , bitmap_bh );
4157
- if (err )
4158
- goto out_err ;
4159
- err = ext4_handle_dirty_metadata (handle , NULL , gdp_bh );
4160
-
4161
- out_err :
4162
- brelse (bitmap_bh );
4163
4117
return err ;
4164
4118
}
4165
4119
0 commit comments