@@ -33,6 +33,29 @@ static u64 ufs_bitmap_search (struct super_block *, struct ufs_cg_private_info *
3333static unsigned char ufs_fragtable_8fpb [], ufs_fragtable_other [];
3434static void ufs_clusteracct (struct super_block * , struct ufs_cg_private_info * , unsigned , int );
3535
36+ static void adjust_free_blocks (struct super_block * sb ,
37+ struct ufs_cylinder_group * ucg ,
38+ struct ufs_cg_private_info * ucpi ,
39+ unsigned fragment , int delta )
40+ {
41+ struct ufs_sb_private_info * uspi = UFS_SB (sb )-> s_uspi ;
42+
43+ if ((UFS_SB (sb )-> s_flags & UFS_CG_MASK ) == UFS_CG_44BSD )
44+ ufs_clusteracct (sb , ucpi , fragment , delta );
45+
46+ fs32_add (sb , & ucg -> cg_cs .cs_nbfree , delta );
47+ uspi -> cs_total .cs_nbfree += delta ;
48+ fs32_add (sb , & UFS_SB (sb )-> fs_cs (ucpi -> c_cgx ).cs_nbfree , delta );
49+
50+ if (uspi -> fs_magic != UFS2_MAGIC ) {
51+ unsigned cylno = ufs_cbtocylno (fragment );
52+
53+ fs16_add (sb , & ubh_cg_blks (ucpi , cylno ,
54+ ufs_cbtorpos (fragment )), delta );
55+ fs32_add (sb , & ubh_cg_blktot (ucpi , cylno ), delta );
56+ }
57+ }
58+
3659/*
3760 * Free 'count' fragments from fragment number 'fragment'
3861 */
@@ -43,15 +66,14 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
4366 struct ufs_cg_private_info * ucpi ;
4467 struct ufs_cylinder_group * ucg ;
4568 unsigned cgno , bit , end_bit , bbase , blkmap , i ;
46- u64 blkno ;
4769
4870 sb = inode -> i_sb ;
4971 uspi = UFS_SB (sb )-> s_uspi ;
5072
5173 UFSD ("ENTER, fragment %llu, count %u\n" ,
5274 (unsigned long long )fragment , count );
5375
54- if (ufs_fragnum (fragment ) + count > uspi -> s_fpg )
76+ if (ufs_fragnum (fragment ) + count > uspi -> s_fpb )
5577 ufs_error (sb , "ufs_free_fragments" , "internal error" );
5678
5779 mutex_lock (& UFS_SB (sb )-> s_lock );
@@ -94,23 +116,11 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
94116 /*
95117 * Trying to reassemble free fragments into block
96118 */
97- blkno = ufs_fragstoblks (bbase );
98- if (ubh_isblockset (UCPI_UBH (ucpi ), ucpi -> c_freeoff , blkno )) {
119+ if (ubh_isblockset (uspi , ucpi , bbase )) {
99120 fs32_sub (sb , & ucg -> cg_cs .cs_nffree , uspi -> s_fpb );
100121 uspi -> cs_total .cs_nffree -= uspi -> s_fpb ;
101122 fs32_sub (sb , & UFS_SB (sb )-> fs_cs (cgno ).cs_nffree , uspi -> s_fpb );
102- if ((UFS_SB (sb )-> s_flags & UFS_CG_MASK ) == UFS_CG_44BSD )
103- ufs_clusteracct (sb , ucpi , blkno , 1 );
104- fs32_add (sb , & ucg -> cg_cs .cs_nbfree , 1 );
105- uspi -> cs_total .cs_nbfree ++ ;
106- fs32_add (sb , & UFS_SB (sb )-> fs_cs (cgno ).cs_nbfree , 1 );
107- if (uspi -> fs_magic != UFS2_MAGIC ) {
108- unsigned cylno = ufs_cbtocylno (bbase );
109-
110- fs16_add (sb , & ubh_cg_blks (ucpi , cylno ,
111- ufs_cbtorpos (bbase )), 1 );
112- fs32_add (sb , & ubh_cg_blktot (ucpi , cylno ), 1 );
113- }
123+ adjust_free_blocks (sb , ucg , ucpi , bbase , 1 );
114124 }
115125
116126 ubh_mark_buffer_dirty (USPI_UBH (uspi ));
@@ -139,7 +149,6 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
139149 struct ufs_cg_private_info * ucpi ;
140150 struct ufs_cylinder_group * ucg ;
141151 unsigned overflow , cgno , bit , end_bit , i ;
142- u64 blkno ;
143152
144153 sb = inode -> i_sb ;
145154 uspi = UFS_SB (sb )-> s_uspi ;
@@ -181,26 +190,12 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
181190 }
182191
183192 for (i = bit ; i < end_bit ; i += uspi -> s_fpb ) {
184- blkno = ufs_fragstoblks (i );
185- if (ubh_isblockset (UCPI_UBH (ucpi ), ucpi -> c_freeoff , blkno )) {
193+ if (ubh_isblockset (uspi , ucpi , i )) {
186194 ufs_error (sb , "ufs_free_blocks" , "freeing free fragment" );
187195 }
188- ubh_setblock (UCPI_UBH ( ucpi ) , ucpi -> c_freeoff , blkno );
196+ ubh_setblock (uspi , ucpi , i );
189197 inode_sub_bytes (inode , uspi -> s_fpb << uspi -> s_fshift );
190- if ((UFS_SB (sb )-> s_flags & UFS_CG_MASK ) == UFS_CG_44BSD )
191- ufs_clusteracct (sb , ucpi , blkno , 1 );
192-
193- fs32_add (sb , & ucg -> cg_cs .cs_nbfree , 1 );
194- uspi -> cs_total .cs_nbfree ++ ;
195- fs32_add (sb , & UFS_SB (sb )-> fs_cs (cgno ).cs_nbfree , 1 );
196-
197- if (uspi -> fs_magic != UFS2_MAGIC ) {
198- unsigned cylno = ufs_cbtocylno (i );
199-
200- fs16_add (sb , & ubh_cg_blks (ucpi , cylno ,
201- ufs_cbtorpos (i )), 1 );
202- fs32_add (sb , & ubh_cg_blktot (ucpi , cylno ), 1 );
203- }
198+ adjust_free_blocks (sb , ucg , ucpi , i , 1 );
204199 }
205200
206201 ubh_mark_buffer_dirty (USPI_UBH (uspi ));
@@ -234,13 +229,13 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
234229 * situated at the end of file.
235230 *
236231 * We can come here from ufs_writepage or ufs_prepare_write,
237- * locked_page is argument of these functions, so we already lock it.
232+ * locked_folio is argument of these functions, so we already lock it.
238233 */
239234static void ufs_change_blocknr (struct inode * inode , sector_t beg ,
240235 unsigned int count , sector_t oldb ,
241- sector_t newb , struct page * locked_page )
236+ sector_t newb , struct folio * locked_folio )
242237{
243- struct folio * folio , * locked_folio = page_folio ( locked_page ) ;
238+ struct folio * folio ;
244239 const unsigned blks_per_page =
245240 1 << (PAGE_SHIFT - inode -> i_blkbits );
246241 const unsigned mask = blks_per_page - 1 ;
@@ -337,7 +332,7 @@ static void ufs_clear_frags(struct inode *inode, sector_t beg, unsigned int n,
337332
338333u64 ufs_new_fragments (struct inode * inode , void * p , u64 fragment ,
339334 u64 goal , unsigned count , int * err ,
340- struct page * locked_page )
335+ struct folio * locked_folio )
341336{
342337 struct super_block * sb ;
343338 struct ufs_sb_private_info * uspi ;
@@ -417,7 +412,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
417412 result = ufs_alloc_fragments (inode , cgno , goal , count , err );
418413 if (result ) {
419414 ufs_clear_frags (inode , result + oldcount ,
420- newcount - oldcount , locked_page != NULL );
415+ newcount - oldcount , locked_folio != NULL );
421416 * err = 0 ;
422417 write_seqlock (& UFS_I (inode )-> meta_lock );
423418 ufs_cpu_to_data_ptr (sb , p , result );
@@ -441,7 +436,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
441436 fragment + count );
442437 read_sequnlock_excl (& UFS_I (inode )-> meta_lock );
443438 ufs_clear_frags (inode , result + oldcount , newcount - oldcount ,
444- locked_page != NULL );
439+ locked_folio != NULL );
445440 mutex_unlock (& UFS_SB (sb )-> s_lock );
446441 UFSD ("EXIT, result %llu\n" , (unsigned long long )result );
447442 return result ;
@@ -462,11 +457,11 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
462457 result = ufs_alloc_fragments (inode , cgno , goal , request , err );
463458 if (result ) {
464459 ufs_clear_frags (inode , result + oldcount , newcount - oldcount ,
465- locked_page != NULL );
460+ locked_folio != NULL );
466461 mutex_unlock (& UFS_SB (sb )-> s_lock );
467462 ufs_change_blocknr (inode , fragment - oldcount , oldcount ,
468463 uspi -> s_sbbase + tmp ,
469- uspi -> s_sbbase + result , locked_page );
464+ uspi -> s_sbbase + result , locked_folio );
470465 * err = 0 ;
471466 write_seqlock (& UFS_I (inode )-> meta_lock );
472467 ufs_cpu_to_data_ptr (sb , p , result );
@@ -698,7 +693,7 @@ static u64 ufs_alloccg_block(struct inode *inode,
698693 struct super_block * sb ;
699694 struct ufs_sb_private_info * uspi ;
700695 struct ufs_cylinder_group * ucg ;
701- u64 result , blkno ;
696+ u64 result ;
702697
703698 UFSD ("ENTER, goal %llu\n" , (unsigned long long )goal );
704699
@@ -716,7 +711,7 @@ static u64 ufs_alloccg_block(struct inode *inode,
716711 /*
717712 * If the requested block is available, use it.
718713 */
719- if (ubh_isblockset (UCPI_UBH ( ucpi ) , ucpi -> c_freeoff , ufs_fragstoblks ( goal ) )) {
714+ if (ubh_isblockset (uspi , ucpi , goal )) {
720715 result = goal ;
721716 goto gotit ;
722717 }
@@ -729,22 +724,8 @@ static u64 ufs_alloccg_block(struct inode *inode,
729724gotit :
730725 if (!try_add_frags (inode , uspi -> s_fpb ))
731726 return 0 ;
732- blkno = ufs_fragstoblks (result );
733- ubh_clrblock (UCPI_UBH (ucpi ), ucpi -> c_freeoff , blkno );
734- if ((UFS_SB (sb )-> s_flags & UFS_CG_MASK ) == UFS_CG_44BSD )
735- ufs_clusteracct (sb , ucpi , blkno , -1 );
736-
737- fs32_sub (sb , & ucg -> cg_cs .cs_nbfree , 1 );
738- uspi -> cs_total .cs_nbfree -- ;
739- fs32_sub (sb , & UFS_SB (sb )-> fs_cs (ucpi -> c_cgx ).cs_nbfree , 1 );
740-
741- if (uspi -> fs_magic != UFS2_MAGIC ) {
742- unsigned cylno = ufs_cbtocylno ((unsigned )result );
743-
744- fs16_sub (sb , & ubh_cg_blks (ucpi , cylno ,
745- ufs_cbtorpos ((unsigned )result )), 1 );
746- fs32_sub (sb , & ubh_cg_blktot (ucpi , cylno ), 1 );
747- }
727+ ubh_clrblock (uspi , ucpi , result );
728+ adjust_free_blocks (sb , ucg , ucpi , result , -1 );
748729
749730 UFSD ("EXIT, result %llu\n" , (unsigned long long )result );
750731
@@ -863,12 +844,12 @@ static u64 ufs_bitmap_search(struct super_block *sb,
863844}
864845
865846static void ufs_clusteracct (struct super_block * sb ,
866- struct ufs_cg_private_info * ucpi , unsigned blkno , int cnt )
847+ struct ufs_cg_private_info * ucpi , unsigned frag , int cnt )
867848{
868- struct ufs_sb_private_info * uspi ;
849+ struct ufs_sb_private_info * uspi = UFS_SB ( sb ) -> s_uspi ;
869850 int i , start , end , forw , back ;
851+ unsigned blkno = ufs_fragstoblks (frag );
870852
871- uspi = UFS_SB (sb )-> s_uspi ;
872853 if (uspi -> s_contigsumsize <= 0 )
873854 return ;
874855
0 commit comments