Merge tag 'sound-5.7-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[linux-2.6-block.git] / fs / f2fs / f2fs.h
index 088c3e7a1080024ca6546c8fdc8fb8a8842f637f..ba470d5687fe04417a83e618590a5ad6c0c4582a 100644 (file)
@@ -75,7 +75,6 @@ extern const char *f2fs_fault_name[FAULT_MAX];
 /*
  * For mount options
  */
-#define F2FS_MOUNT_BG_GC               0x00000001
 #define F2FS_MOUNT_DISABLE_ROLL_FORWARD        0x00000002
 #define F2FS_MOUNT_DISCARD             0x00000004
 #define F2FS_MOUNT_NOHEAP              0x00000008
@@ -89,11 +88,8 @@ extern const char *f2fs_fault_name[FAULT_MAX];
 #define F2FS_MOUNT_NOBARRIER           0x00000800
 #define F2FS_MOUNT_FASTBOOT            0x00001000
 #define F2FS_MOUNT_EXTENT_CACHE                0x00002000
-#define F2FS_MOUNT_FORCE_FG_GC         0x00004000
 #define F2FS_MOUNT_DATA_FLUSH          0x00008000
 #define F2FS_MOUNT_FAULT_INJECTION     0x00010000
-#define F2FS_MOUNT_ADAPTIVE            0x00020000
-#define F2FS_MOUNT_LFS                 0x00040000
 #define F2FS_MOUNT_USRQUOTA            0x00080000
 #define F2FS_MOUNT_GRPQUOTA            0x00100000
 #define F2FS_MOUNT_PRJQUOTA            0x00200000
@@ -101,6 +97,7 @@ extern const char *f2fs_fault_name[FAULT_MAX];
 #define F2FS_MOUNT_INLINE_XATTR_SIZE   0x00800000
 #define F2FS_MOUNT_RESERVE_ROOT                0x01000000
 #define F2FS_MOUNT_DISABLE_CHECKPOINT  0x02000000
+#define F2FS_MOUNT_NORECOVERY          0x04000000
 
 #define F2FS_OPTION(sbi)       ((sbi)->mount_opt)
 #define clear_opt(sbi, option) (F2FS_OPTION(sbi).opt &= ~F2FS_MOUNT_##option)
