summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/f2fs.h2
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/f2fs/super.c8
3 files changed, 7 insertions, 5 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 1a0716c36940..a8327ed73898 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1624,7 +1624,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
/*
* super.c
*/
-int f2fs_commit_super(struct f2fs_sb_info *);
+int f2fs_commit_super(struct f2fs_sb_info *, bool);
int f2fs_sync_fs(struct super_block *, int);
extern __printf(3, 4)
void f2fs_msg(struct super_block *, const char *, const char *, ...);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 4d42d66acd96..096e08ca3945 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1530,7 +1530,7 @@ static int f2fs_ioc_get_encryption_pwsalt(struct file *filp, unsigned long arg)
/* update superblock with uuid */
generate_random_uuid(sbi->raw_super->encrypt_pw_salt);
- err = f2fs_commit_super(sbi);
+ err = f2fs_commit_super(sbi, false);
mnt_drop_write_file(filp);
if (err) {
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index d54c54f6a49d..a06b0b46fe69 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1043,7 +1043,7 @@ out:
return 0;
}
-int f2fs_commit_super(struct f2fs_sb_info *sbi)
+int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
{
struct buffer_head *sbh = sbi->raw_super_buf;
sector_t block = sbh->b_blocknr;
@@ -1055,7 +1055,9 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi)
err = sync_dirty_buffer(sbh);
sbh->b_blocknr = block;
- if (err)
+
+ /* if we are in recovery path, skip writing valid superblock */
+ if (recover || err)
goto out;
/* write current valid superblock */
@@ -1289,7 +1291,7 @@ try_onemore:
/* recover broken superblock */
if (recovery && !f2fs_readonly(sb) && !bdev_read_only(sb->s_bdev)) {
f2fs_msg(sb, KERN_INFO, "Recover invalid superblock");
- f2fs_commit_super(sbi);
+ f2fs_commit_super(sbi, true);
}
return 0;