summaryrefslogtreecommitdiff
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2014-08-08 15:37:41 -0700
committerJaegeuk Kim <jaegeuk@kernel.org>2014-08-21 09:21:00 -0700
commited2e621a95d704e6a4e904cc00524e8cbddda0c2 (patch)
tree9eff19a30572ae26c7c00af6da7b22e376cb276a /fs/f2fs
parent6f12ac25f0167adb5d9ad5547fd6838380261e5c (diff)
f2fs: give a chance to mount again when encountering errors
This patch gives another chance to try mount process when we encounter an error. This makes an effect on the roll-forward recovery failures as well. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/super.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 7a5477915d99..e161e13958e2 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -902,8 +902,10 @@ 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;
int i;
+try_onemore:
/* allocate memory for f2fs-specific super block info */
sbi = kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL);
if (!sbi)
@@ -1083,9 +1085,11 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
/* recover fsynced data */
if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) {
err = recover_fsync_data(sbi);
- if (err)
+ if (err) {
f2fs_msg(sb, KERN_ERR,
"Cannot recover all fsync data errno=%ld", err);
+ goto free_kobj;
+ }
}
/*
@@ -1126,6 +1130,13 @@ free_sb_buf:
brelse(raw_super_buf);
free_sbi:
kfree(sbi);
+
+ /* give only one another chance */
+ if (retry) {
+ retry = !retry;
+ shrink_dcache_sb(sb);
+ goto try_onemore;
+ }
return err;
}