@@ -1183,6 +1183,49 @@ static inline void ext4_quota_off_umount(struct super_block *sb)
11831183}
11841184#endif
11851185
1186+ static int ext4_percpu_param_init (struct ext4_sb_info * sbi )
1187+ {
1188+ ext4_fsblk_t block ;
1189+ int err ;
1190+
1191+ block = ext4_count_free_clusters (sbi -> s_sb );
1192+ ext4_free_blocks_count_set (sbi -> s_es , EXT4_C2B (sbi , block ));
1193+ err = percpu_counter_init (& sbi -> s_freeclusters_counter , block ,
1194+ GFP_KERNEL );
1195+ if (!err ) {
1196+ unsigned long freei = ext4_count_free_inodes (sbi -> s_sb );
1197+ sbi -> s_es -> s_free_inodes_count = cpu_to_le32 (freei );
1198+ err = percpu_counter_init (& sbi -> s_freeinodes_counter , freei ,
1199+ GFP_KERNEL );
1200+ }
1201+ if (!err )
1202+ err = percpu_counter_init (& sbi -> s_dirs_counter ,
1203+ ext4_count_dirs (sbi -> s_sb ), GFP_KERNEL );
1204+ if (!err )
1205+ err = percpu_counter_init (& sbi -> s_dirtyclusters_counter , 0 ,
1206+ GFP_KERNEL );
1207+ if (!err )
1208+ err = percpu_counter_init (& sbi -> s_sra_exceeded_retry_limit , 0 ,
1209+ GFP_KERNEL );
1210+ if (!err )
1211+ err = percpu_init_rwsem (& sbi -> s_writepages_rwsem );
1212+
1213+ if (err )
1214+ ext4_msg (sbi -> s_sb , KERN_ERR , "insufficient memory" );
1215+
1216+ return err ;
1217+ }
1218+
1219+ static void ext4_percpu_param_destroy (struct ext4_sb_info * sbi )
1220+ {
1221+ percpu_counter_destroy (& sbi -> s_freeclusters_counter );
1222+ percpu_counter_destroy (& sbi -> s_freeinodes_counter );
1223+ percpu_counter_destroy (& sbi -> s_dirs_counter );
1224+ percpu_counter_destroy (& sbi -> s_dirtyclusters_counter );
1225+ percpu_counter_destroy (& sbi -> s_sra_exceeded_retry_limit );
1226+ percpu_free_rwsem (& sbi -> s_writepages_rwsem );
1227+ }
1228+
11861229static void ext4_put_super (struct super_block * sb )
11871230{
11881231 struct ext4_sb_info * sbi = EXT4_SB (sb );
@@ -1250,12 +1293,7 @@ static void ext4_put_super(struct super_block *sb)
12501293 kvfree (flex_groups );
12511294 }
12521295 rcu_read_unlock ();
1253- percpu_counter_destroy (& sbi -> s_freeclusters_counter );
1254- percpu_counter_destroy (& sbi -> s_freeinodes_counter );
1255- percpu_counter_destroy (& sbi -> s_dirs_counter );
1256- percpu_counter_destroy (& sbi -> s_dirtyclusters_counter );
1257- percpu_counter_destroy (& sbi -> s_sra_exceeded_retry_limit );
1258- percpu_free_rwsem (& sbi -> s_writepages_rwsem );
1296+ ext4_percpu_param_destroy (sbi );
12591297#ifdef CONFIG_QUOTA
12601298 for (i = 0 ; i < EXT4_MAXQUOTAS ; i ++ )
12611299 kfree (get_qf_name (sb , sbi , i ));
@@ -5058,7 +5096,6 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
50585096 struct ext4_super_block * es = NULL ;
50595097 struct ext4_sb_info * sbi = EXT4_SB (sb );
50605098 struct flex_groups * * flex_groups ;
5061- ext4_fsblk_t block ;
50625099 ext4_fsblk_t logical_sb_block ;
50635100 struct inode * root ;
50645101 int ret = - ENOMEM ;
@@ -5450,33 +5487,8 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
54505487 sbi -> s_journal -> j_commit_callback =
54515488 ext4_journal_commit_callback ;
54525489
5453- block = ext4_count_free_clusters (sb );
5454- ext4_free_blocks_count_set (sbi -> s_es ,
5455- EXT4_C2B (sbi , block ));
5456- err = percpu_counter_init (& sbi -> s_freeclusters_counter , block ,
5457- GFP_KERNEL );
5458- if (!err ) {
5459- unsigned long freei = ext4_count_free_inodes (sb );
5460- sbi -> s_es -> s_free_inodes_count = cpu_to_le32 (freei );
5461- err = percpu_counter_init (& sbi -> s_freeinodes_counter , freei ,
5462- GFP_KERNEL );
5463- }
5464- if (!err )
5465- err = percpu_counter_init (& sbi -> s_dirs_counter ,
5466- ext4_count_dirs (sb ), GFP_KERNEL );
5467- if (!err )
5468- err = percpu_counter_init (& sbi -> s_dirtyclusters_counter , 0 ,
5469- GFP_KERNEL );
5470- if (!err )
5471- err = percpu_counter_init (& sbi -> s_sra_exceeded_retry_limit , 0 ,
5472- GFP_KERNEL );
5473- if (!err )
5474- err = percpu_init_rwsem (& sbi -> s_writepages_rwsem );
5475-
5476- if (err ) {
5477- ext4_msg (sb , KERN_ERR , "insufficient memory" );
5490+ if (ext4_percpu_param_init (sbi ))
54785491 goto failed_mount6 ;
5479- }
54805492
54815493 if (ext4_has_feature_flex_bg (sb ))
54825494 if (!ext4_fill_flex_info (sb )) {
@@ -5566,12 +5578,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
55665578 kvfree (flex_groups );
55675579 }
55685580 rcu_read_unlock ();
5569- percpu_counter_destroy (& sbi -> s_freeclusters_counter );
5570- percpu_counter_destroy (& sbi -> s_freeinodes_counter );
5571- percpu_counter_destroy (& sbi -> s_dirs_counter );
5572- percpu_counter_destroy (& sbi -> s_dirtyclusters_counter );
5573- percpu_counter_destroy (& sbi -> s_sra_exceeded_retry_limit );
5574- percpu_free_rwsem (& sbi -> s_writepages_rwsem );
5581+ ext4_percpu_param_destroy (sbi );
55755582failed_mount5 :
55765583 ext4_ext_release (sb );
55775584 ext4_release_system_zone (sb );
0 commit comments