Merge tag 'f2fs-for-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeu...
[linux-2.6-microblaze.git] / fs / f2fs / f2fs.h
index 906b2c4..b339ae8 100644 (file)
@@ -43,6 +43,7 @@ enum {
        FAULT_KVMALLOC,
        FAULT_PAGE_ALLOC,
        FAULT_PAGE_GET,
+       FAULT_ALLOC_BIO,        /* it's obsolete due to bio_alloc() will never fail */
        FAULT_ALLOC_NID,
        FAULT_ORPHAN,
        FAULT_BLOCK,
@@ -53,6 +54,7 @@ enum {
        FAULT_CHECKPOINT,
        FAULT_DISCARD,
        FAULT_WRITE_IO,
+       FAULT_SLAB_ALLOC,
        FAULT_MAX,
 };
 
@@ -139,6 +141,11 @@ struct f2fs_mount_info {
        int fsync_mode;                 /* fsync policy */
        int fs_mode;                    /* fs mode: LFS or ADAPTIVE */
        int bggc_mode;                  /* bggc mode: off, on or sync */
+       int discard_unit;               /*
+                                        * discard command's offset/size should
+                                        * be aligned to this unit: block,
+                                        * segment or section
+                                        */
        struct fscrypt_dummy_policy dummy_enc_policy; /* test dummy encryption */
        block_t unusable_cap_perc;      /* percentage for cap */
        block_t unusable_cap;           /* Amount of space allowed to be
@@ -542,7 +549,7 @@ enum {
                                         */
 };
 
-#define DEFAULT_RETRY_IO_COUNT 8       /* maximum retry read IO count */
+#define DEFAULT_RETRY_IO_COUNT 8       /* maximum retry read IO or flush count */
 
 /* congestion wait timeout value, default: 20ms */
 #define        DEFAULT_IO_TIMEOUT      (msecs_to_jiffies(20))
@@ -575,6 +582,9 @@ struct extent_info {
        unsigned int fofs;              /* start offset in a file */
        unsigned int len;               /* length of the extent */
        u32 blk;                        /* start block address of the extent */
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+       unsigned int c_len;             /* physical extent length of compressed blocks */
+#endif
 };
 
 struct extent_node {
@@ -793,6 +803,9 @@ static inline void set_extent_info(struct extent_info *ei, unsigned int fofs,
        ei->fofs = fofs;
        ei->blk = blk;
        ei->len = len;
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+       ei->c_len = 0;
+#endif
 }
 
 static inline bool __is_discard_mergeable(struct discard_info *back,
@@ -817,6 +830,12 @@ static inline bool __is_discard_front_mergeable(struct discard_info *cur,
 static inline bool __is_extent_mergeable(struct extent_info *back,
                                                struct extent_info *front)
 {
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+       if (back->c_len && back->len != back->c_len)
+               return false;
+       if (front->c_len && front->len != front->c_len)
+               return false;
+#endif
        return (back->fofs + back->len == front->fofs &&
                        back->blk + back->len == front->blk);
 }
@@ -1252,6 +1271,7 @@ enum {
        GC_IDLE_AT,
        GC_URGENT_HIGH,
        GC_URGENT_LOW,
+       MAX_GC_MODE,
 };
 
 enum {
@@ -1297,6 +1317,12 @@ enum {
                                 */
 };
 
+enum {
+       DISCARD_UNIT_BLOCK,     /* basic discard unit is block */
+       DISCARD_UNIT_SEGMENT,   /* basic discard unit is segment */
+       DISCARD_UNIT_SECTION,   /* basic discard unit is section */
+};
+
 static inline int f2fs_test_bit(unsigned int nr, char *addr);
 static inline void f2fs_set_bit(unsigned int nr, char *addr);
 static inline void f2fs_clear_bit(unsigned int nr, char *addr);
@@ -1686,14 +1712,6 @@ struct f2fs_sb_info {
 #endif
        spinlock_t stat_lock;                   /* lock for stat operations */
 
-       /* For app/fs IO statistics */
-       spinlock_t iostat_lock;
-       unsigned long long rw_iostat[NR_IO_TYPE];
-       unsigned long long prev_rw_iostat[NR_IO_TYPE];
-       bool iostat_enable;
-       unsigned long iostat_next_period;
-       unsigned int iostat_period_ms;
-
        /* to attach REQ_META|REQ_FUA flags */
        unsigned int data_io_flag;
        unsigned int node_io_flag;
@@ -1732,6 +1750,12 @@ struct f2fs_sb_info {
        struct kmem_cache *inline_xattr_slab;   /* inline xattr entry */
        unsigned int inline_xattr_slab_size;    /* default inline xattr slab size */
 
+       /* For reclaimed segs statistics per each GC mode */
+       unsigned int gc_segment_mode;           /* GC state for reclaimed segments */
+       unsigned int gc_reclaimed_segs[MAX_GC_MODE];    /* Reclaimed segs for each mode */
+
+       unsigned long seq_file_ra_mul;          /* multiplier for ra_pages of seq. files in fadvise */
+
 #ifdef CONFIG_F2FS_FS_COMPRESSION
        struct kmem_cache *page_array_slab;     /* page array entry */
        unsigned int page_array_slab_size;      /* default page array slab size */
@@ -1747,6 +1771,20 @@ struct f2fs_sb_info {
        unsigned int compress_watermark;        /* cache page watermark */
        atomic_t compress_page_hit;             /* cache hit count */
 #endif
+
+#ifdef CONFIG_F2FS_IOSTAT
+       /* For app/fs IO statistics */
+       spinlock_t iostat_lock;
+       unsigned long long rw_iostat[NR_IO_TYPE];
+       unsigned long long prev_rw_iostat[NR_IO_TYPE];
+       bool iostat_enable;
+       unsigned long iostat_next_period;
+       unsigned int iostat_period_ms;
+
+       /* For io latency related statistics info in one iostat period */
+       spinlock_t iostat_lat_lock;
+       struct iostat_lat_info *iostat_io_lat;
+#endif
 };
 
 struct f2fs_private_dio {
@@ -2034,36 +2072,6 @@ static inline void clear_ckpt_flags(struct f2fs_sb_info *sbi, unsigned int f)
        spin_unlock_irqrestore(&sbi->cp_lock, flags);
 }
 
-static inline void disable_nat_bits(struct f2fs_sb_info *sbi, bool lock)
-{
-       unsigned long flags;
-       unsigned char *nat_bits;
-
-       /*
-        * In order to re-enable nat_bits we need to call fsck.f2fs by
-        * set_sbi_flag(sbi, SBI_NEED_FSCK). But it may give huge cost,
-        * so let's rely on regular fsck or unclean shutdown.
-        */
-
-       if (lock)
-               spin_lock_irqsave(&sbi->cp_lock, flags);
-       __clear_ckpt_flags(F2FS_CKPT(sbi), CP_NAT_BITS_FLAG);
-       nat_bits = NM_I(sbi)->nat_bits;
-       NM_I(sbi)->nat_bits = NULL;
-       if (lock)
-               spin_unlock_irqrestore(&sbi->cp_lock, flags);
-
-       kvfree(nat_bits);
-}
-
-static inline bool enabled_nat_bits(struct f2fs_sb_info *sbi,
-                                       struct cp_control *cpc)
-{
-       bool set = is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
-
-       return (cpc) ? (cpc->reason & CP_UMOUNT) && set : set;
-}
-
 static inline void f2fs_lock_op(struct f2fs_sb_info *sbi)
 {
        down_read(&sbi->cp_rwsem);
@@ -2587,7 +2595,7 @@ static inline struct kmem_cache *f2fs_kmem_cache_create(const char *name,
        return kmem_cache_create(name, size, 0, SLAB_RECLAIM_ACCOUNT, NULL);
 }
 
-static inline void *f2fs_kmem_cache_alloc(struct kmem_cache *cachep,
+static inline void *f2fs_kmem_cache_alloc_nofail(struct kmem_cache *cachep,
                                                gfp_t flags)
 {
        void *entry;
@@ -2598,6 +2606,20 @@ static inline void *f2fs_kmem_cache_alloc(struct kmem_cache *cachep,
        return entry;
 }
 
+static inline void *f2fs_kmem_cache_alloc(struct kmem_cache *cachep,
+                       gfp_t flags, bool nofail, struct f2fs_sb_info *sbi)
+{
+       if (nofail)
+               return f2fs_kmem_cache_alloc_nofail(cachep, flags);
+
+       if (time_to_inject(sbi, FAULT_SLAB_ALLOC)) {
+               f2fs_show_injection_info(sbi, FAULT_SLAB_ALLOC);
+               return NULL;
+       }
+
+       return kmem_cache_alloc(cachep, flags);
+}
+
 static inline bool is_inflight_io(struct f2fs_sb_info *sbi, int type)
 {
        if (get_pages(sbi, F2FS_RD_DATA) || get_pages(sbi, F2FS_RD_NODE) ||
@@ -3210,47 +3232,6 @@ static inline int get_inline_xattr_addrs(struct inode *inode)
                sizeof((f2fs_inode)->field))                    \
                <= (F2FS_OLD_ATTRIBUTE_SIZE + (extra_isize)))   \
 
-#define DEFAULT_IOSTAT_PERIOD_MS       3000
-#define MIN_IOSTAT_PERIOD_MS           100
-/* maximum period of iostat tracing is 1 day */
-#define MAX_IOSTAT_PERIOD_MS           8640000
-
-static inline void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
-{
-       int i;
-
-       spin_lock(&sbi->iostat_lock);
-       for (i = 0; i < NR_IO_TYPE; i++) {
-               sbi->rw_iostat[i] = 0;
-               sbi->prev_rw_iostat[i] = 0;
-       }
-       spin_unlock(&sbi->iostat_lock);
-}
-
-extern void f2fs_record_iostat(struct f2fs_sb_info *sbi);
-
-static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi,
-                       enum iostat_type type, unsigned long long io_bytes)
-{
-       if (!sbi->iostat_enable)
-               return;
-       spin_lock(&sbi->iostat_lock);
-       sbi->rw_iostat[type] += io_bytes;
-
-       if (type == APP_WRITE_IO || type == APP_DIRECT_IO)
-               sbi->rw_iostat[APP_BUFFERED_IO] =
-                       sbi->rw_iostat[APP_WRITE_IO] -
-                       sbi->rw_iostat[APP_DIRECT_IO];
-
-       if (type == APP_READ_IO || type == APP_DIRECT_READ_IO)
-               sbi->rw_iostat[APP_BUFFERED_READ_IO] =
-                       sbi->rw_iostat[APP_READ_IO] -
-                       sbi->rw_iostat[APP_DIRECT_READ_IO];
-       spin_unlock(&sbi->iostat_lock);
-
-       f2fs_record_iostat(sbi);
-}
-
 #define __is_large_section(sbi)                ((sbi)->segs_per_sec > 1)
 
 #define __is_meta_io(fio) (PAGE_TYPE_OF_BIO((fio)->type) == META)
@@ -3417,6 +3398,7 @@ int f2fs_truncate_inode_blocks(struct inode *inode, pgoff_t from);
 int f2fs_truncate_xattr_node(struct inode *inode);
 int f2fs_wait_on_node_pages_writeback(struct f2fs_sb_info *sbi,
                                        unsigned int seq_id);
+bool f2fs_nat_bitmap_enabled(struct f2fs_sb_info *sbi);
 int f2fs_remove_inode_page(struct inode *inode);
 struct page *f2fs_new_inode_page(struct inode *inode);
 struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs);
@@ -3441,6 +3423,7 @@ int f2fs_recover_xattr_data(struct inode *inode, struct page *page);
 int f2fs_recover_inode_page(struct f2fs_sb_info *sbi, struct page *page);
 int f2fs_restore_node_summary(struct f2fs_sb_info *sbi,
                        unsigned int segno, struct f2fs_summary_block *sum);
+void f2fs_enable_nat_bits(struct f2fs_sb_info *sbi);
 int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc);
 int f2fs_build_node_manager(struct f2fs_sb_info *sbi);
 void f2fs_destroy_node_manager(struct f2fs_sb_info *sbi);
@@ -3464,6 +3447,7 @@ int f2fs_flush_device_cache(struct f2fs_sb_info *sbi);
 void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free);
 void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr);
 bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr);
+int f2fs_start_discard_thread(struct f2fs_sb_info *sbi);
 void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi);
 void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi);
 bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi);
@@ -3986,6 +3970,9 @@ void f2fs_destroy_extent_cache(void);
 /*
  * sysfs.c
  */
+#define MIN_RA_MUL     2
+#define MAX_RA_MUL     256
+
 int __init f2fs_init_sysfs(void);
 void f2fs_exit_sysfs(void);
 int f2fs_register_sysfs(struct f2fs_sb_info *sbi);
@@ -4040,18 +4027,23 @@ void f2fs_end_read_compressed_page(struct page *page, bool failed,
                                                        block_t blkaddr);
 bool f2fs_cluster_is_empty(struct compress_ctx *cc);
 bool f2fs_cluster_can_merge_page(struct compress_ctx *cc, pgoff_t index);
+bool f2fs_sanity_check_cluster(struct dnode_of_data *dn);
 void f2fs_compress_ctx_add_page(struct compress_ctx *cc, struct page *page);
 int f2fs_write_multi_pages(struct compress_ctx *cc,
                                                int *submitted,
                                                struct writeback_control *wbc,
                                                enum iostat_type io_type);
 int f2fs_is_compressed_cluster(struct inode *inode, pgoff_t index);
+void f2fs_update_extent_tree_range_compressed(struct inode *inode,
+                               pgoff_t fofs, block_t blkaddr, unsigned int llen,
+                               unsigned int c_len);
 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 for_write);
 struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc);
 void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed);
 void f2fs_put_page_dic(struct page *page);
