block_t
static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr,
block_t cp_addr, unsigned long long *version)
block_t cp_blk_no;
void *src, block_t blk_addr)
block_t start_blk;
block_t blk;
static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr,
block_t blkaddr, int type)
block_t blkaddr, int type)
block_t blkaddr, int type)
int f2fs_ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages,
block_t blkno = start;
block_t start_blk, orphan_blocks, i, j;
static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
block_t blkaddr;
block_t first_blkaddr = data_blkaddr(dn->inode, dn->node_folio,
block_t blkaddr = data_blkaddr(dn->inode, dn->node_folio,
block_t blkaddr, unsigned int len)
struct folio *folio, nid_t ino, block_t blkaddr)
block_t blkaddr)
struct folio *folio, nid_t ino, block_t blkaddr);
block_t blkaddr, bool in_task)
block_t blkaddr = data_blkaddr(dn->inode, dn->node_folio,
block_t blkaddr = data_blkaddr(dn->inode, dn->node_folio,
struct fsverity_info *vi, block_t blkaddr,
struct folio *folio, block_t blkaddr,
static void __set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
void f2fs_set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr)
block_t blkaddr = f2fs_data_blkaddr(dn);
block_t fs_blkaddr;
block_t old_blkaddr;
block_t blkaddr, int flag, int bidx,
block_t blkaddr;
block_t blk_addr = map->m_pblk;
block_t last_lblk;
block_t blkaddr;
block_t blkaddr;
block_t blkaddr = ctx->fs_blkaddr;
block_t *blk_addr, bool *node_changed)
block_t *blk_addr)
block_t *blk_addr, bool *node_changed)
block_t *blk_addr, bool *node_changed, bool *use_cow)
block_t ori_blk_addr = NULL_ADDR;
block_t blkaddr = NULL_ADDR;
static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk,
block_t blk_addr, sector_t *sector)
block_t cur_lblock;
block_t last_lblock;
block_t pblock;
block_t lowest_pblock = -1;
block_t highest_pblock = 0;
int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr)
block_t last_blkaddr, block_t cur_blkaddr)
block_t last_blkaddr,
block_t cur_blkaddr)
static bool is_end_zone_blkaddr(struct f2fs_sb_info *sbi, block_t blkaddr)
block_t start_blk, end_blk;
block_t *blkaddr)
pgoff_t fofs, block_t blkaddr, unsigned int len)
block_t blk, bool keep_clen,
pgoff_t fofs, block_t blkaddr, unsigned int llen,
block_t blkaddr)
block_t nat_blkaddr; /* base disk address of NAT */
block_t data_blkaddr; /* block address of the node block */
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 */
block_t new_blkaddr; /* new block address to be written */
block_t old_blkaddr; /* old block address before Cow */
block_t start_blk;
block_t end_blk;
block_t user_block_count; /* # of user blocks */
block_t total_valid_block_count; /* # of valid blocks */
block_t discard_blks; /* discard command candidats */
block_t last_valid_block_count; /* for recovery */
block_t reserved_blocks; /* configurable reserved blocks */
block_t current_reserved_blocks; /* current reserved blocks */
block_t unusable_block_count; /* # of blocks saved by last cp */
block_t root_reserved_blocks; /* root reserved blocks */
block_t root_reserved_nodes; /* root reserved nodes */
block_t unusable_cap_perc; /* percentage for cap */
block_t unusable_cap; /* Amount of space allowed to be
block_t xattr_block = F2FS_I(inode)->i_xattr_nid ? 1 : 0;
block_t avail_user_block_count;
static inline void f2fs_i_blocks_write(struct inode *, block_t, bool, bool);
block_t avail_user_block_count;
sbi->total_valid_block_count += (block_t)(*count);
block_t count)
static inline block_t valid_user_blocks(struct f2fs_sb_info *sbi)
static inline block_t discard_blocks(struct f2fs_sb_info *sbi)
static inline block_t __cp_payload(struct f2fs_sb_info *sbi)
static inline block_t __start_cp_addr(struct f2fs_sb_info *sbi)
block_t start_addr = le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_blkaddr);
static inline block_t __start_cp_next_addr(struct f2fs_sb_info *sbi)
block_t start_addr = le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_blkaddr);
static inline block_t __start_sum_addr(struct f2fs_sb_info *sbi)
block_t valid_block_count;
static inline block_t data_blkaddr(struct inode *inode,
static inline block_t f2fs_data_blkaddr(struct dnode_of_data *dn)
block_t diff, bool add, bool claim)
block_t blkaddr, int type);
block_t blkaddr, int type)
static inline bool __is_valid_data_blkaddr(block_t blkaddr)
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);
block_t f2fs_get_unusable_blocks(struct f2fs_sb_info *sbi);
int f2fs_disable_cp_again(struct f2fs_sb_info *sbi, block_t unusable);
block_t blk_addr);
block_t old_blkaddr, block_t new_blkaddr,
block_t old_addr, block_t new_addr,
block_t old_blkaddr, block_t *new_blkaddr,
block_t blkaddr, unsigned int blkcnt);
void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr);
void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
block_t len);
void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk);
block_t blkaddr, int type);
block_t blkaddr, int type);
int f2fs_ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages,
block_t blk_addr, sector_t *sector);
int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr);
void f2fs_set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr);
void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr);
block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode);
block_t start_blkaddr; /* start blockaddr of current segment */
block_t *blkaddr);
pgoff_t fofs, block_t blkaddr, unsigned int len);
block_t blkaddr, bool in_task);
block_t lstart; /* logical start address */
block_t len; /* length */
pgoff_t fofs, block_t blkaddr,
block_t start; /* actual start address in dev */
block_t blkaddr, unsigned int len);
block_t blkaddr);
bool failed, block_t blkaddr, bool in_task)
block_t blkaddr, unsigned int len) { }
struct folio *folio, block_t blkaddr) { return false; }
pgoff_t fofs, block_t blkaddr,
block_t blkaddr)
block_t blkaddr)
block_t blkaddr, unsigned int cnt)
block_t blkaddr, unsigned int len)
block_t blkaddr; /* block address locating the last fsync */
block_t last_dentry; /* block address locating the last dentry */
block_t blk;
block_t m_pblk;
block_t m_lblk;
static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
static int __roll_back_blkaddrs(struct inode *inode, block_t *blkaddr,
block_t *blkaddr, int *do_replace,
block_t *src_blkaddr;
array_size(olen, sizeof(block_t)),
block_t expanded = 0;
block_t sec_blks = CAP_BLKS_PER_SEC(sbi);
block_t sec_len = roundup(map.m_len, sec_blks);
block_t blk_end = 0;
block_t blkaddr;
block_t blkaddr;
pgoff_t off, block_t block, block_t len, u32 flags)
block_t prev_block = 0, len = 0;
block_t blkaddr = f2fs_data_blkaddr(dn);
block_t blkaddr = f2fs_data_blkaddr(&dn);
block_t first_blkaddr = data_blkaddr(dn->inode, dn->node_folio,
block_t blkaddr;
block_t blkstart;
block_t blkaddr = le32_to_cpu(*addr);
block_t start_addr;
block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode)
struct node_info *dni, block_t blkaddr, unsigned int *nofs)
block_t source_blkaddr;
static int move_data_block(struct inode *inode, block_t bidx,
block_t newaddr;
static int move_data_page(struct inode *inode, block_t bidx, int gc_type,
block_t start_addr;
block_t start_bidx;
block_t free_seg_blks = 0;
static inline block_t free_segs_blk_count(struct f2fs_sb_info *sbi)
static inline block_t free_user_blocks(struct f2fs_sb_info *sbi)
block_t free_blks, ovp_blks;
static inline block_t limit_invalid_user_blocks(block_t user_block_count)
static inline block_t limit_free_user_blocks(block_t reclaimable_user_blocks)
block_t user_block_count = sbi->user_block_count;
block_t invalid_user_blocks = user_block_count -
static inline block_t free_segs_blk_count_zoned(struct f2fs_sb_info *sbi)
block_t blk_addr;
block_t addr;
block_t addr;
block_t nat_bits_addr;
block_t new_blkaddr, bool fsync_done)
block_t blkaddr;
static inline block_t next_blkaddr_of_node(const struct folio *node_folio)
static inline void fill_node_footer_blkaddr(struct folio *folio, block_t blkaddr)
block_t blk_addr; /* block address of the node */
static int sanity_check_node_chain(struct f2fs_sb_info *sbi, block_t blkaddr,
block_t *blkaddr_fast, bool *is_detecting)
block_t blkaddr, blkaddr_fast;
block_t blkaddr, struct dnode_of_data *dn)
block_t bidx;
block_t src, dest;
block_t blkaddr;
block_t blkaddr)
block_t blkaddr,
block_t start, block_t end)
block_t blk = start;
struct block_device *bdev, block_t lstart,
block_t start, block_t len);
block_t lstart, start, len, total_len;
struct block_device *bdev, block_t lstart,
block_t start, block_t len)
struct discard_cmd *dc, block_t blkaddr)
struct block_device *bdev, block_t lstart,
block_t start, block_t len)
block_t end = lstart + len;
struct block_device *bdev, block_t blkstart, block_t lblkstart,
block_t blklen)
struct block_device *bdev, block_t blkstart, block_t blklen)
block_t lblkstart = blkstart;
block_t start, block_t end)
static void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr)
struct block_device *bdev, block_t blkstart, block_t blklen)
block_t lblkstart = blkstart;
struct block_device *bdev, block_t blkstart, block_t blklen)
block_t blkstart, block_t blklen)
block_t i;
block_t new_addr, block_t *old_addr, bool recover)
block_t blkaddr)
static void update_segment_mtime(struct f2fs_sb_info *sbi, block_t blkaddr,
unsigned int segno, block_t blkaddr, unsigned int offset, int del)
unsigned int segno, block_t blkaddr, unsigned int offset, int del)
static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr,
block_t addr_start = addr, addr_end = addr + len - 1;
bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr)
void *src, block_t blk_addr)
int type, block_t blk_addr)
int segno, block_t start)
block_t blkaddr;
block_t start_block, end_block;
block_t old_blkaddr, block_t *new_blkaddr,
block_t blkaddr, unsigned int blkcnt)
block_t old_blkaddr, block_t new_blkaddr,
block_t old_addr, block_t new_addr,
void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr)
void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
block_t len)
block_t i;
block_t start;
block_t blk_addr = 0;
static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
block_t blkaddr, int type)
void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
block_t sit_valid_blocks[2] = {0, 0};
block_t valid_blocks, usable_blks_in_seg;
block_t zone_block, valid_block_cnt;
block_t zone_blkaddr)
block_t cs_zone_block, wp_block;
block_t seg_start, sec_start_blkaddr, sec_cap_blkaddr;
block_t valid_blocks =
block_t valid_blocks;
block_t f2fs_get_unusable_blocks(struct f2fs_sb_info *sbi)
block_t ovp_holes = SEGS_TO_BLKS(sbi, ovp_hole_segs);
block_t holes[2] = {0, 0}; /* DATA and NODE */
block_t unusable;
int f2fs_disable_cp_again(struct f2fs_sb_info *sbi, block_t unusable)
struct block_device *bdev, block_t lstart,
block_t start, block_t len)
block_t old_addr; /* for revoking when fail to commit */
block_t sit_base_addr; /* start block address of SIT area */
block_t sit_blocks; /* # of blocks used by SIT area */
block_t written_valid_blocks; /* # of valid blocks in main area */
static inline block_t written_block_count(struct f2fs_sb_info *sbi)
block_t blk_addr = sit_i->sit_base_addr + offset;
static inline block_t start_sum_block(struct f2fs_sb_info *sbi)
static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
block_t total_count, user_block_count, start_count;
block_t unusable;
block_t segment_count, segs_per_sec, secs_per_zone, segment_count_main;
block_t total_sections, blocks_per_seg;
block_t dev_seg_count = le32_to_cpu(RDEV(0).total_segments);
block_t user_block_count, valid_user_blocks;
block_t avail_node_count, valid_node_count;
block_t unusable_blocks = (zone->len - zone->capacity) >>
block_t block_limit = min((sbi->user_block_count >> 3),
block_t node_limit = sbi->total_node_count >> 3;
block_t unusable;
static inline void add_chain(Indirect *p, struct buffer_head *bh, block_t *v)
static inline int all_zeroes(block_t *p, block_t *q)
block_t *top)
for (p=partial;p>chain && all_zeroes((block_t*)p->bh->b_data,p->p);p--)
static inline block_t *block_end(struct buffer_head *bh)
static inline void free_data(struct inode *inode, block_t *p, block_t *q)
return (block_t *)((char*)bh->b_data + bh->b_size);
static void free_branches(struct inode *inode, block_t *p, block_t *q, int depth)
free_branches(inode, (block_t*)bh->b_data,
block_t *idata = i_data(inode);
block_t nr = 0;
blocks += sb->s_blocksize/sizeof(block_t) - 1;
blocks /= sb->s_blocksize/sizeof(block_t);
block_t *p;
add_chain(++p, bh, (block_t *)bh->b_data + *++offsets);
block_t key;
branch[n].p = (block_t*) bh->b_data + offsets[n];
static inline unsigned long block_to_cpu(block_t n)
static inline block_t cpu_to_block(unsigned long n)
static inline block_t *i_data(struct inode *inode)
return (block_t *)minix_i(inode)->u.i1_data;
static inline block_t cpu_to_block(unsigned long n)
static inline block_t *i_data(struct inode *inode)
return (block_t *)minix_i(inode)->u.i2_data;
static inline unsigned long block_to_cpu(block_t n)
#define NULL_ADDR ((block_t)0) /* used as block_t addresses */
#define NEW_ADDR ((block_t)-1) /* used as block_t addresses */
#define COMPRESS_ADDR ((block_t)-2) /* used as compressed data flag */
__field(block_t, old_blkaddr)
__field(block_t, new_blkaddr)
block_t old_addr, block_t new_addr, bool recovery),
__field(block_t, old_addr)
__field(block_t, new_addr)
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
__field(block_t, blkstart)
__field(block_t, blklen)
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
TP_PROTO(struct block_device *dev, block_t blkstart),
__field(block_t, blkstart)
TP_PROTO(struct block_device *dev, block_t blkstart),
TP_PROTO(struct block_device *dev, block_t blkstart),
block_t blkaddr,
TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
__field(block_t, blk_addr)
TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
__field(block_t, m_lblk)
__field(block_t, m_pblk)