Flush curseg sit entries, since type of sit entries may
be changed after move_curseg_info.

Signed-off-by: Xue Liu <liuxueliu....@huawei.com>
---
 fsck/fsck.c  | 25 +++++++++++++++++++++++++
 fsck/fsck.h  |  4 ++++
 fsck/mount.c |  2 +-
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/fsck/fsck.c b/fsck/fsck.c
index 0009ea4..7a536b2 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -1729,6 +1729,30 @@ static void fix_nat_entries(struct f2fs_sb_info *sbi)
                        nullify_nat_entry(sbi, i);
 }
 
+static void flush_curseg_sit_entries(struct f2fs_sb_info *sbi)
+{
+       struct sit_info *sit_i = SIT_I(sbi);
+       int i;
+
+       /* update curseg sit entries, since we may change
+        * a segment type in move_curseg_info
+        */
+       for (i = 0; i < NO_CHECK_TYPE; i++) {
+               struct curseg_info *curseg = CURSEG_I(sbi, i);
+               struct f2fs_sit_block *sit_blk;
+               struct f2fs_sit_entry *sit;
+               struct seg_entry *se;
+
+               se = get_seg_entry(sbi, curseg->segno);
+               sit_blk = get_current_sit_page(sbi, curseg->segno);
+               sit = &sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, curseg->segno)];
+               sit->vblocks = cpu_to_le16((se->type << SIT_VBLOCKS_SHIFT) |
+                                                       se->valid_blocks);
+               rewrite_current_sit_page(sbi, curseg->segno, sit_blk);
+               free(sit_blk);
+       }
+}
+
 static void fix_checkpoint(struct f2fs_sb_info *sbi)
 {
        struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
@@ -1982,6 +2006,7 @@ int fsck_verify(struct f2fs_sb_info *sbi)
                        rewrite_sit_area_bitmap(sbi);
                        move_curseg_info(sbi, SM_I(sbi)->main_blkaddr);
                        write_curseg_info(sbi);
+                       flush_curseg_sit_entries(sbi);
                        fix_checkpoint(sbi);
                } else if (is_set_ckpt_flags(cp, CP_FSCK_FLAG)) {
                        write_checkpoint(sbi);
diff --git a/fsck/fsck.h b/fsck/fsck.h
index 412e7b7..c106153 100644
--- a/fsck/fsck.h
+++ b/fsck/fsck.h
@@ -165,6 +165,10 @@ extern void update_nat_blkaddr(struct f2fs_sb_info *, 
nid_t, nid_t, block_t);
 extern void print_raw_sb_info(struct f2fs_super_block *);
 
 extern u32 get_free_segments(struct f2fs_sb_info *);
+extern struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *,
+                       unsigned int);
+extern void rewrite_current_sit_page(struct f2fs_sb_info *, unsigned int,
+                       struct f2fs_sit_block *);
 
 /* dump.c */
 struct dump_option {
diff --git a/fsck/mount.c b/fsck/mount.c
index 9fcb008..e7d5cee 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -1018,7 +1018,7 @@ static inline void check_seg_range(struct f2fs_sb_info 
*sbi, unsigned int segno)
        ASSERT(segno <= end_segno);
 }
 
-static struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *sbi,
+struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *sbi,
                                                unsigned int segno)
 {
        struct sit_info *sit_i = SIT_I(sbi);
-- 
1.8.5.2


------------------------------------------------------------------------------
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to