+unsigned int f2fs_cluster_blocks_are_contiguous(struct dnode_of_data *dn);
 int f2fs_init_compress_ctx(struct compress_ctx *cc);
 void f2fs_destroy_compress_ctx(struct compress_ctx *cc, bool reuse);
 void f2fs_init_compress_info(struct f2fs_sb_info *sbi);
@@ -4106,6 +4098,8 @@ static inline void f2fs_put_page_dic(struct page *page)
 {
        WARN_ON_ONCE(1);
 }
+static inline unsigned int f2fs_cluster_blocks_are_contiguous(struct dnode_of_data *dn) { return 0; }
+static inline bool f2fs_sanity_check_cluster(struct dnode_of_data *dn) { return false; }
 static inline int f2fs_init_compress_inode(struct f2fs_sb_info *sbi) { return 0; }
 static inline void f2fs_destroy_compress_inode(struct f2fs_sb_info *sbi) { }
 static inline int f2fs_init_page_array_cache(struct f2fs_sb_info *sbi) { return 0; }
@@ -4121,6 +4115,9 @@ static inline bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi,
 static inline void f2fs_invalidate_compress_pages(struct f2fs_sb_info *sbi,
                                                        nid_t ino) { }
 #define inc_compr_inode_stat(inode)            do { } while (0)
