f2fs: add fsync_mode=nobarrier for non-atomic files
authorJaegeuk Kim <jaegeuk@kernel.org>
Sat, 26 May 2018 01:02:58 +0000 (18:02 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 29 May 2018 19:04:08 +0000 (12:04 -0700)
For non-atomic files, this patch adds an option to give nobarrier which
doesn't issue flush commands to the device.

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Documentation/filesystems/f2fs.txt
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/super.c

index 12a147c9f87f208bc018419d50b4306ba907a017..69f8de99573974749263a33d75904ad5d37971de 100644 (file)
@@ -182,13 +182,15 @@ whint_mode=%s          Control which write hints are passed down to block
                        passes down hints with its policy.
 alloc_mode=%s          Adjust block allocation policy, which supports "reuse"
                        and "default".
-fsync_mode=%s          Control the policy of fsync. Currently supports "posix"
-                       and "strict". In "posix" mode, which is default, fsync
-                       will follow POSIX semantics and does a light operation
-                       to improve the filesystem performance. In "strict" mode,
-                       fsync will be heavy and behaves in line with xfs, ext4
-                       and btrfs, where xfstest generic/342 will pass, but the
-                       performance will regress.
+fsync_mode=%s          Control the policy of fsync. Currently supports "posix",
+                       "strict", and "nobarrier". In "posix" mode, which is
+                       default, fsync will follow POSIX semantics and does a
+                       light operation to improve the filesystem performance.
+                       In "strict" mode, fsync will be heavy and behaves in line
+                       with xfs, ext4 and btrfs, where xfstest generic/342 will
+                       pass, but the performance will regress. "nobarrier" is
+                       based on "posix", but doesn't issue flush command for
+                       non-atomic files likewise "nobarrier" mount option.
 test_dummy_encryption  Enable dummy encryption, which provides a fake fscrypt
                        context. The fake fscrypt context is used by xfstests.
 
index cbfe50d32d04795f156bdb5bb666a72625e96ff7..e852ac9472c6cf10ab9d70e9a1534ab6696b9198 100644 (file)
@@ -1082,6 +1082,7 @@ enum {
 enum fsync_mode {
        FSYNC_MODE_POSIX,       /* fsync follows posix semantics */
        FSYNC_MODE_STRICT,      /* fsync behaves in line with ext4 */
+       FSYNC_MODE_NOBARRIER,   /* fsync behaves nobarrier based on posix */
 };
 
 #ifdef CONFIG_F2FS_FS_ENCRYPTION
index cc08956334a07928ddba2c01ea5b801e210b2731..bd81207206d8c29e82f006251a9d0d7c3403edb5 100644 (file)
@@ -306,7 +306,7 @@ sync_nodes:
        remove_ino_entry(sbi, ino, APPEND_INO);
        clear_inode_flag(inode, FI_APPEND_WRITE);
 flush_out:
-       if (!atomic)
+       if (!atomic && F2FS_OPTION(sbi).fsync_mode != FSYNC_MODE_NOBARRIER)
                ret = f2fs_issue_flush(sbi, inode->i_ino);
        if (!ret) {
                remove_ino_entry(sbi, ino, UPDATE_INO);
index f31643718c76b3840523d7d8ab9405ac3a7fecda..c724347eed421d075bfb39d50b73d034146c9f6d 100644 (file)
@@ -740,6 +740,10 @@ static int parse_options(struct super_block *sb, char *options)
                        } else if (strlen(name) == 6 &&
                                        !strncmp(name, "strict", 6)) {
                                F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_STRICT;
+                       } else if (strlen(name) == 9 &&
+                                       !strncmp(name, "nobarrier", 9)) {
+                               F2FS_OPTION(sbi).fsync_mode =
+                                                       FSYNC_MODE_NOBARRIER;
                        } else {
                                kfree(name);
                                return -EINVAL;