diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 0b8a2d8efa72..f9dc543805d9 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -966,7 +966,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) struct buffer_head *raw_super_buf; struct inode *root; long err = -EINVAL; - bool retry = true; + bool retry = true, need_fsck = false; char *options = NULL; int i; @@ -1155,9 +1155,6 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) if (err) goto free_proc; - if (!retry) - set_sbi_flag(sbi, SBI_NEED_FSCK); - /* recover fsynced data */ if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) { /* @@ -1169,8 +1166,13 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) err = -EROFS; goto free_kobj; } + + if (need_fsck) + set_sbi_flag(sbi, SBI_NEED_FSCK); + err = recover_fsync_data(sbi); if (err) { + need_fsck = true; f2fs_msg(sb, KERN_ERR, "Cannot recover all fsync data errno=%ld", err); goto free_kobj;