// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef F2FS_INTERNAL_H_
#define F2FS_INTERNAL_H_

#include <lib/zircon-internal/thread_annotations.h>

namespace f2fs {

class VnodeF2fs;

/*
 * 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
#define F2FS_MOUNT_XATTR_USER 0x00000010
#define F2FS_MOUNT_POSIX_ACL 0x00000020
#define F2FS_MOUNT_DISABLE_EXT_IDENTIFY 0x00000040

#define clear_opt(sbi, option) ((sbi)->mount_opt.opt &= ~F2FS_MOUNT_##option)
#define set_opt(sbi, option) ((sbi)->mount_opt.opt |= F2FS_MOUNT_##option)
#define test_opt(sbi, option) ((sbi)->mount_opt.opt & F2FS_MOUNT_##option)

struct f2fs_mount_info {
  unsigned int opt;
};

/*
 * For checkpoint manager
 */
enum { NAT_BITMAP, SIT_BITMAP };

/* for the list of orphan inodes */
struct orphan_inode_entry {
  list_node_t list; /* list head */
  nid_t ino;        /* inode number */
};

/* for the list of directory inodes */
struct dir_inode_entry {
  list_node_t list; /* list head */
  VnodeF2fs *vnode; /* vfs inode pointer */
};

/* for the list of fsync inodes, used only during recovery */
struct fsync_inode_entry {
  list_node_t list; /* list head */
  VnodeF2fs *vnode; /* vfs inode pointer */
  block_t blkaddr;  /* block address locating the last inode */
};

#define nats_in_cursum(sum) (le16_to_cpu(sum->n_nats))
#define sits_in_cursum(sum) (le16_to_cpu(sum->n_sits))

#define nat_in_journal(sum, i) (sum->nat_j.entries[i].ne)
#define nid_in_journal(sum, i) (sum->nat_j.entries[i].nid)
#define sit_in_journal(sum, i) (sum->sit_j.entries[i].se)
#define segno_in_journal(sum, i) (sum->sit_j.entries[i].segno)

static inline int update_nats_in_cursum(struct f2fs_summary_block *rs, int i) {
  int before = nats_in_cursum(rs);
  rs->n_nats = cpu_to_le16(before + i);
  return before;
}

static inline int update_sits_in_cursum(struct f2fs_summary_block *rs, int i) {
  int before = sits_in_cursum(rs);
  rs->n_sits = cpu_to_le16(before + i);
  return before;
}

/*
 * For INODE and NODE manager
 */
#define XATTR_NODE_OFFSET                       \
  (-1) /*                                       \
        * store xattrs to one node block per    \
        * file keeping -1 as its node offset to \
        * distinguish from index node blocks.   \
        */
#define RDONLY_NODE                                                  \
  1                         /*                                       \
                             * specify a read-only mode when getting \
                             * a node block. 0 is read-write mode.   \
                             * used by get_dnode_of_data().          \
                             */
#define F2FS_LINK_MAX 32000 /* maximum link count per file */

/* for in-memory extent cache entry */
struct extent_info {
  rwlock_t ext_lock; /* rwlock for consistency */
  unsigned int fofs; /* start offset in a file */
  uint32_t blk_addr; /* start block address of the extent */
  unsigned int len;  /* lenth of the extent */
};

/*
 * i_advise uses FADVISE_XXX_BIT. We can add additional hints later.
 */
#define FADVISE_COLD_BIT 0x01

struct f2fs_inode_info {
  // struct inode vfs_inode;		/* serve a vfs inode */
  unsigned long i_flags;        /* keep an inode flags for ioctl */
  unsigned char i_advise;       /* use to give file attribute hints */
  unsigned int i_current_depth; /* use only in directory structure */
  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 long data_version; /* lastes version of data for fsync */
  atomic_t dirty_dents;            /* # of dirty dentry pages */
  f2fs_hash_t chash;               /* hash value of given file name */
  unsigned int clevel;             /* maximum level of given file name */
  nid_t i_xattr_nid;               /* node id that contains xattrs */
  struct extent_info ext;          /* in-memory extent cache entry */
};

static inline void GetExtentInfo(struct extent_info *ext, struct f2fs_extent i_ext) {
  write_lock(&ext->ext_lock);
  ext->fofs = le32_to_cpu(i_ext.fofs);
  ext->blk_addr = le32_to_cpu(i_ext.blk_addr);
  ext->len = le32_to_cpu(i_ext.len);
  write_unlock(&ext->ext_lock);
}

static inline void set_raw_extent(struct extent_info *ext, struct f2fs_extent *i_ext) {
  read_lock(&ext->ext_lock);
  i_ext->fofs = cpu_to_le32(ext->fofs);
  i_ext->blk_addr = cpu_to_le32(ext->blk_addr);
  i_ext->len = cpu_to_le32(ext->len);
  read_unlock(&ext->ext_lock);
}

struct f2fs_nm_info {
  block_t nat_blkaddr; /* base disk address of NAT */
  nid_t max_nid;       /* maximum possible node ids */
  nid_t init_scan_nid; /* the first nid to be scanned */
  nid_t next_scan_nid; /* the next nid to be scanned */

