@@ -189,7 +189,6 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
189189 struct ext4_super_block * es ;
190190 struct ext4_sb_info * sbi ;
191191 int fatal = 0 , err , count , cleared ;
192- ext4_group_t flex_group ;
193192
194193 if (atomic_read (& inode -> i_count ) > 1 ) {
195194 printk (KERN_ERR "ext4_free_inode: inode has count=%d\n" ,
@@ -277,10 +276,10 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
277276 percpu_counter_dec (& sbi -> s_dirs_counter );
278277
279278 if (sbi -> s_log_groups_per_flex ) {
280- flex_group = ext4_flex_group ( sbi , block_group ) ;
281- spin_lock ( sb_bgl_lock ( sbi , flex_group ));
282- sbi -> s_flex_groups [ flex_group ]. free_inodes ++ ;
283- spin_unlock ( sb_bgl_lock ( sbi , flex_group ) );
279+ ext4_group_t f ;
280+
281+ f = ext4_flex_group ( sbi , block_group ) ;
282+ atomic_inc ( & sbi -> s_flex_groups [ f ]. free_inodes );
284283 }
285284 }
286285 BUFFER_TRACE (bh2 , "call ext4_handle_dirty_metadata" );
@@ -360,9 +359,9 @@ static int find_group_flex(struct super_block *sb, struct inode *parent,
360359 sbi -> s_log_groups_per_flex ;
361360
362361find_close_to_parent :
363- flexbg_free_blocks = flex_group [best_flex ].free_blocks ;
362+ flexbg_free_blocks = atomic_read ( & flex_group [best_flex ].free_blocks ) ;
364363 flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex ;
365- if (flex_group [best_flex ].free_inodes &&
364+ if (atomic_read ( & flex_group [best_flex ].free_inodes ) &&
366365 flex_freeb_ratio > free_block_ratio )
367366 goto found_flexbg ;
368367
@@ -375,24 +374,24 @@ static int find_group_flex(struct super_block *sb, struct inode *parent,
375374 if (i == parent_fbg_group || i == parent_fbg_group - 1 )
376375 continue ;
377376
378- flexbg_free_blocks = flex_group [i ].free_blocks ;
377+ flexbg_free_blocks = atomic_read ( & flex_group [i ].free_blocks ) ;
379378 flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex ;
380379
381380 if (flex_freeb_ratio > free_block_ratio &&
382- flex_group [i ].free_inodes ) {
381+ ( atomic_read ( & flex_group [i ].free_inodes )) ) {
383382 best_flex = i ;
384383 goto found_flexbg ;
385384 }
386385
387- if (flex_group [best_flex ].free_inodes == 0 ||
388- (flex_group [i ].free_blocks >
389- flex_group [best_flex ].free_blocks &&
390- flex_group [i ].free_inodes ))
386+ if (( atomic_read ( & flex_group [best_flex ].free_inodes ) == 0 ) ||
387+ (( atomic_read ( & flex_group [i ].free_blocks ) >
388+ atomic_read ( & flex_group [best_flex ].free_blocks )) &&
389+ atomic_read ( & flex_group [i ].free_inodes ) ))
391390 best_flex = i ;
392391 }
393392
394- if (!flex_group [best_flex ].free_inodes ||
395- !flex_group [best_flex ].free_blocks )
393+ if (!atomic_read ( & flex_group [best_flex ].free_inodes ) ||
394+ !atomic_read ( & flex_group [best_flex ].free_blocks ) )
396395 return -1 ;
397396
398397found_flexbg :
@@ -960,9 +959,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)
960959
961960 if (sbi -> s_log_groups_per_flex ) {
962961 flex_group = ext4_flex_group (sbi , group );
963- spin_lock (sb_bgl_lock (sbi , flex_group ));
964- sbi -> s_flex_groups [flex_group ].free_inodes -- ;
965- spin_unlock (sb_bgl_lock (sbi , flex_group ));
962+ atomic_dec (& sbi -> s_flex_groups [flex_group ].free_inodes );
966963 }
967964
968965 inode -> i_uid = current_fsuid ();
0 commit comments