+static inline void f2fs_update_extent_tree_range_compressed(struct inode *inode,
+                               pgoff_t fofs, block_t blkaddr, unsigned int llen,
+                               unsigned int c_len) { }
 #endif
 
 static inline void set_compress_context(struct inode *inode)
@@ -4136,7 +4133,8 @@ static inline void set_compress_context(struct inode *inode)
                                1 << COMPRESS_CHKSUM : 0;
        F2FS_I(inode)->i_cluster_size =
                        1 << F2FS_I(inode)->i_log_cluster_size;
-       if (F2FS_I(inode)->i_compress_algorithm == COMPRESS_LZ4 &&
+       if ((F2FS_I(inode)->i_compress_algorithm == COMPRESS_LZ4 ||
+               F2FS_I(inode)->i_compress_algorithm == COMPRESS_ZSTD) &&
                        F2FS_OPTION(sbi).compress_level)
                F2FS_I(inode)->i_compress_flag |=
                                F2FS_OPTION(sbi).compress_level <<
@@ -4304,16 +4302,6 @@ static inline int block_unaligned_IO(struct inode *inode,
        return align & blocksize_mask;
 }
 
-static inline int allow_outplace_dio(struct inode *inode,
-                               struct kiocb *iocb, struct iov_iter *iter)
-{
-       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
-       int rw = iov_iter_rw(iter);
-
-       return (f2fs_lfs_mode(sbi) && (rw == WRITE) &&
-                               !block_unaligned_IO(inode, iocb, iter));
-}
-
 static inline bool f2fs_force_buffered_io(struct inode *inode,
                                struct kiocb *iocb, struct iov_iter *iter)
 {
@@ -4368,6 +4356,11 @@ static inline bool is_journalled_quota(struct f2fs_sb_info *sbi)
        return false;
 }
 
+static inline bool f2fs_block_unit_discard(struct f2fs_sb_info *sbi)
+{
+       return F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_BLOCK;
+}
+
 #define EFSBADCRC      EBADMSG         /* Bad CRC detected */
 #define EFSCORRUPTED   EUCLEAN         /* Filesystem is corrupted */