  /* NAT cache management */
  struct radix_tree_root nat_root; /* root of the nat entry cache */
  rwlock_t nat_tree_lock;          /* protect nat_tree_lock */
  unsigned int nat_cnt;            /* the # of cached nat entries */
  list_node_t nat_entries;         /* cached nat entry list (clean) */
  list_node_t dirty_nat_entries;   /* cached nat entry list (dirty) */

  /* free node ids management */
  list_node_t free_nid_list;     /* a list for free nids */
  spinlock_t free_nid_list_lock; /* protect free nid list */
  unsigned int fcnt;             /* the number of free node id */
  mtx_t build_lock;              /* lock for build free nids */

  /* for checkpoint */
  char *nat_bitmap;      /* NAT bitmap pointer */
  char *nat_prev_bitmap; /* JY: NAT previous checkpoint bitmap pointer */
  int bitmap_size;       /* bitmap size */
};

/*
 * this structure is used as one of function parameters.
 * all the information are dedicated to a given direct node block determined
 * by the data offset in a file.
 */
struct dnode_of_data {
  // struct inode *inode;		/* vfs inode pointer */
  VnodeF2fs *vnode;
  struct Page *inode_page;  /* its inode page, NULL is possible */
  struct Page *node_page;   /* cached direct node page */
  nid_t nid;                /* node id of the direct node block */
  unsigned int ofs_in_node; /* data offset in the node page */
  bool inode_page_locked;   /* inode page is locked or not */
  block_t data_blkaddr;     /* block address of the node block */
};

static inline void SetNewDnode(dnode_of_data *dn, VnodeF2fs *vnode, Page *ipage, Page *npage,
                               nid_t nid) {
  dn->vnode = vnode;
  dn->inode_page = ipage;
  dn->node_page = npage;
  dn->nid = nid;
  dn->inode_page_locked = 0;
}

/*
 * For SIT manager
 *
 * By default, there are 6 active log areas across the whole main area.
 * When considering hot and cold data separation to reduce cleaning overhead,
 * we split 3 for data logs and 3 for node logs as hot, warm, and cold types,
 * respectively.
 * In the current design, you should not change the numbers intentionally.
 * Instead, as a mount option such as active_logs=x, you can use 2, 4, and 6
 * logs individually according to the underlying devices. (default: 6)
 * Just in case, on-disk layout covers maximum 16 logs that consist of 8 for
 * data and 8 for node logs.
 */
#define NR_CURSEG_DATA_TYPE (3)
#define NR_CURSEG_NODE_TYPE (3)
#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE)

enum {
  CURSEG_HOT_DATA = 0, /* directory entry blocks */
  CURSEG_WARM_DATA,    /* data blocks */
  CURSEG_COLD_DATA,    /* multimedia or GCed data blocks */
  CURSEG_HOT_NODE,     /* direct node blocks of directory files */
  CURSEG_WARM_NODE,    /* direct node blocks of normal files */
  CURSEG_COLD_NODE,    /* indirect node blocks */
  NO_CHECK_TYPE
};

struct f2fs_sm_info {
  struct sit_info *sit_info;             /* whole segment information */
  struct free_segmap_info *free_info;    /* free segment information */
  struct dirty_seglist_info *dirty_info; /* dirty segment information */
  struct curseg_info *curseg_array;      /* active segment information */

  list_node_t wblist_head; /* list of under-writeback pages */
  spinlock_t wblist_lock;  /* lock for checkpoint */

  block_t seg0_blkaddr; /* block address of 0'th segment */
  block_t main_blkaddr; /* start block address of main area */
  block_t ssa_blkaddr;  /* start block address of SSA area */