@@ -139,6 +136,8 @@ struct f2fs_mount_info {
        int whint_mode;
        int alloc_mode;                 /* segment allocation policy */
        int fsync_mode;                 /* fsync policy */
+       int fs_mode;                    /* fs mode: LFS or ADAPTIVE */
+       int bggc_mode;                  /* bggc mode: off, on or sync */
        bool test_dummy_encryption;     /* test dummy encryption */
        block_t unusable_cap;           /* Amount of space allowed to be
                                         * unusable when disabling checkpoint
@@ -332,8 +331,8 @@ struct discard_policy {
        bool io_aware;                  /* issue discard in idle time */
        bool sync;                      /* submit discard with REQ_SYNC flag */
        bool ordered;                   /* issue discard by lba order */
+       bool timeout;                   /* discard timeout for put_super */
        unsigned int granularity;       /* discard granularity */
-       int timeout;                    /* discard timeout for put_super */
 };
 
 struct discard_cmd_control {
@@ -428,6 +427,7 @@ static inline bool __has_cursum_space(struct f2fs_journal *journal,
 #define F2FS_IOC_GET_PIN_FILE          _IOR(F2FS_IOCTL_MAGIC, 14, __u32)
 #define F2FS_IOC_PRECACHE_EXTENTS      _IO(F2FS_IOCTL_MAGIC, 15)
 #define F2FS_IOC_RESIZE_FS             _IOW(F2FS_IOCTL_MAGIC, 16, __u64)
+#define F2FS_IOC_GET_COMPRESS_BLOCKS   _IOR(F2FS_IOCTL_MAGIC, 17, __u64)
 
 #define F2FS_IOC_GET_VOLUME_NAME       FS_IOC_GETFSLABEL
 #define F2FS_IOC_SET_VOLUME_NAME       FS_IOC_SETFSLABEL
@@ -560,6 +560,9 @@ enum {
 
 #define DEFAULT_RETRY_IO_COUNT 8       /* maximum retry read IO count */
 
+/* congestion wait timeout value, default: 20ms */
+#define        DEFAULT_IO_TIMEOUT      (msecs_to_jiffies(20))
+
 /* maximum retry quota flush count */
 #define DEFAULT_RETRY_QUOTA_FLUSH_COUNT                8
 
@@ -676,6 +679,44 @@ enum {
        MAX_GC_FAILURE
 };
 
+/* used for f2fs_inode_info->flags */
+enum {
+       FI_NEW_INODE,           /* indicate newly allocated inode */
+       FI_DIRTY_INODE,         /* indicate inode is dirty or not */
+       FI_AUTO_RECOVER,        /* indicate inode is recoverable */
+       FI_DIRTY_DIR,           /* indicate directory has dirty pages */
+       FI_INC_LINK,            /* need to increment i_nlink */
+       FI_ACL_MODE,            /* indicate acl mode */
+       FI_NO_ALLOC,            /* should not allocate any blocks */
+       FI_FREE_NID,            /* free allocated nide */
+       FI_NO_EXTENT,           /* not to use the extent cache */
+       FI_INLINE_XATTR,        /* used for inline xattr */
+       FI_INLINE_DATA,         /* used for inline data*/
+       FI_INLINE_DENTRY,       /* used for inline dentry */
+       FI_APPEND_WRITE,        /* inode has appended data */
+       FI_UPDATE_WRITE,        /* inode has in-place-update data */
+       FI_NEED_IPU,            /* used for ipu per file */
+       FI_ATOMIC_FILE,         /* indicate atomic file */
+       FI_ATOMIC_COMMIT,       /* indicate the state of atomical committing */
+       FI_VOLATILE_FILE,       /* indicate volatile file */
+       FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */
+       FI_DROP_CACHE,          /* drop dirty page cache */
+       FI_DATA_EXIST,          /* indicate data exists */
+       FI_INLINE_DOTS,         /* indicate inline dot dentries */
+       FI_DO_DEFRAG,           /* indicate defragment is running */
+       FI_DIRTY_FILE,          /* indicate regular/symlink has dirty pages */
+       FI_NO_PREALLOC,         /* indicate skipped preallocated blocks */
+       FI_HOT_DATA,            /* indicate file is hot */
+       FI_EXTRA_ATTR,          /* indicate file has extra attribute */
+       FI_PROJ_INHERIT,        /* indicate file inherits projectid */
+       FI_PIN_FILE,            /* indicate file should not be gced */
+       FI_ATOMIC_REVOKE_REQUEST, /* request to drop atomic data */
+       FI_VERITY_IN_PROGRESS,  /* building fs-verity Merkle tree */
+       FI_COMPRESSED_FILE,     /* indicate file's data can be compressed */
+       FI_MMAP_FILE,           /* indicate file was mmapped */
+       FI_MAX,                 /* max flag, never be used */
+};
+
 struct f2fs_inode_info {
        struct inode vfs_inode;         /* serve a vfs inode */
        unsigned long i_flags;          /* keep an inode flags for ioctl */
@@ -688,7 +729,7 @@ struct f2fs_inode_info {
        umode_t i_acl_mode;             /* keep file acl mode temporarily */
 
        /* Use below internally in f2fs*/
-       unsigned long flags;            /* use to pass per-file flags */
+       unsigned long flags[BITS_TO_LONGS(FI_MAX)];     /* use to pass per-file flags */
        struct rw_semaphore i_sem;      /* protect fi info */
        atomic_t dirty_pages;           /* # of dirty pages */
        f2fs_hash_t chash;              /* hash value of given file name */
@@ -697,6 +738,7 @@ struct f2fs_inode_info {
        struct task_struct *cp_task;    /* separate cp/wb IO stats*/
        nid_t i_xattr_nid;              /* node id that contains xattrs */
        loff_t  last_disk_size;         /* lastly written file size */
+       spinlock_t i_size_lock;         /* protect last_disk_size */
 
 #ifdef CONFIG_QUOTA
        struct dquot *i_dquot[MAXQUOTAS];
@@ -1172,6 +1214,20 @@ enum {
        GC_URGENT,
 };
 
+enum {
+       BGGC_MODE_ON,           /* background gc is on */
+       BGGC_MODE_OFF,          /* background gc is off */
+       BGGC_MODE_SYNC,         /*
+                                * background gc is on, migrating blocks
+                                * like foreground gc
+                                */
+};
+
+enum {
+       FS_MODE_ADAPTIVE,       /* use both lfs/ssr allocation */
+       FS_MODE_LFS,            /* use lfs allocation only */
+};
+
 enum {
        WHINT_MODE_OFF,         /* not pass down write hints */
        WHINT_MODE_USER,        /* try to pass down hints given by users */
@@ -1212,13 +1268,13 @@ enum fsync_mode {
 enum compress_algorithm_type {
        COMPRESS_LZO,
        COMPRESS_LZ4,
+       COMPRESS_ZSTD,
        COMPRESS_MAX,
 };
 
-#define COMPRESS_DATA_RESERVED_SIZE            4
+#define COMPRESS_DATA_RESERVED_SIZE            5
 struct compress_data {
        __le32 clen;                    /* compressed data size */
-       __le32 chksum;                  /* checksum of compressed data */
        __le32 reserved[COMPRESS_DATA_RESERVED_SIZE];   /* reserved */
        u8 cdata[];                     /* compressed data */
 };
@@ -1242,6 +1298,7 @@ struct compress_ctx {
        size_t rlen;                    /* valid data length in rbuf */
        size_t clen;                    /* valid data length in cbuf */
        void *private;                  /* payload buffer for specified compression algorithm */
+       void *private2;                 /* extra payload buffer */
 };
 
 /* compress context for write IO path */
@@ -1271,11 +1328,14 @@ struct decompress_io_ctx {
        size_t clen;                    /* valid data length in cbuf */
        refcount_t ref;                 /* referrence count of compressed page */
        bool failed;                    /* indicate IO error during decompression */
+       void *private;                  /* payload buffer for specified decompression algorithm */
+       void *private2;                 /* extra payload buffer */
 };
 
 #define NULL_CLUSTER                   ((unsigned int)(~0))
 #define MIN_COMPRESS_LOG_SIZE          2
 #define MAX_COMPRESS_LOG_SIZE          8
+#define MAX_COMPRESS_WINDOW_SIZE       ((PAGE_SIZE) << MAX_COMPRESS_LOG_SIZE)
 
 struct f2fs_sb_info {
        struct super_block *sb;                 /* pointer to VFS super block */
@@ -1471,6 +1531,9 @@ struct f2fs_sb_info {
        __u32 s_chksum_seed;
 
        struct workqueue_struct *post_read_wq;  /* post read workqueue */
+
+       struct kmem_cache *inline_xattr_slab;   /* inline xattr entry */
+       unsigned int inline_xattr_slab_size;    /* default inline xattr slab size */
 };
 
 struct f2fs_private_dio {
@@ -2211,7 +2274,7 @@ static inline void dec_valid_node_count(struct f2fs_sb_info *sbi,
                dquot_free_inode(inode);
        } else {
                if (unlikely(inode->i_blocks == 0)) {
-                       f2fs_warn(sbi, "Inconsistent i_blocks, ino:%lu, iblocks:%llu",
+                       f2fs_warn(sbi, "dec_valid_node_count: inconsistent i_blocks, ino:%lu, iblocks:%llu",
                                  inode->i_ino,
                                  (unsigned long long)inode->i_blocks);
                        set_sbi_flag(sbi, SBI_NEED_FSCK);
@@ -2379,7 +2442,7 @@ static inline __le32 *blkaddr_in_node(struct f2fs_node *node)
 }
 
 static inline int f2fs_has_extra_attr(struct inode *inode);
-static inline block_t datablock_addr(struct inode *inode,
+static inline block_t data_blkaddr(struct inode *inode,
                        struct page *node_page, unsigned int offset)
 {
        struct f2fs_node *raw_node;
@@ -2389,9 +2452,9 @@ static inline block_t datablock_addr(struct inode *inode,
 
        raw_node = F2FS_NODE(node_page);
 
-       /* from GC path only */
        if (is_inode) {
                if (!inode)
+                       /* from GC path only */
                        base = offset_in_addr(&raw_node->i);
                else if (f2fs_has_extra_attr(inode))
                        base = get_extra_isize(inode);
@@ -2401,6 +2464,11 @@ static inline block_t datablock_addr(struct inode *inode,
        return le32_to_cpu(addr_array[base + offset]);
 }
 
+static inline block_t f2fs_data_blkaddr(struct dnode_of_data *dn)
+{
+       return data_blkaddr(dn->inode, dn->node_page, dn->ofs_in_node);
+}
+
 static inline int f2fs_test_bit(unsigned int nr, char *addr)
 {
        int mask;
@@ -2498,43 +2566,6 @@ static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags)
                return flags & F2FS_OTHER_FLMASK;
 }
 
-/* used for f2fs_inode_info->flags */
-enum {
-       FI_NEW_INODE,           /* indicate newly allocated inode */
-       FI_DIRTY_INODE,         /* indicate inode is dirty or not */
-       FI_AUTO_RECOVER,        /* indicate inode is recoverable */
-       FI_DIRTY_DIR,           /* indicate directory has dirty pages */
-       FI_INC_LINK,            /* need to increment i_nlink */
-       FI_ACL_MODE,            /* indicate acl mode */
-       FI_NO_ALLOC,            /* should not allocate any blocks */
-       FI_FREE_NID,            /* free allocated nide */
-       FI_NO_EXTENT,           /* not to use the extent cache */
-       FI_INLINE_XATTR,        /* used for inline xattr */
-       FI_INLINE_DATA,         /* used for inline data*/
-       FI_INLINE_DENTRY,       /* used for inline dentry */
-       FI_APPEND_WRITE,        /* inode has appended data */
-       FI_UPDATE_WRITE,        /* inode has in-place-update data */
-       FI_NEED_IPU,            /* used for ipu per file */
-       FI_ATOMIC_FILE,         /* indicate atomic file */
-       FI_ATOMIC_COMMIT,       /* indicate the state of atomical committing */
-       FI_VOLATILE_FILE,       /* indicate volatile file */
-       FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */
-       FI_DROP_CACHE,          /* drop dirty page cache */
-       FI_DATA_EXIST,          /* indicate data exists */
-       FI_INLINE_DOTS,         /* indicate inline dot dentries */
-       FI_DO_DEFRAG,           /* indicate defragment is running */
-       FI_DIRTY_FILE,          /* indicate regular/symlink has dirty pages */
-       FI_NO_PREALLOC,         /* indicate skipped preallocated blocks */
-       FI_HOT_DATA,            /* indicate file is hot */
-       FI_EXTRA_ATTR,          /* indicate file has extra attribute */
-       FI_PROJ_INHERIT,        /* indicate file inherits projectid */
-       FI_PIN_FILE,            /* indicate file should not be gced */
-       FI_ATOMIC_REVOKE_REQUEST, /* request to drop atomic data */
-       FI_VERITY_IN_PROGRESS,  /* building fs-verity Merkle tree */
-       FI_COMPRESSED_FILE,     /* indicate file's data can be compressed */
-       FI_MMAP_FILE,           /* indicate file was mmapped */
-};
-
 static inline void __mark_inode_dirty_flag(struct inode *inode,
                                                int flag, bool set)
 {
@@ -2549,27 +2580,24 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,
        case FI_DATA_EXIST:
        case FI_INLINE_DOTS:
        case FI_PIN_FILE:
-       case FI_COMPRESSED_FILE:
                f2fs_mark_inode_dirty_sync(inode, true);
        }
 }
 
 static inline void set_inode_flag(struct inode *inode, int flag)
 {
-       if (!test_bit(flag, &F2FS_I(inode)->flags))
-               set_bit(flag, &F2FS_I(inode)->flags);
+       test_and_set_bit(flag, F2FS_I(inode)->flags);
        __mark_inode_dirty_flag(inode, flag, true);
 }
 
 static inline int is_inode_flag_set(struct inode *inode, int flag)
 {
-       return test_bit(flag, &F2FS_I(inode)->flags);
+       return test_bit(flag, F2FS_I(inode)->flags);
 }
 
 static inline void clear_inode_flag(struct inode *inode, int flag)
 {
-       if (test_bit(flag, &F2FS_I(inode)->flags))
-               clear_bit(flag, &F2FS_I(inode)->flags);
+       test_and_clear_bit(flag, F2FS_I(inode)->flags);
        __mark_inode_dirty_flag(inode, flag, false);
 }
 
@@ -2660,19 +2688,19 @@ static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)
        struct f2fs_inode_info *fi = F2FS_I(inode);
 
        if (ri->i_inline & F2FS_INLINE_XATTR)
-               set_bit(FI_INLINE_XATTR, &fi->flags);
+               set_bit(FI_INLINE_XATTR, fi->flags);
        if (ri->i_inline & F2FS_INLINE_DATA)
-               set_bit(FI_INLINE_DATA, &fi->flags);
+               set_bit(FI_INLINE_DATA, fi->flags);
        if (ri->i_inline & F2FS_INLINE_DENTRY)
-               set_bit(FI_INLINE_DENTRY, &fi->flags);
+               set_bit(FI_INLINE_DENTRY, fi->flags);
        if (ri->i_inline & F2FS_DATA_EXIST)
-               set_bit(FI_DATA_EXIST, &fi->flags);
+               set_bit(FI_DATA_EXIST, fi->flags);
        if (ri->i_inline & F2FS_INLINE_DOTS)
-               set_bit(FI_INLINE_DOTS, &fi->flags);
+               set_bit(FI_INLINE_DOTS, fi->flags);
        if (ri->i_inline & F2FS_EXTRA_ATTR)
-               set_bit(FI_EXTRA_ATTR, &fi->flags);
+               set_bit(FI_EXTRA_ATTR, fi->flags);
        if (ri->i_inline & F2FS_PIN_FILE)
-               set_bit(FI_PIN_FILE, &fi->flags);
+               set_bit(FI_PIN_FILE, fi->flags);
 }
 
 static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri)
@@ -2857,9 +2885,9 @@ static inline bool f2fs_skip_inode_update(struct inode *inode, int dsync)
        if (!f2fs_is_time_consistent(inode))
                return false;
 
-       down_read(&F2FS_I(inode)->i_sem);
+       spin_lock(&F2FS_I(inode)->i_size_lock);
        ret = F2FS_I(inode)->last_disk_size == i_size_read(inode);
-       up_read(&F2FS_I(inode)->i_sem);
+       spin_unlock(&F2FS_I(inode)->i_size_lock);
 
        return ret;
 }
@@ -3213,7 +3241,7 @@ void f2fs_drop_inmem_pages(struct inode *inode);
 void f2fs_drop_inmem_page(struct inode *inode, struct page *page);
 int f2fs_commit_inmem_pages(struct inode *inode);
 void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need);
-void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi);
+void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg);
 int f2fs_issue_flush(struct f2fs_sb_info *sbi, nid_t ino);
 int f2fs_create_flush_cmd_control(struct f2fs_sb_info *sbi);
 int f2fs_flush_device_cache(struct f2fs_sb_info *sbi);
@@ -3309,7 +3337,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi);
 void f2fs_update_dirty_page(struct inode *inode, struct page *page);
 void f2fs_remove_dirty_inode(struct inode *inode);
 int f2fs_sync_dirty_inodes(struct f2fs_sb_info *sbi, enum inode_type type);
-void f2fs_wait_on_all_pages_writeback(struct f2fs_sb_info *sbi);
+void f2fs_wait_on_all_pages(struct f2fs_sb_info *sbi, int type);
 int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc);
 void f2fs_init_ino_entry_info(struct f2fs_sb_info *sbi);
 int __init f2fs_create_checkpoint_caches(void);
@@ -3320,7 +3348,7 @@ void f2fs_destroy_checkpoint_caches(void);
  */
 int __init f2fs_init_bioset(void);
 void f2fs_destroy_bioset(void);
-struct bio *f2fs_bio_alloc(struct f2fs_sb_info *sbi, int npages, bool no_fail);
+struct bio *f2fs_bio_alloc(struct f2fs_sb_info *sbi, int npages, bool noio);
 int f2fs_init_bio_entry_cache(void);
 void f2fs_destroy_bio_entry_cache(void);
 void f2fs_submit_bio(struct f2fs_sb_info *sbi,
@@ -3776,7 +3804,7 @@ int f2fs_write_multi_pages(struct compress_ctx *cc,
 int f2fs_is_compressed_cluster(struct inode *inode, pgoff_t index);
 int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret,
                                unsigned nr_pages, sector_t *last_block_in_bio,
-                               bool is_readahead);
+                               bool is_readahead, bool for_write);
 struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc);
 void f2fs_free_dic(struct decompress_io_ctx *dic);
 void f2fs_decompress_end_io(struct page **rpages,
@@ -3813,6 +3841,7 @@ static inline void set_compress_context(struct inode *inode)
        F2FS_I(inode)->i_flags |= F2FS_COMPR_FL;
        set_inode_flag(inode, FI_COMPRESSED_FILE);
        stat_inc_compr_inode(inode);
+       f2fs_mark_inode_dirty_sync(inode, true);
 }
 
 static inline u64 f2fs_disable_compressed_file(struct inode *inode)
@@ -3821,12 +3850,17 @@ static inline u64 f2fs_disable_compressed_file(struct inode *inode)
 
        if (!f2fs_compressed_file(inode))
                return 0;
-       if (fi->i_compr_blocks)
-               return fi->i_compr_blocks;
+       if (S_ISREG(inode->i_mode)) {
+               if (get_dirty_pages(inode))
+                       return 1;
+               if (fi->i_compr_blocks)
+                       return fi->i_compr_blocks;
+       }
 
        fi->i_flags &= ~F2FS_COMPR_FL;
-       clear_inode_flag(inode, FI_COMPRESSED_FILE);
        stat_dec_compr_inode(inode);
+       clear_inode_flag(inode, FI_COMPRESSED_FILE);
+       f2fs_mark_inode_dirty_sync(inode, true);
        return 0;
 }
 
@@ -3903,31 +3937,25 @@ static inline bool f2fs_hw_is_readonly(struct f2fs_sb_info *sbi)
        return false;
 }
 
-
-static inline void set_opt_mode(struct f2fs_sb_info *sbi, unsigned int mt)
+static inline bool f2fs_lfs_mode(struct f2fs_sb_info *sbi)
 {
-       clear_opt(sbi, ADAPTIVE);
-       clear_opt(sbi, LFS);
-
-       switch (mt) {
-       case F2FS_MOUNT_ADAPTIVE:
-               set_opt(sbi, ADAPTIVE);
-               break;
-       case F2FS_MOUNT_LFS:
-               set_opt(sbi, LFS);
-               break;
-       }
+       return F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS;
 }
 
-static inline bool f2fs_may_encrypt(struct inode *inode)
+static inline bool f2fs_may_encrypt(struct inode *dir, struct inode *inode)
 {
 #ifdef CONFIG_FS_ENCRYPTION
+       struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        umode_t mode = inode->i_mode;
 
-       return (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode));
-#else
-       return false;
+       /*
+        * If the directory encrypted or dummy encryption enabled,
+        * then we should encrypt the inode.
+        */
+       if (IS_ENCRYPTED(dir) || DUMMY_ENCRYPTION_ENABLED(sbi))
+               return (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode));
 #endif
+       return false;
 }
 
 static inline bool f2fs_may_compress(struct inode *inode)
@@ -3971,7 +3999,7 @@ static inline int allow_outplace_dio(struct inode *inode,
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        int rw = iov_iter_rw(iter);
 
-       return (test_opt(sbi, LFS) && (rw == WRITE) &&
+       return (f2fs_lfs_mode(sbi) && (rw == WRITE) &&
                                !block_unaligned_IO(inode, iocb, iter));
 }
 
@@ -3993,7 +4021,7 @@ static inline bool f2fs_force_buffered_io(struct inode *inode,
         */
        if (f2fs_sb_has_blkzoned(sbi))
                return true;
-       if (test_opt(sbi, LFS) && (rw == WRITE)) {
+       if (f2fs_lfs_mode(sbi) && (rw == WRITE)) {
                if (block_unaligned_IO(inode, iocb, iter))
                        return true;
                if (F2FS_IO_ALIGNED(sbi))