Loading fs/f2fs/f2fs.h +1 −1 Original line number Diff line number Diff line Loading @@ -1907,7 +1907,7 @@ void build_gc_manager(struct f2fs_sb_info *); /* * recovery.c */ int recover_fsync_data(struct f2fs_sb_info *); int recover_fsync_data(struct f2fs_sb_info *, bool); bool space_for_roll_forward(struct f2fs_sb_info *); /* Loading fs/f2fs/recovery.c +7 −4 Original line number Diff line number Diff line Loading @@ -551,12 +551,13 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *head) return err; } int recover_fsync_data(struct f2fs_sb_info *sbi) int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) { struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE); struct list_head inode_list; block_t blkaddr; int err; int ret = 0; bool need_writecp = false; fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry", Loading @@ -573,11 +574,13 @@ int recover_fsync_data(struct f2fs_sb_info *sbi) /* step #1: find fsynced inode numbers */ err = find_fsync_dnodes(sbi, &inode_list); if (err) if (err || list_empty(&inode_list)) goto out; if (list_empty(&inode_list)) if (check_only) { ret = 1; goto out; } need_writecp = true; Loading Loading @@ -625,5 +628,5 @@ int recover_fsync_data(struct f2fs_sb_info *sbi) } else { mutex_unlock(&sbi->cp_mutex); } return err; return ret ? ret: err; } fs/f2fs/super.c +12 −2 Original line number Diff line number Diff line Loading @@ -1562,14 +1562,24 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) if (need_fsck) set_sbi_flag(sbi, SBI_NEED_FSCK); err = recover_fsync_data(sbi); if (err) { err = recover_fsync_data(sbi, false); if (err < 0) { need_fsck = true; f2fs_msg(sb, KERN_ERR, "Cannot recover all fsync data errno=%ld", err); goto free_kobj; } } else { err = recover_fsync_data(sbi, true); if (!f2fs_readonly(sb) && err > 0) { err = -EINVAL; f2fs_msg(sb, KERN_ERR, "Need to recover fsync data"); goto free_kobj; } } /* recover_fsync_data() cleared this already */ clear_sbi_flag(sbi, SBI_POR_DOING); Loading Loading
fs/f2fs/f2fs.h +1 −1 Original line number Diff line number Diff line Loading @@ -1907,7 +1907,7 @@ void build_gc_manager(struct f2fs_sb_info *); /* * recovery.c */ int recover_fsync_data(struct f2fs_sb_info *); int recover_fsync_data(struct f2fs_sb_info *, bool); bool space_for_roll_forward(struct f2fs_sb_info *); /* Loading
fs/f2fs/recovery.c +7 −4 Original line number Diff line number Diff line Loading @@ -551,12 +551,13 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *head) return err; } int recover_fsync_data(struct f2fs_sb_info *sbi) int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) { struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE); struct list_head inode_list; block_t blkaddr; int err; int ret = 0; bool need_writecp = false; fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry", Loading @@ -573,11 +574,13 @@ int recover_fsync_data(struct f2fs_sb_info *sbi) /* step #1: find fsynced inode numbers */ err = find_fsync_dnodes(sbi, &inode_list); if (err) if (err || list_empty(&inode_list)) goto out; if (list_empty(&inode_list)) if (check_only) { ret = 1; goto out; } need_writecp = true; Loading Loading @@ -625,5 +628,5 @@ int recover_fsync_data(struct f2fs_sb_info *sbi) } else { mutex_unlock(&sbi->cp_mutex); } return err; return ret ? ret: err; }
fs/f2fs/super.c +12 −2 Original line number Diff line number Diff line Loading @@ -1562,14 +1562,24 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) if (need_fsck) set_sbi_flag(sbi, SBI_NEED_FSCK); err = recover_fsync_data(sbi); if (err) { err = recover_fsync_data(sbi, false); if (err < 0) { need_fsck = true; f2fs_msg(sb, KERN_ERR, "Cannot recover all fsync data errno=%ld", err); goto free_kobj; } } else { err = recover_fsync_data(sbi, true); if (!f2fs_readonly(sb) && err > 0) { err = -EINVAL; f2fs_msg(sb, KERN_ERR, "Need to recover fsync data"); goto free_kobj; } } /* recover_fsync_data() cleared this already */ clear_sbi_flag(sbi, SBI_POR_DOING); Loading