  unsigned int segment_count;     /* total # of segments */
  unsigned int main_segments;     /* # of segments in main area */
  unsigned int reserved_segments; /* # of reserved segments */
  unsigned int ovp_segments;      /* # of overprovision segments */
};

/*
 * For directory operation
 */
#define NODE_DIR1_BLOCK (ADDRS_PER_INODE + 1)
#define NODE_DIR2_BLOCK (ADDRS_PER_INODE + 2)
#define NODE_IND1_BLOCK (ADDRS_PER_INODE + 3)
#define NODE_IND2_BLOCK (ADDRS_PER_INODE + 4)
#define NODE_DIND_BLOCK (ADDRS_PER_INODE + 5)

/*
 * For superblock
 */
/*
 * COUNT_TYPE for monitoring
 *
 * f2fs monitors the number of several block types such as on-writeback,
 * dirty dentry blocks, dirty node blocks, and dirty meta blocks.
 */
enum count_type {
  F2FS_WRITEBACK,
  F2FS_DIRTY_DENTS,
  F2FS_DIRTY_NODES,
  F2FS_DIRTY_META,
  NR_COUNT_TYPE,
};

/*
 * FS_LOCK nesting subclasses for the lock validator:
 *
 * The locking order between these classes is
 * RENAME -> DENTRY_OPS -> DATA_WRITE -> DATA_NEW
 *    -> DATA_TRUNC -> NODE_WRITE -> NODE_NEW -> NODE_TRUNC
 */
enum lock_type {
  RENAME,     /* for renaming operations */
  DENTRY_OPS, /* for directory operations */
  DATA_WRITE, /* for data write */
  DATA_NEW,   /* for data allocation */
  DATA_TRUNC, /* for data truncate */
  NODE_NEW,   /* for node allocation */
  NODE_TRUNC, /* for node truncate */
  NODE_WRITE, /* for node write */
  NR_LOCK_TYPE,
};

/*
 * The below are the page types of bios used in submti_bio().
 * The available types are:
 * DATA			User data pages. It operates as async mode.
 * NODE			Node pages. It operates as async mode.
 * META			FS metadata pages such as SIT, NAT, CP.
 * NR_PAGE_TYPE		The number of page types.
 * META_FLUSH		Make sure the previous pages are written
 *			with waiting the bio's completion
 * ...			Only can be used with META.
 */
enum page_type {
  DATA,
  NODE,
  META,
  NR_PAGE_TYPE,
  META_FLUSH,
};

struct f2fs_sb_info {
  // struct super_block *sb;			/* pointer to VFS super block */
  // struct buffer_head *raw_super_buf;	/* buffer head of raw sb */
  const f2fs_super_block *raw_super; /* raw super block pointer */
  int s_dirty;                       /* dirty flag for checkpoint */

  /* for node-related operations */
  struct f2fs_nm_info *nm_info; /* node manager */
  // struct inode *node_inode;		/* cache node blocks */
  fbl::RefPtr<VnodeF2fs> node_vnode;

  /* for segment-related operations */
  struct f2fs_sm_info *sm_info;             /* segment manager */
  struct bio *bio[NR_PAGE_TYPE];            /* bios to merge */
  sector_t last_block_in_bio[NR_PAGE_TYPE]; /* last block number */
  // struct rw_semaphore bio_sem;		/* IO semaphore */

  /* for checkpoint */
  struct f2fs_checkpoint *ckpt; /* raw checkpoint pointer */
  // struct inode *meta_inode;		/* cache meta blocks */
  fbl::RefPtr<VnodeF2fs> meta_vnode;
  mtx_t cp_mutex;              /* for checkpoint procedure */
  mtx_t fs_lock[NR_LOCK_TYPE]; /* for blocking FS operations */
  mtx_t write_inode;           /* mutex for write inode */
  mtx_t writepages;            /* mutex for writepages() */
  int por_doing;               /* recovery is doing or not */

  /* for orphan inode management */
  list_node_t orphan_inode_list; /* orphan inode list */
  mtx_t orphan_inode_mutex;      /* for orphan inode list */
  unsigned int n_orphans;        /* # of orphan inodes */

  /* for directory inode management */
  list_node_t dir_inode_list; /* dir inode list */
  spinlock_t dir_inode_lock;  /* for dir inode list lock */
  unsigned int n_dirty_dirs;  /* # of dir inodes */

