On 02/02, Junling Zheng wrote: > Commit "0a007b97aad6"(f2fs: recover directory operations by fsync) > fixed xfstest generic/342 case, but it also increased the written > data and caused the performance degradation. In most cases, there's > no need to do so heavily fsync actually. > > So we introduce a new mount option "strict_fsync" to control the > policy of fsync. It's set by default, and means that fsync follows > POSIX semantics. And "nostrict_fsync" means that the behaviour is > in line with xfs, ext4 and btrfs, where generic/342 will pass.
How about adding "fsync=%s" to give another chance for fsync policies? Thanks, > > Signed-off-by: Junling Zheng <zhengjunl...@huawei.com> > Reviewed-by: Chao Yu <yuch...@huawei.com> > --- > Documentation/filesystems/f2fs.txt | 4 ++++ > fs/f2fs/dir.c | 3 ++- > fs/f2fs/f2fs.h | 1 + > fs/f2fs/file.c | 3 ++- > fs/f2fs/namei.c | 9 ++++++--- > fs/f2fs/super.c | 13 +++++++++++++ > 6 files changed, 28 insertions(+), 5 deletions(-) > > diff --git a/Documentation/filesystems/f2fs.txt > b/Documentation/filesystems/f2fs.txt > index 0caf7da0a532..c484ce8d1f4c 100644 > --- a/Documentation/filesystems/f2fs.txt > +++ b/Documentation/filesystems/f2fs.txt > @@ -180,6 +180,10 @@ whint_mode=%s Control which write hints are > passed down to block > down hints. In "user-based" mode, f2fs tries to pass > down hints given by users. And in "fs-based" mode, > f2fs > passes down hints with its policy. > +{,no}strict_fsync Control the policy of fsync. Set "strict_fsync" by > default, > + which means that fsync will follow POSIX semantics. > Use > + "nostrict_fsync" if you expect fsync to behave in > line with > + xfs, ext4 and btrfs, where xfstest generic/342 will > pass. > > > ================================================================================ > DEBUGFS ENTRIES > diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c > index f00b5ed8c011..7487b7e77a36 100644 > --- a/fs/f2fs/dir.c > +++ b/fs/f2fs/dir.c > @@ -713,7 +713,8 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, > struct page *page, > > f2fs_update_time(F2FS_I_SB(dir), REQ_TIME); > > - add_ino_entry(F2FS_I_SB(dir), dir->i_ino, TRANS_DIR_INO); > + if (!test_opt(F2FS_I_SB(dir), STRICT_FSYNC)) > + add_ino_entry(F2FS_I_SB(dir), dir->i_ino, TRANS_DIR_INO); > > if (f2fs_has_inline_dentry(dir)) > return f2fs_delete_inline_entry(dentry, page, dir, inode); > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index dbe87c7a266e..8cf914d12f17 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -97,6 +97,7 @@ extern char *fault_name[FAULT_MAX]; > #define F2FS_MOUNT_QUOTA 0x00400000 > #define F2FS_MOUNT_INLINE_XATTR_SIZE 0x00800000 > #define F2FS_MOUNT_RESERVE_ROOT 0x01000000 > +#define F2FS_MOUNT_STRICT_FSYNC 0x02000000 > > #define clear_opt(sbi, option) ((sbi)->mount_opt.opt &= > ~F2FS_MOUNT_##option) > #define set_opt(sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option) > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 672a542e5464..9b39254f5b48 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -165,7 +165,8 @@ static inline enum cp_reason_type > need_do_checkpoint(struct inode *inode) > cp_reason = CP_FASTBOOT_MODE; > else if (sbi->active_logs == 2) > cp_reason = CP_SPEC_LOG_NUM; > - else if (need_dentry_mark(sbi, inode->i_ino) && > + else if (!test_opt(sbi, STRICT_FSYNC) && > + need_dentry_mark(sbi, inode->i_ino) && > exist_written_data(sbi, F2FS_I(inode)->i_pino, TRANS_DIR_INO)) > cp_reason = CP_RECOVER_DIR; > > diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c > index c4c94c7e9f4f..ef86ae327f91 100644 > --- a/fs/f2fs/namei.c > +++ b/fs/f2fs/namei.c > @@ -936,7 +936,8 @@ static int f2fs_rename(struct inode *old_dir, struct > dentry *old_dentry, > } > f2fs_i_links_write(old_dir, false); > } > - add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO); > + if (!test_opt(sbi, STRICT_FSYNC)) > + add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO); > > f2fs_unlock_op(sbi); > > @@ -1091,8 +1092,10 @@ static int f2fs_cross_rename(struct inode *old_dir, > struct dentry *old_dentry, > } > f2fs_mark_inode_dirty_sync(new_dir, false); > > - add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO); > - add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO); > + if (!test_opt(sbi, STRICT_FSYNC)) { > + add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO); > + add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO); > + } > > f2fs_unlock_op(sbi); > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index 7966cf7bfb8e..3066fc9d8985 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -130,6 +130,8 @@ enum { > Opt_jqfmt_vfsv0, > Opt_jqfmt_vfsv1, > Opt_whint, > + Opt_strict_fsync, > + Opt_nostrict_fsync, > Opt_err, > }; > > @@ -184,6 +186,8 @@ static match_table_t f2fs_tokens = { > {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, > {Opt_jqfmt_vfsv1, "jqfmt=vfsv1"}, > {Opt_whint, "whint_mode=%s"}, > + {Opt_strict_fsync, "strict_fsync"}, > + {Opt_nostrict_fsync, "nostrict_fsync"}, > {Opt_err, NULL}, > }; > > @@ -700,6 +704,12 @@ static int parse_options(struct super_block *sb, char > *options) > } > kfree(name); > break; > + case Opt_strict_fsync: > + set_opt(sbi, STRICT_FSYNC); > + break; > + case Opt_nostrict_fsync: > + clear_opt(sbi, STRICT_FSYNC); > + break; > default: > f2fs_msg(sb, KERN_ERR, > "Unrecognized mount option \"%s\" or missing > value", > @@ -1296,6 +1306,9 @@ static void default_options(struct f2fs_sb_info *sbi) > set_opt(sbi, POSIX_ACL); > #endif > > + /* POSIX standard fsync */ > + set_opt(sbi, STRICT_FSYNC); > + > #ifdef CONFIG_F2FS_FAULT_INJECTION > f2fs_build_fault_attr(sbi, 0); > #endif > -- > 2.15.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel