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 @@ static int read_raw_super_block(struct super_block *sb, 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 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) /* 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;