  /* basic file system units */
  unsigned int log_sectors_per_block;   /* log2 sectors per block */
  unsigned int log_blocksize;           /* log2 block size */
  unsigned int blocksize;               /* block size */
  unsigned int root_ino_num;            /* root inode number*/
  unsigned int node_ino_num;            /* node inode number*/
  unsigned int meta_ino_num;            /* meta inode number*/
  unsigned int log_blocks_per_seg;      /* log2 blocks per segment */
  unsigned int blocks_per_seg;          /* blocks per segment */
  unsigned int segs_per_sec;            /* segments per section */
  unsigned int secs_per_zone;           /* sections per zone */
  unsigned int total_sections;          /* total section count */
  unsigned int total_node_count;        /* total node block count */
  unsigned int total_valid_node_count;  /* valid node block count */
  unsigned int total_valid_inode_count; /* valid inode count */
  int active_logs;                      /* # of active logs */

  block_t user_block_count;         /* # of user blocks */
  block_t total_valid_block_count;  /* # of valid blocks */
  block_t alloc_valid_block_count;  /* # of allocated blocks */
  block_t last_valid_block_count;   /* for recovery */
  uint32_t s_next_generation;       /* for NFS support */
  atomic_t nr_pages[NR_COUNT_TYPE]; /* # of pages, see count_type */

  struct f2fs_mount_info mount_opt; /* mount options */

  /* for cleaning operations */
  mtx_t gc_mutex;                    /* mutex for GC */
  struct f2fs_gc_kthread *gc_thread; /* GC thread */

  /*
   * for stat information.
   * one is for the LFS mode, and the other is for the SSR mode.
   */
  struct f2fs_stat_info *stat_info; /* FS status information */
  unsigned int segment_count[2];    /* # of allocated segments */
  unsigned int block_count[2];      /* # of allocated blocks */
  unsigned int last_victim[2];      /* last victim segment # */
  int total_hit_ext, read_hit_ext;  /* extent cache hit ratio */
  int bg_gc;                        /* background gc calls */
  spinlock_t stat_lock;             /* lock for stat operations */
};

/*
 * Inline functions
 */
// static inline struct f2fs_inode_info *F2FS_I(VnodeF2fs *vnode)
// {
//   // TODO: IMPL
// 	//return container_of(inode, f2fs_inode_info, vfs_inode);
//   return &vnode->fi;
// }

// static inline struct f2fs_sb_info *F2FS_SB(struct super_block *sb)
//{
//  return (struct f2fs_sb_info *)sb->s_fs_info;
//}

static inline struct f2fs_super_block *F2FS_RAW_SUPER(struct f2fs_sb_info *sbi) {
  return (struct f2fs_super_block *)(sbi->raw_super);
}

static inline struct f2fs_checkpoint *F2FS_CKPT(struct f2fs_sb_info *sbi) {
  return (struct f2fs_checkpoint *)(sbi->ckpt);
}

static inline struct f2fs_nm_info *NM_I(struct f2fs_sb_info *sbi) {
  return (struct f2fs_nm_info *)(sbi->nm_info);
}

static inline struct f2fs_sm_info *SM_I(struct f2fs_sb_info *sbi) {
  return (struct f2fs_sm_info *)(sbi->sm_info);
}

static inline struct sit_info *SIT_I(struct f2fs_sb_info *sbi) {
  return (struct sit_info *)(SM_I(sbi)->sit_info);
}

static inline struct free_segmap_info *FREE_I(struct f2fs_sb_info *sbi) {
  return (struct free_segmap_info *)(SM_I(sbi)->free_info);
}

static inline struct dirty_seglist_info *DIRTY_I(struct f2fs_sb_info *sbi) {
  return (struct dirty_seglist_info *)(SM_I(sbi)->dirty_info);
}

static inline void F2FS_SET_SB_DIRT(struct f2fs_sb_info *sbi) { sbi->s_dirty = 1; }

static inline void F2FS_RESET_SB_DIRT(struct f2fs_sb_info *sbi) { sbi->s_dirty = 0; }

static inline void mutex_lock_op(struct f2fs_sb_info *sbi, enum lock_type t)
    TA_ACQ(&sbi->fs_lock[t]) {
  // TODO: IMPL
  // mutex_lock_nested(&sbi->fs_lock[t], t);
  mtx_lock(&sbi->fs_lock[t]);
}

static inline void mutex_unlock_op(struct f2fs_sb_info *sbi, enum lock_type t)
    TA_REL(&sbi->fs_lock[t]) {
  mtx_unlock(&sbi->fs_lock[t]);
}

/*
 * Check whether the given nid is within node id range.
 */
static inline void CheckNidRange(struct f2fs_sb_info *sbi, nid_t nid) {
  // TODO: IMPL
  // BUG_ON((nid >= NM_I(sbi)->max_nid));
}

#define F2FS_DEFAULT_ALLOCATED_BLOCKS 1

/*
 * Check whether the inode has blocks or not
 */
// [[maybe_unused]]
// static inline int F2FS_HAS_BLOCKS(struct inode *inode)
// {
// 	if (F2FS_I(inode)->i_xattr_nid)
// 		return (inode->i_blocks > F2FS_DEFAULT_ALLOCATED_BLOCKS + 1);
// 	else
// 		return (inode->i_blocks > F2FS_DEFAULT_ALLOCATED_BLOCKS);
// }
static inline int F2FS_HAS_BLOCKS(void *vnode) { return 1; }

// [[maybe_unused]]
// static inline bool inc_valid_block_count(struct f2fs_sb_info *sbi,
// 				 struct inode *inode, blkcnt_t count)
// {
// 	block_t	valid_block_count;

//   //TODO: IMPL
// 	//spin_lock(&sbi->stat_lock);
// 	valid_block_count =
// 		sbi->total_valid_block_count + (block_t)count;
// 	if (valid_block_count > sbi->user_block_count) {
//     //TODO: IMPL
// 		//spin_unlock(&sbi->stat_lock);
// 		return false;
// 	}
// 	inode->i_blocks += count;
// 	sbi->total_valid_block_count = valid_block_count;
// 	sbi->alloc_valid_block_count += (block_t)count;
//   //TODO: IMPL
// 	//spin_unlock(&sbi->stat_lock);
// 	return true;
// }

static inline int dec_valid_block_count(struct f2fs_sb_info *sbi, void *vnode, blkcnt_t count) {
  spin_lock(&sbi->stat_lock);
  // BUG_ON(sbi->total_valid_block_count < (block_t) count);
  // BUG_ON(inode->i_blocks < count);
  // inode->i_blocks -= count;
  sbi->total_valid_block_count -= (block_t)count;
  spin_unlock(&sbi->stat_lock);
  return 0;
}

[[maybe_unused]] static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type) {
  // TODO: IMPL
  // atomic_inc(&sbi->nr_pages[count_type]);
  F2FS_SET_SB_DIRT(sbi);
}

static inline void InodeIncDirtyDents(VnodeF2fs *vnode) {
  //   //TODO: IMPL
  // 	//atomic_inc(&F2FS_I(inode)->dirty_dents);
}

static inline void DecPageCount(struct f2fs_sb_info *sbi, int count_type) {
  // TODO: IMPL
  // atomic_dec(&sbi->nr_pages[count_type]);
}

static inline void InodeDecDirtyDents(void *vnode) {
  //   //TODO: IMPL
  // 	//atomic_dec(&F2FS_I(inode)->dirty_dents);
}

static inline int get_pages(struct f2fs_sb_info *sbi, int count_type) {
  // TODO: IMPL
  // return atomic_read(&sbi->nr_pages[count_type]);
  return 0;
}

static inline block_t valid_user_blocks(struct f2fs_sb_info *sbi) {
  block_t ret;
  spin_lock(&sbi->stat_lock);
  ret = sbi->total_valid_block_count;
  spin_unlock(&sbi->stat_lock);
  return ret;
}

static inline unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag) {
  struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);

  /* return NAT or SIT bitmap */
  if (flag == NAT_BITMAP)
    return le32_to_cpu(ckpt->nat_ver_bitmap_bytesize);
  else if (flag == SIT_BITMAP)
    return le32_to_cpu(ckpt->sit_ver_bitmap_bytesize);

  return 0;
}

static inline void *__bitmap_ptr(struct f2fs_sb_info *sbi, int flag) {
  struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
  int offset = (flag == NAT_BITMAP) ? ckpt->sit_ver_bitmap_bytesize : 0;
  return &ckpt->sit_nat_version_bitmap + offset;
}

