fsck.f2fs: flush curseg sit entries
authorLiu Xue <liuxueliu.liu@huawei.com>
Wed, 23 Nov 2016 12:40:06 +0000 (20:40 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 23 Nov 2016 18:12:56 +0000 (10:12 -0800)
Flush curseg sit entries, since type of sit entries may
be changed after move_curseg_info.

Signed-off-by: Xue Liu <liuxueliu.liu@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/fsck.c
fsck/fsck.h
fsck/mount.c

index fd28d94..894dd9b 100644 (file)
@@ -1746,6 +1746,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);
@@ -1999,6 +2023,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);
index 8785de8..f21e199 100644 (file)
@@ -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 {
index 6c29a1a..79fb9af 100644 (file)
@@ -1050,7 +1050,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);