1111#include <linux/fs_context.h>
1212#include <linux/sched/mm.h>
1313#include <linux/statfs.h>
14- #include <linux/buffer_head.h>
1514#include <linux/kthread.h>
1615#include <linux/parser.h>
1716#include <linux/mount.h>
@@ -3323,24 +3322,42 @@ loff_t max_file_blocks(struct inode *inode)
33233322 return result ;
33243323}
33253324
3326- static int __f2fs_commit_super (struct buffer_head * bh ,
3327- struct f2fs_super_block * super )
3325+ static int __f2fs_commit_super (struct f2fs_sb_info * sbi , struct folio * folio ,
3326+ pgoff_t index , bool update )
33283327{
3329- lock_buffer (bh );
3330- if (super )
3331- memcpy (bh -> b_data + F2FS_SUPER_OFFSET , super , sizeof (* super ));
3332- set_buffer_dirty (bh );
3333- unlock_buffer (bh );
3334-
3328+ struct bio * bio ;
33353329 /* it's rare case, we can do fua all the time */
3336- return __sync_dirty_buffer (bh , REQ_SYNC | REQ_PREFLUSH | REQ_FUA );
3330+ blk_opf_t opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH | REQ_FUA ;
3331+ int ret ;
3332+
3333+ folio_lock (folio );
3334+ folio_wait_writeback (folio );
3335+ if (update )
3336+ memcpy (F2FS_SUPER_BLOCK (folio , index ), F2FS_RAW_SUPER (sbi ),
3337+ sizeof (struct f2fs_super_block ));
3338+ folio_mark_dirty (folio );
3339+ folio_clear_dirty_for_io (folio );
3340+ folio_start_writeback (folio );
3341+ folio_unlock (folio );
3342+
3343+ bio = bio_alloc (sbi -> sb -> s_bdev , 1 , opf , GFP_NOFS );
3344+
3345+ /* it doesn't need to set crypto context for superblock update */
3346+ bio -> bi_iter .bi_sector = SECTOR_FROM_BLOCK (folio_index (folio ));
3347+
3348+ if (!bio_add_folio (bio , folio , folio_size (folio ), 0 ))
3349+ f2fs_bug_on (sbi , 1 );
3350+
3351+ ret = submit_bio_wait (bio );
3352+ folio_end_writeback (folio );
3353+
3354+ return ret ;
33373355}
33383356
33393357static inline bool sanity_check_area_boundary (struct f2fs_sb_info * sbi ,
3340- struct buffer_head * bh )
3358+ struct folio * folio , pgoff_t index )
33413359{
3342- struct f2fs_super_block * raw_super = (struct f2fs_super_block * )
3343- (bh -> b_data + F2FS_SUPER_OFFSET );
3360+ struct f2fs_super_block * raw_super = F2FS_SUPER_BLOCK (folio , index );
33443361 struct super_block * sb = sbi -> sb ;
33453362 u32 segment0_blkaddr = le32_to_cpu (raw_super -> segment0_blkaddr );
33463363 u32 cp_blkaddr = le32_to_cpu (raw_super -> cp_blkaddr );
@@ -3415,7 +3432,7 @@ static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
34153432 set_sbi_flag (sbi , SBI_NEED_SB_WRITE );
34163433 res = "internally" ;
34173434 } else {
3418- err = __f2fs_commit_super (bh , NULL );
3435+ err = __f2fs_commit_super (sbi , folio , index , false );
34193436 res = err ? "failed" : "done" ;
34203437 }
34213438 f2fs_info (sbi , "Fix alignment : %s, start(%u) end(%llu) block(%u)" ,
@@ -3428,12 +3445,11 @@ static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
34283445}
34293446
34303447static int sanity_check_raw_super (struct f2fs_sb_info * sbi ,
3431- struct buffer_head * bh )
3448+ struct folio * folio , pgoff_t index )
34323449{
34333450 block_t segment_count , segs_per_sec , secs_per_zone , segment_count_main ;
34343451 block_t total_sections , blocks_per_seg ;
3435- struct f2fs_super_block * raw_super = (struct f2fs_super_block * )
3436- (bh -> b_data + F2FS_SUPER_OFFSET );
3452+ struct f2fs_super_block * raw_super = F2FS_SUPER_BLOCK (folio , index );
34373453 size_t crc_offset = 0 ;
34383454 __u32 crc = 0 ;
34393455
@@ -3591,7 +3607,7 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
35913607 }
35923608
35933609 /* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */
3594- if (sanity_check_area_boundary (sbi , bh ))
3610+ if (sanity_check_area_boundary (sbi , folio , index ))
35953611 return - EFSCORRUPTED ;
35963612
35973613 return 0 ;
@@ -3938,7 +3954,7 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi,
39383954{
39393955 struct super_block * sb = sbi -> sb ;
39403956 int block ;
3941- struct buffer_head * bh ;
3957+ struct folio * folio ;
39423958 struct f2fs_super_block * super ;
39433959 int err = 0 ;
39443960
@@ -3947,32 +3963,32 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi,
39473963 return - ENOMEM ;
39483964
39493965 for (block = 0 ; block < 2 ; block ++ ) {
3950- bh = sb_bread (sb , block );
3951- if (! bh ) {
3966+ folio = read_mapping_folio (sb -> s_bdev -> bd_mapping , block , NULL );
3967+ if (IS_ERR ( folio ) ) {
39523968 f2fs_err (sbi , "Unable to read %dth superblock" ,
39533969 block + 1 );
3954- err = - EIO ;
3970+ err = PTR_ERR ( folio ) ;
39553971 * recovery = 1 ;
39563972 continue ;
39573973 }
39583974
39593975 /* sanity checking of raw super */
3960- err = sanity_check_raw_super (sbi , bh );
3976+ err = sanity_check_raw_super (sbi , folio , block );
39613977 if (err ) {
39623978 f2fs_err (sbi , "Can't find valid F2FS filesystem in %dth superblock" ,
39633979 block + 1 );
3964- brelse ( bh );
3980+ folio_put ( folio );
39653981 * recovery = 1 ;
39663982 continue ;
39673983 }
39683984
39693985 if (!* raw_super ) {
3970- memcpy (super , bh -> b_data + F2FS_SUPER_OFFSET ,
3986+ memcpy (super , F2FS_SUPER_BLOCK ( folio , block ) ,
39713987 sizeof (* super ));
39723988 * valid_super_block = block ;
39733989 * raw_super = super ;
39743990 }
3975- brelse ( bh );
3991+ folio_put ( folio );
39763992 }
39773993
39783994 /* No valid superblock */
@@ -3986,7 +4002,8 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi,
39864002
39874003int f2fs_commit_super (struct f2fs_sb_info * sbi , bool recover )
39884004{
3989- struct buffer_head * bh ;
4005+ struct folio * folio ;
4006+ pgoff_t index ;
39904007 __u32 crc = 0 ;
39914008 int err ;
39924009
@@ -4004,22 +4021,24 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
40044021 }
40054022
40064023 /* write back-up superblock first */
4007- bh = sb_bread (sbi -> sb , sbi -> valid_super_block ? 0 : 1 );
4008- if (!bh )
4009- return - EIO ;
4010- err = __f2fs_commit_super (bh , F2FS_RAW_SUPER (sbi ));
4011- brelse (bh );
4024+ index = sbi -> valid_super_block ? 0 : 1 ;
4025+ folio = read_mapping_folio (sbi -> sb -> s_bdev -> bd_mapping , index , NULL );
4026+ if (IS_ERR (folio ))
4027+ return PTR_ERR (folio );
4028+ err = __f2fs_commit_super (sbi , folio , index , true);
4029+ folio_put (folio );
40124030
40134031 /* if we are in recovery path, skip writing valid superblock */
40144032 if (recover || err )
40154033 return err ;
40164034
40174035 /* write current valid superblock */
4018- bh = sb_bread (sbi -> sb , sbi -> valid_super_block );
4019- if (!bh )
4020- return - EIO ;
4021- err = __f2fs_commit_super (bh , F2FS_RAW_SUPER (sbi ));
4022- brelse (bh );
4036+ index = sbi -> valid_super_block ;
4037+ folio = read_mapping_folio (sbi -> sb -> s_bdev -> bd_mapping , index , NULL );
4038+ if (IS_ERR (folio ))
4039+ return PTR_ERR (folio );
4040+ err = __f2fs_commit_super (sbi , folio , index , true);
4041+ folio_put (folio );
40234042 return err ;
40244043}
40254044
0 commit comments