static inline block_t __start_cp_addr(struct f2fs_sb_info *sbi) {
  block_t start_addr;
  struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
  unsigned long long ckpt_version = le64_to_cpu(ckpt->checkpoint_ver);

  start_addr = le64_to_cpu(F2FS_RAW_SUPER(sbi)->cp_blkaddr);

  /*
   * odd numbered checkpoint should at cp segment 0
   * and even segent must be at cp segment 1
   */
  if (!(ckpt_version & 1))
    start_addr += sbi->blocks_per_seg;

  return start_addr;
}

[[maybe_unused]] static inline block_t __start_sum_addr(struct f2fs_sb_info *sbi) {
  return le32_to_cpu(F2FS_CKPT(sbi)->cp_pack_start_sum);
}

[[maybe_unused]] static inline unsigned int valid_node_count(struct f2fs_sb_info *sbi) {
  unsigned int ret;
  spin_lock(&sbi->stat_lock);
  ret = sbi->total_valid_node_count;
  spin_unlock(&sbi->stat_lock);
  return ret;
}

static inline void inc_valid_inode_count(struct f2fs_sb_info *sbi) {
  spin_lock(&sbi->stat_lock);
  // TODO: IMPL
  // BUG_ON(sbi->total_valid_inode_count == sbi->total_node_count);
  sbi->total_valid_inode_count++;
  spin_unlock(&sbi->stat_lock);
}

[[maybe_unused]] static inline int dec_valid_inode_count(struct f2fs_sb_info *sbi) {
  spin_lock(&sbi->stat_lock);
  // TODO: IMPL
  // BUG_ON(!sbi->total_valid_inode_count);
  sbi->total_valid_inode_count--;
  spin_unlock(&sbi->stat_lock);
  return 0;
}

[[maybe_unused]] static inline unsigned int valid_inode_count(struct f2fs_sb_info *sbi) {
  unsigned int ret;
  spin_lock(&sbi->stat_lock);
  ret = sbi->total_valid_inode_count;
  spin_unlock(&sbi->stat_lock);
  return ret;
}

inline void F2fsPutPage(struct Page *page, int unlock) {
  if (page != nullptr)
    delete page;
}

static inline void F2fsPutDnode(struct dnode_of_data *dn) {
  // TODO: IMPL
  if (dn->node_page)
    F2fsPutPage(dn->node_page, 1);
  if (dn->inode_page && dn->node_page != dn->inode_page)
    F2fsPutPage(dn->inode_page, 0);
  dn->node_page = NULL;
  dn->inode_page = NULL;
}

[[maybe_unused]] static inline struct kmem_cache *f2fs_kmem_cache_create(const char *name,
                                                                         size_t size,
                                                                         void (*ctor)(void *)) {
  return nullptr;
}

#define RAW_IS_INODE(p) ((p)->footer.nid == (p)->footer.ino)

static inline bool IS_INODE(struct Page *page) {
  struct f2fs_node *p = (struct f2fs_node *)page_address(page);
  return RAW_IS_INODE(p);
}

static inline __le32 *blkaddr_in_node(struct f2fs_node *node) {
  return RAW_IS_INODE(node) ? node->i.i_addr : node->dn.addr;
}

static inline block_t datablock_addr(Page *node_page, unsigned int offset) {
  struct f2fs_node *raw_node;
  __le32 *addr_array;
  raw_node = (struct f2fs_node *)page_address(node_page);
  addr_array = blkaddr_in_node(raw_node);
  return le32_to_cpu(addr_array[offset]);
}

static inline int f2fs_test_bit(unsigned int nr, char *addr) {
  int mask;

  addr += (nr >> 3);
  mask = 1 << (7 - (nr & 0x07));
  return mask & *addr;
}

static inline int f2fs_set_bit(unsigned int nr, char *addr) {
  int mask;
  int ret;

  addr += (nr >> 3);
  mask = 1 << (7 - (nr & 0x07));
  ret = mask & *addr;
  *addr |= mask;
  return ret;
}

static inline int f2fs_clear_bit(unsigned int nr, char *addr) {
  int mask;
  int ret;

  addr += (nr >> 3);
  mask = 1 << (7 - (nr & 0x07));
  ret = mask & *addr;
  *addr &= ~mask;
  return ret;
}

