@@ -33,6 +33,29 @@ static u64 ufs_bitmap_search (struct super_block *, struct ufs_cg_private_info *
33
33
static unsigned char ufs_fragtable_8fpb [], ufs_fragtable_other [];
34
34
static void ufs_clusteracct (struct super_block * , struct ufs_cg_private_info * , unsigned , int );
35
35
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
+
36
59
/*
37
60
* Free 'count' fragments from fragment number 'fragment'
38
61
*/
@@ -43,15 +66,14 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
43
66
struct ufs_cg_private_info * ucpi ;
44
67
struct ufs_cylinder_group * ucg ;
45
68
unsigned cgno , bit , end_bit , bbase , blkmap , i ;
46
- u64 blkno ;
47
69
48
70
sb = inode -> i_sb ;
49
71
uspi = UFS_SB (sb )-> s_uspi ;
50
72
51
73
UFSD ("ENTER, fragment %llu, count %u\n" ,
52
74
(unsigned long long )fragment , count );
53
75
54
- if (ufs_fragnum (fragment ) + count > uspi -> s_fpg )
76
+ if (ufs_fragnum (fragment ) + count > uspi -> s_fpb )
55
77
ufs_error (sb , "ufs_free_fragments" , "internal error" );
56
78
57
79
mutex_lock (& UFS_SB (sb )-> s_lock );
@@ -94,23 +116,11 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
94
116
/*
95
117
* Trying to reassemble free fragments into block
96
118
*/
97
- blkno = ufs_fragstoblks (bbase );
98
- if (ubh_isblockset (UCPI_UBH (ucpi ), ucpi -> c_freeoff , blkno )) {
119
+ if (ubh_isblockset (uspi , ucpi , bbase )) {
99
120
fs32_sub (sb , & ucg -> cg_cs .cs_nffree , uspi -> s_fpb );
100
121
uspi -> cs_total .cs_nffree -= uspi -> s_fpb ;
101
122
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 );
114
124
}
115
125
116
126
ubh_mark_buffer_dirty (USPI_UBH (uspi ));
@@ -139,7 +149,6 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
139
149
struct ufs_cg_private_info * ucpi ;
140
150
struct ufs_cylinder_group * ucg ;
141
151
unsigned overflow , cgno , bit , end_bit , i ;
142
- u64 blkno ;
143
152
144
153
sb = inode -> i_sb ;
145
154
uspi = UFS_SB (sb )-> s_uspi ;
@@ -181,26 +190,12 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
181
190
}
182
191
183
192
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 )) {
186
194
ufs_error (sb , "ufs_free_blocks" , "freeing free fragment" );
187
195
}
188
- ubh_setblock (UCPI_UBH ( ucpi ) , ucpi -> c_freeoff , blkno );
196
+ ubh_setblock (uspi , ucpi , i );
189
197
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 );
204
199
}
205
200
206
201
ubh_mark_buffer_dirty (USPI_UBH (uspi ));
@@ -234,13 +229,13 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
234
229
* situated at the end of file.
235
230
*
236
231
* 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.
238
233
*/
239
234
static void ufs_change_blocknr (struct inode * inode , sector_t beg ,
240
235
unsigned int count , sector_t oldb ,
241
- sector_t newb , struct page * locked_page )
236
+ sector_t newb , struct folio * locked_folio )
242
237
{
243
- struct folio * folio , * locked_folio = page_folio ( locked_page ) ;
238
+ struct folio * folio ;
244
239
const unsigned blks_per_page =
245
240
1 << (PAGE_SHIFT - inode -> i_blkbits );
246
241
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,
337
332
338
333
u64 ufs_new_fragments (struct inode * inode , void * p , u64 fragment ,
339
334
u64 goal , unsigned count , int * err ,
340
- struct page * locked_page )
335
+ struct folio * locked_folio )
341
336
{
342
337
struct super_block * sb ;
343
338
struct ufs_sb_private_info * uspi ;
@@ -417,7 +412,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
417
412
result = ufs_alloc_fragments (inode , cgno , goal , count , err );
418
413
if (result ) {
419
414
ufs_clear_frags (inode , result + oldcount ,
420
- newcount - oldcount , locked_page != NULL );
415
+ newcount - oldcount , locked_folio != NULL );
421
416
* err = 0 ;
422
417
write_seqlock (& UFS_I (inode )-> meta_lock );
423
418
ufs_cpu_to_data_ptr (sb , p , result );
@@ -441,7 +436,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
441
436
fragment + count );
442
437
read_sequnlock_excl (& UFS_I (inode )-> meta_lock );
443
438
ufs_clear_frags (inode , result + oldcount , newcount - oldcount ,
444
- locked_page != NULL );
439
+ locked_folio != NULL );
445
440
mutex_unlock (& UFS_SB (sb )-> s_lock );
446
441
UFSD ("EXIT, result %llu\n" , (unsigned long long )result );
447
442
return result ;
@@ -462,11 +457,11 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
462
457
result = ufs_alloc_fragments (inode , cgno , goal , request , err );
463
458
if (result ) {
464
459
ufs_clear_frags (inode , result + oldcount , newcount - oldcount ,
465
- locked_page != NULL );
460
+ locked_folio != NULL );
466
461
mutex_unlock (& UFS_SB (sb )-> s_lock );
467
462
ufs_change_blocknr (inode , fragment - oldcount , oldcount ,
468
463
uspi -> s_sbbase + tmp ,
469
- uspi -> s_sbbase + result , locked_page );
464
+ uspi -> s_sbbase + result , locked_folio );
470
465
* err = 0 ;
471
466
write_seqlock (& UFS_I (inode )-> meta_lock );
472
467
ufs_cpu_to_data_ptr (sb , p , result );
@@ -698,7 +693,7 @@ static u64 ufs_alloccg_block(struct inode *inode,
698
693
struct super_block * sb ;
699
694
struct ufs_sb_private_info * uspi ;
700
695
struct ufs_cylinder_group * ucg ;
701
- u64 result , blkno ;
696
+ u64 result ;
702
697
703
698
UFSD ("ENTER, goal %llu\n" , (unsigned long long )goal );
704
699
@@ -716,7 +711,7 @@ static u64 ufs_alloccg_block(struct inode *inode,
716
711
/*
717
712
* If the requested block is available, use it.
718
713
*/
719
- if (ubh_isblockset (UCPI_UBH ( ucpi ) , ucpi -> c_freeoff , ufs_fragstoblks ( goal ) )) {
714
+ if (ubh_isblockset (uspi , ucpi , goal )) {
720
715
result = goal ;
721
716
goto gotit ;
722
717
}
@@ -729,22 +724,8 @@ static u64 ufs_alloccg_block(struct inode *inode,
729
724
gotit :
730
725
if (!try_add_frags (inode , uspi -> s_fpb ))
731
726
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 );
748
729
749
730
UFSD ("EXIT, result %llu\n" , (unsigned long long )result );
750
731
@@ -863,12 +844,12 @@ static u64 ufs_bitmap_search(struct super_block *sb,
863
844
}
864
845
865
846
static 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 )
867
848
{
868
- struct ufs_sb_private_info * uspi ;
849
+ struct ufs_sb_private_info * uspi = UFS_SB ( sb ) -> s_uspi ;
869
850
int i , start , end , forw , back ;
851
+ unsigned blkno = ufs_fragstoblks (frag );
870
852
871
- uspi = UFS_SB (sb )-> s_uspi ;
872
853
if (uspi -> s_contigsumsize <= 0 )
873
854
return ;
874
855
0 commit comments