/* used for f2fs_inode_info->flags */
enum {
  FI_NEW_INODE, /* indicate newly allocated inode */
  FI_NEED_CP,   /* need to do checkpoint during fsync */
  FI_INC_LINK,  /* need to increment i_nlink */
  FI_ACL_MODE,  /* indicate acl mode */
  FI_NO_ALLOC,  /* should not allocate any blocks */
};

static inline void SetInodeFlag(struct f2fs_inode_info *fi, int flag) { set_bit(flag, &fi->flags); }

static inline int is_inode_flag_set(struct f2fs_inode_info *fi, int flag) {
  return test_bit(flag, &fi->flags);
}

static inline void clear_inode_flag(struct f2fs_inode_info *fi, int flag) {
  clear_bit(flag, &fi->flags);
}

[[maybe_unused]] static inline void set_acl_inode(struct f2fs_inode_info *fi, umode_t mode) {
  fi->i_acl_mode = mode;
  SetInodeFlag(fi, FI_ACL_MODE);
}

[[maybe_unused]] static inline int cond_clear_inode_flag(struct f2fs_inode_info *fi, int flag) {
  if (is_inode_flag_set(fi, FI_ACL_MODE)) {
    clear_inode_flag(fi, FI_ACL_MODE);
    return 1;
  }
  return 0;
}

/*
 * gc.c
 */
int start_gc_thread(struct f2fs_sb_info *);
void stop_gc_thread(struct f2fs_sb_info *);
block_t start_bidx_of_node(unsigned int);
int f2fs_gc(struct f2fs_sb_info *, int);
void build_gc_manager(struct f2fs_sb_info *);
int create_gc_caches(void);
void destroy_gc_caches(void);

/*
 * debug.c
 */
#ifdef CONFIG_F2FS_STAT_FS
struct f2fs_stat_info {
  list_node_t stat_list;
  struct f2fs_sb_info *sbi;
  mtx_t stat_lock;
  int all_area_segs, sit_area_segs, nat_area_segs, ssa_area_segs;
  int main_area_segs, main_area_sections, main_area_zones;
  int hit_ext, total_ext;
  int ndirty_node, ndirty_dent, ndirty_dirs, ndirty_meta;
  int nats, sits, fnids;
  int total_count, utilization;
  int bg_gc;
  unsigned int valid_count, valid_node_count, valid_inode_count;
  unsigned int bimodal, avg_vblocks;
  int util_free, util_valid, util_invalid;
  int rsvd_segs, overp_segs;
  int dirty_count, node_pages, meta_pages;
  int prefree_count, call_count;
  int tot_segs, node_segs, data_segs, free_segs, free_secs;
  int tot_blks, data_blks, node_blks;
  int curseg[NR_CURSEG_TYPE];
  int cursec[NR_CURSEG_TYPE];
  int curzone[NR_CURSEG_TYPE];

  unsigned int segment_count[2];
  unsigned int block_count[2];
  unsigned base_mem, cache_mem;
};

#define stat_inc_call_count(si) ((si)->call_count++)

#define stat_inc_seg_count(sbi, type)           \
  do {                                          \
    struct f2fs_stat_info *si = sbi->stat_info; \
    (si)->tot_segs++;                           \
    if (type == SUM_TYPE_DATA)                  \
      si->data_segs++;                          \
    else                                        \
      si->node_segs++;                          \
  } while (0)

#define stat_inc_tot_blk_count(si, blks) (si->tot_blks += (blks))

#define stat_inc_data_blk_count(sbi, blks)      \
  do {                                          \
    struct f2fs_stat_info *si = sbi->stat_info; \
    stat_inc_tot_blk_count(si, blks);           \
    si->data_blks += (blks);                    \
  } while (0)

#define stat_inc_node_blk_count(sbi, blks)      \
  do {                                          \
    struct f2fs_stat_info *si = sbi->stat_info; \
    stat_inc_tot_blk_count(si, blks);           \
    si->node_blks += (blks);                    \
  } while (0)

int f2fs_build_stats(struct f2fs_sb_info *);
void f2fs_destroy_stats(struct f2fs_sb_info *);
void destroy_root_stats(void);
#else
#define stat_inc_call_count(si)
#define stat_inc_seg_count(si, type)
#define stat_inc_tot_blk_count(si, blks)
#define stat_inc_data_blk_count(si, blks)
#define stat_inc_node_blk_count(sbi, blks)

static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) {}
[[maybe_unused]] static inline void destroy_root_stats(void) {}
#endif

}  // namespace f2fs

#endif
