Android-cuttlefish cvd tool
Classes | Macros | Enumerations | Functions | Variables
f2fs.h File Reference
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdbool.h>
#include <stddef.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <f2fs_fs.h>
#include <sys/stat.h>
#include <assert.h>
Include dependency graph for f2fs.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  list_head
 
struct  node_info
 
struct  f2fs_nm_info
 
struct  seg_entry
 
struct  sec_entry
 
struct  sit_info
 
struct  curseg_info
 
struct  f2fs_sm_info
 
struct  f2fs_dentry_ptr
 
struct  dentry
 
struct  dnode_of_data
 
struct  hardlink_cache_entry
 
struct  f2fs_sb_info
 
struct  fsync_inode_entry
 

Macros

#define EXIT_ERR_CODE   (-1)
 
#define ver_after(a, b)
 
#define container_of(ptr, type, member)
 
#define LIST_HEAD_INIT(name)   { &(name), &(name) }
 
#define list_entry(ptr, type, member)    container_of(ptr, type, member)
 
#define list_first_entry(ptr, type, member)    list_entry((ptr)->next, type, member)
 
#define list_next_entry(pos, member)    list_entry((pos)->member.next, typeof(*(pos)), member)
 
#define list_for_each_entry(pos, head, member)
 
#define list_for_each_entry_safe(pos, n, head, member)
 
#define MAX_RA_BLOCKS   64
 
#define BLKS_PER_SEC(sbi)    ((sbi)->segs_per_sec * (sbi)->blocks_per_seg)
 
#define GET_ZONENO_FROM_SEGNO(sbi, segno)    ((segno / sbi->segs_per_sec) / sbi->secs_per_zone)
 
#define IS_DATASEG(t)
 
#define IS_NODESEG(t)
 
#define MAIN_BLKADDR(sbi)
 
#define SEG0_BLKADDR(sbi)
 
#define GET_SUM_BLKADDR(sbi, segno)    ((sbi->sm_info->ssa_blkaddr) + segno)
 
#define GET_SEGOFF_FROM_SEG0(sbi, blk_addr)    ((blk_addr) - SM_I(sbi)->seg0_blkaddr)
 
#define GET_SEGNO_FROM_SEG0(sbi, blk_addr)    (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) >> sbi->log_blocks_per_seg)
 
#define GET_BLKOFF_FROM_SEG0(sbi, blk_addr)    (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) & (sbi->blocks_per_seg - 1))
 
#define GET_SEC_FROM_SEG(sbi, segno)    ((segno) / (sbi)->segs_per_sec)
 
#define GET_SEG_FROM_SEC(sbi, secno)    ((secno) * (sbi)->segs_per_sec)
 
#define FREE_I_START_SEGNO(sbi)    GET_SEGNO_FROM_SEG0(sbi, SM_I(sbi)->main_blkaddr)
 
#define GET_R2L_SEGNO(sbi, segno)   (segno + FREE_I_START_SEGNO(sbi))
 
#define MAIN_SEGS(sbi)   (SM_I(sbi)->main_segments)
 
#define TOTAL_SEGS(sbi)   (SM_I(sbi)->segment_count)
 
#define TOTAL_BLKS(sbi)   (TOTAL_SEGS(sbi) << (sbi)->log_blocks_per_seg)
 
#define MAX_BLKADDR(sbi)   (SEG0_BLKADDR(sbi) + TOTAL_BLKS(sbi))
 
#define START_BLOCK(sbi, segno)
 
#define NEXT_FREE_BLKADDR(sbi, curseg)    (START_BLOCK(sbi, (curseg)->segno) + (curseg)->next_blkoff)
 
#define SIT_BLK_CNT(sbi)    ((MAIN_SEGS(sbi) + SIT_ENTRY_PER_BLOCK - 1) / SIT_ENTRY_PER_BLOCK)
 
#define nats_in_cursum(jnl)   (le16_to_cpu(jnl->n_nats))
 
#define sits_in_cursum(jnl)   (le16_to_cpu(jnl->n_sits))
 
#define nat_in_journal(jnl, i)   (jnl->nat_j.entries[i].ne)
 
#define nid_in_journal(jnl, i)   (jnl->nat_j.entries[i].nid)
 
#define sit_in_journal(jnl, i)   (jnl->sit_j.entries[i].se)
 
#define segno_in_journal(jnl, i)   (jnl->sit_j.entries[i].segno)
 
#define SIT_ENTRY_OFFSET(sit_i, segno)    ((segno) % sit_i->sents_per_block)
 
#define SIT_BLOCK_OFFSET(sit_i, segno)    ((segno) / SIT_ENTRY_PER_BLOCK)
 
#define S_SHIFT   12
 
#define IS_SUM_NODE_SEG(sum)   (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_NODE)
 
#define IS_SUM_DATA_SEG(sum)   (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_DATA)
 

Enumerations

enum  {
  META_CP , META_NAT , META_SIT , META_SSA ,
  META_MAX , META_POR , DATA_GENERIC
}
 
enum  { NAT_BITMAP , SIT_BITMAP }
 

Functions

static void __list_add (struct list_head *new, struct list_head *prev, struct list_head *next)
 
static void __list_del (struct list_head *prev, struct list_head *next)
 
static void list_del (struct list_head *entry)
 
static void list_add_tail (struct list_head *new, struct list_head *head)
 
static struct f2fs_super_blockF2FS_RAW_SUPER (struct f2fs_sb_info *sbi)
 
static struct f2fs_checkpointF2FS_CKPT (struct f2fs_sb_info *sbi)
 
static struct f2fs_fsckF2FS_FSCK (struct f2fs_sb_info *sbi)
 
static struct f2fs_nm_infoNM_I (struct f2fs_sb_info *sbi)
 
static struct f2fs_sm_infoSM_I (struct f2fs_sb_info *sbi)
 
static struct sit_infoSIT_I (struct f2fs_sb_info *sbi)
 
static void * inline_data_addr (struct f2fs_node *node_blk)
 
static unsigned int ofs_of_node (struct f2fs_node *node_blk)
 
static unsigned long long cur_cp_version (struct f2fs_checkpoint *cp)
 
static __u64 cur_cp_crc (struct f2fs_checkpoint *cp)
 
static bool is_set_ckpt_flags (struct f2fs_checkpoint *cp, unsigned int f)
 
static unsigned long __bitmap_size (struct f2fs_sb_info *sbi, int flag)
 
static block_t __cp_payload (struct f2fs_sb_info *sbi)
 
static void * __bitmap_ptr (struct f2fs_sb_info *sbi, int flag)
 
static block_t __start_cp_addr (struct f2fs_sb_info *sbi)
 
static block_t __start_sum_addr (struct f2fs_sb_info *sbi)
 
static block_t __end_block_addr (struct f2fs_sb_info *sbi)
 
static struct curseg_infoCURSEG_I (struct f2fs_sb_info *sbi, int type)
 
static block_t start_sum_block (struct f2fs_sb_info *sbi)
 
static block_t sum_blk_addr (struct f2fs_sb_info *sbi, int base, int type)
 
static bool IS_VALID_NID (struct f2fs_sb_info *sbi, u32 nid)
 
static bool is_valid_data_blkaddr (block_t blkaddr)
 
static int IS_CUR_SEGNO (struct f2fs_sb_info *sbi, u32 segno)
 
static u64 BLKOFF_FROM_MAIN (struct f2fs_sb_info *sbi, u64 blk_addr)
 
static u32 GET_SEGNO (struct f2fs_sb_info *sbi, u64 blk_addr)
 
static u32 OFFSET_IN_SEG (struct f2fs_sb_info *sbi, u64 blk_addr)
 
static void node_info_from_raw_nat (struct node_info *ni, struct f2fs_nat_entry *raw_nat)
 
static void set_summary (struct f2fs_summary *sum, nid_t nid, unsigned int ofs_in_node, unsigned char version)
 
static int map_de_type (umode_t mode)
 
static void * inline_xattr_addr (struct f2fs_inode *inode)
 
static int inline_xattr_size (struct f2fs_inode *inode)
 
int lookup_nat_in_journal (struct f2fs_sb_info *sbi, u32 nid, struct f2fs_nat_entry *ne)
 
static unsigned int dir_buckets (unsigned int level, int dir_level)
 
static unsigned int bucket_blocks (unsigned int level)
 
static unsigned long dir_block_index (unsigned int level, int dir_level, unsigned int idx)
 
static int is_dot_dotdot (const unsigned char *name, const int len)
 
static int get_encoding (struct f2fs_sb_info *sbi)
 

Variables

static unsigned char f2fs_type_by_mode [S_IFMT > > S_SHIFT]
 

Macro Definition Documentation

◆ BLKS_PER_SEC

#define BLKS_PER_SEC (   sbi)     ((sbi)->segs_per_sec * (sbi)->blocks_per_seg)

◆ container_of

#define container_of (   ptr,
  type,
  member 
)
Value:
({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
uint8_t type
Definition: pairing_connection.h:0

◆ EXIT_ERR_CODE

#define EXIT_ERR_CODE   (-1)

f2fs.h

Copyright (c) 2013 Samsung Electronics Co., Ltd. http://www.samsung.com/

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.

◆ FREE_I_START_SEGNO

#define FREE_I_START_SEGNO (   sbi)     GET_SEGNO_FROM_SEG0(sbi, SM_I(sbi)->main_blkaddr)

◆ GET_BLKOFF_FROM_SEG0

#define GET_BLKOFF_FROM_SEG0 (   sbi,
  blk_addr 
)     (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) & (sbi->blocks_per_seg - 1))

◆ GET_R2L_SEGNO

#define GET_R2L_SEGNO (   sbi,
  segno 
)    (segno + FREE_I_START_SEGNO(sbi))

◆ GET_SEC_FROM_SEG

#define GET_SEC_FROM_SEG (   sbi,
  segno 
)     ((segno) / (sbi)->segs_per_sec)

◆ GET_SEG_FROM_SEC

#define GET_SEG_FROM_SEC (   sbi,
  secno 
)     ((secno) * (sbi)->segs_per_sec)

◆ GET_SEGNO_FROM_SEG0

#define GET_SEGNO_FROM_SEG0 (   sbi,
  blk_addr 
)     (GET_SEGOFF_FROM_SEG0(sbi, blk_addr) >> sbi->log_blocks_per_seg)

◆ GET_SEGOFF_FROM_SEG0

#define GET_SEGOFF_FROM_SEG0 (   sbi,
  blk_addr 
)     ((blk_addr) - SM_I(sbi)->seg0_blkaddr)

◆ GET_SUM_BLKADDR

#define GET_SUM_BLKADDR (   sbi,
  segno 
)     ((sbi->sm_info->ssa_blkaddr) + segno)

◆ GET_ZONENO_FROM_SEGNO

#define GET_ZONENO_FROM_SEGNO (   sbi,
  segno 
)     ((segno / sbi->segs_per_sec) / sbi->secs_per_zone)

◆ IS_DATASEG

#define IS_DATASEG (   t)
Value:
((t == CURSEG_HOT_DATA) || (t == CURSEG_COLD_DATA) || \
@ CURSEG_COLD_DATA
Definition: f2fs_fs.h:628
@ CURSEG_HOT_DATA
Definition: f2fs_fs.h:626
@ CURSEG_WARM_DATA
Definition: f2fs_fs.h:627

◆ IS_NODESEG

#define IS_NODESEG (   t)
Value:
((t == CURSEG_HOT_NODE) || (t == CURSEG_COLD_NODE) || \
@ CURSEG_WARM_NODE
Definition: f2fs_fs.h:630
@ CURSEG_HOT_NODE
Definition: f2fs_fs.h:629
@ CURSEG_COLD_NODE
Definition: f2fs_fs.h:631

◆ IS_SUM_DATA_SEG

#define IS_SUM_DATA_SEG (   sum)    (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_DATA)

◆ IS_SUM_NODE_SEG

#define IS_SUM_NODE_SEG (   sum)    (F2FS_SUMMARY_BLOCK_FOOTER(sum)->entry_type == SUM_TYPE_NODE)

◆ list_entry

#define list_entry (   ptr,
  type,
  member 
)     container_of(ptr, type, member)

◆ list_first_entry

#define list_first_entry (   ptr,
  type,
  member 
)     list_entry((ptr)->next, type, member)

◆ list_for_each_entry

#define list_for_each_entry (   pos,
  head,
  member 
)
Value:
for (pos = list_first_entry(head, typeof(*pos), member); \
&pos->member != (head); \
pos = list_next_entry(pos, member))
#define list_first_entry(ptr, type, member)
Definition: f2fs.h:84
#define list_next_entry(pos, member)
Definition: f2fs.h:87

◆ list_for_each_entry_safe

#define list_for_each_entry_safe (   pos,
  n,
  head,
  member 
)
Value:
for (pos = list_first_entry(head, typeof(*pos), member), \
n = list_next_entry(pos, member); \
&pos->member != (head); \
pos = n, n = list_next_entry(n, member))

◆ LIST_HEAD_INIT

#define LIST_HEAD_INIT (   name)    { &(name), &(name) }

◆ list_next_entry

#define list_next_entry (   pos,
  member 
)     list_entry((pos)->member.next, typeof(*(pos)), member)

◆ MAIN_BLKADDR

#define MAIN_BLKADDR (   sbi)
Value:
(SM_I(sbi) ? SM_I(sbi)->main_blkaddr : \
le32_to_cpu(F2FS_RAW_SUPER(sbi)->main_blkaddr))
static struct f2fs_sm_info * SM_I(struct f2fs_sb_info *sbi)
Definition: f2fs.h:315
static struct f2fs_super_block * F2FS_RAW_SUPER(struct f2fs_sb_info *sbi)
Definition: f2fs.h:295
__le32 main_blkaddr
Definition: f2fs_fs.h:24
block_t main_blkaddr
Definition: f2fs.h:195

◆ MAIN_SEGS

#define MAIN_SEGS (   sbi)    (SM_I(sbi)->main_segments)

◆ MAX_BLKADDR

#define MAX_BLKADDR (   sbi)    (SEG0_BLKADDR(sbi) + TOTAL_BLKS(sbi))

◆ MAX_RA_BLOCKS

#define MAX_RA_BLOCKS   64

◆ nat_in_journal

#define nat_in_journal (   jnl,
 
)    (jnl->nat_j.entries[i].ne)

◆ nats_in_cursum

#define nats_in_cursum (   jnl)    (le16_to_cpu(jnl->n_nats))

◆ NEXT_FREE_BLKADDR

#define NEXT_FREE_BLKADDR (   sbi,
  curseg 
)     (START_BLOCK(sbi, (curseg)->segno) + (curseg)->next_blkoff)

◆ nid_in_journal

#define nid_in_journal (   jnl,
 
)    (jnl->nat_j.entries[i].nid)

◆ S_SHIFT

#define S_SHIFT   12

◆ SEG0_BLKADDR

#define SEG0_BLKADDR (   sbi)
Value:
(SM_I(sbi) ? SM_I(sbi)->seg0_blkaddr : \
le32_to_cpu(F2FS_RAW_SUPER(sbi)->segment0_blkaddr))
__le32 segment0_blkaddr
Definition: f2fs_fs.h:19
block_t seg0_blkaddr
Definition: f2fs.h:194

◆ segno_in_journal

#define segno_in_journal (   jnl,
 
)    (jnl->sit_j.entries[i].segno)

◆ SIT_BLK_CNT

#define SIT_BLK_CNT (   sbi)     ((MAIN_SEGS(sbi) + SIT_ENTRY_PER_BLOCK - 1) / SIT_ENTRY_PER_BLOCK)

◆ SIT_BLOCK_OFFSET

#define SIT_BLOCK_OFFSET (   sit_i,
  segno 
)     ((segno) / SIT_ENTRY_PER_BLOCK)

◆ SIT_ENTRY_OFFSET

#define SIT_ENTRY_OFFSET (   sit_i,
  segno 
)     ((segno) % sit_i->sents_per_block)

◆ sit_in_journal

#define sit_in_journal (   jnl,
 
)    (jnl->sit_j.entries[i].se)

◆ sits_in_cursum

#define sits_in_cursum (   jnl)    (le16_to_cpu(jnl->n_sits))

◆ START_BLOCK

#define START_BLOCK (   sbi,
  segno 
)
Value:
(SM_I(sbi)->main_blkaddr + \
((segno) << sbi->log_blocks_per_seg))
__le32 segno
Definition: f2fs_fs.h:0

◆ TOTAL_BLKS

#define TOTAL_BLKS (   sbi)    (TOTAL_SEGS(sbi) << (sbi)->log_blocks_per_seg)

◆ TOTAL_SEGS

#define TOTAL_SEGS (   sbi)    (SM_I(sbi)->segment_count)

◆ ver_after

#define ver_after (   a,
 
)
Value:
(typecheck(unsigned long long, a) && \
typecheck(unsigned long long, b) && \
((long long)((a) - (b)) > 0))
#define typecheck(type, x)
Definition: f2fs_fs.h:240

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
META_CP 
META_NAT 
META_SIT 
META_SSA 
META_MAX 
META_POR 
DATA_GENERIC 

◆ anonymous enum

anonymous enum
Enumerator
NAT_BITMAP 
SIT_BITMAP 

Function Documentation

◆ __bitmap_ptr()

static void * __bitmap_ptr ( struct f2fs_sb_info sbi,
int  flag 
)
inlinestatic

◆ __bitmap_size()

static unsigned long __bitmap_size ( struct f2fs_sb_info sbi,
int  flag 
)
inlinestatic

◆ __cp_payload()

static block_t __cp_payload ( struct f2fs_sb_info sbi)
inlinestatic

◆ __end_block_addr()

static block_t __end_block_addr ( struct f2fs_sb_info sbi)
inlinestatic

◆ __list_add()

static void __list_add ( struct list_head new,
struct list_head prev,
struct list_head next 
)
inlinestatic

◆ __list_del()

static void __list_del ( struct list_head prev,
struct list_head next 
)
inlinestatic

◆ __start_cp_addr()

static block_t __start_cp_addr ( struct f2fs_sb_info sbi)
inlinestatic

◆ __start_sum_addr()

static block_t __start_sum_addr ( struct f2fs_sb_info sbi)
inlinestatic

◆ BLKOFF_FROM_MAIN()

static u64 BLKOFF_FROM_MAIN ( struct f2fs_sb_info sbi,
u64  blk_addr 
)
inlinestatic

◆ bucket_blocks()

static unsigned int bucket_blocks ( unsigned int  level)
inlinestatic

◆ cur_cp_crc()

static __u64 cur_cp_crc ( struct f2fs_checkpoint cp)
inlinestatic

◆ cur_cp_version()

static unsigned long long cur_cp_version ( struct f2fs_checkpoint cp)
inlinestatic

◆ CURSEG_I()

static struct curseg_info * CURSEG_I ( struct f2fs_sb_info sbi,
int  type 
)
inlinestatic

◆ dir_block_index()

static unsigned long dir_block_index ( unsigned int  level,
int  dir_level,
unsigned int  idx 
)
inlinestatic

◆ dir_buckets()

static unsigned int dir_buckets ( unsigned int  level,
int  dir_level 
)
inlinestatic

◆ F2FS_CKPT()

static struct f2fs_checkpoint * F2FS_CKPT ( struct f2fs_sb_info sbi)
inlinestatic

◆ F2FS_FSCK()

static struct f2fs_fsck * F2FS_FSCK ( struct f2fs_sb_info sbi)
inlinestatic

◆ F2FS_RAW_SUPER()

static struct f2fs_super_block * F2FS_RAW_SUPER ( struct f2fs_sb_info sbi)
inlinestatic

◆ get_encoding()

static int get_encoding ( struct f2fs_sb_info sbi)
inlinestatic

◆ GET_SEGNO()

static u32 GET_SEGNO ( struct f2fs_sb_info sbi,
u64  blk_addr 
)
inlinestatic

◆ inline_data_addr()

static void * inline_data_addr ( struct f2fs_node node_blk)
inlinestatic

◆ inline_xattr_addr()

static void * inline_xattr_addr ( struct f2fs_inode inode)
inlinestatic

◆ inline_xattr_size()

static int inline_xattr_size ( struct f2fs_inode inode)
inlinestatic

◆ IS_CUR_SEGNO()

static int IS_CUR_SEGNO ( struct f2fs_sb_info sbi,
u32  segno 
)
inlinestatic

◆ is_dot_dotdot()

static int is_dot_dotdot ( const unsigned char *  name,
const int  len 
)
inlinestatic

◆ is_set_ckpt_flags()

static bool is_set_ckpt_flags ( struct f2fs_checkpoint cp,
unsigned int  f 
)
inlinestatic

◆ is_valid_data_blkaddr()

static bool is_valid_data_blkaddr ( block_t  blkaddr)
inlinestatic

◆ IS_VALID_NID()

static bool IS_VALID_NID ( struct f2fs_sb_info sbi,
u32  nid 
)
inlinestatic

◆ list_add_tail()

static void list_add_tail ( struct list_head new,
struct list_head head 
)
inlinestatic

◆ list_del()

static void list_del ( struct list_head entry)
inlinestatic

◆ lookup_nat_in_journal()

int lookup_nat_in_journal ( struct f2fs_sb_info sbi,
u32  nid,
struct f2fs_nat_entry ne 
)

◆ map_de_type()

static int map_de_type ( umode_t  mode)
inlinestatic

◆ NM_I()

static struct f2fs_nm_info * NM_I ( struct f2fs_sb_info sbi)
inlinestatic

◆ node_info_from_raw_nat()

static void node_info_from_raw_nat ( struct node_info ni,
struct f2fs_nat_entry raw_nat 
)
inlinestatic

◆ OFFSET_IN_SEG()

static u32 OFFSET_IN_SEG ( struct f2fs_sb_info sbi,
u64  blk_addr 
)
inlinestatic

◆ ofs_of_node()

static unsigned int ofs_of_node ( struct f2fs_node node_blk)
inlinestatic

◆ set_summary()

static void set_summary ( struct f2fs_summary sum,
nid_t  nid,
unsigned int  ofs_in_node,
unsigned char  version 
)
inlinestatic

◆ SIT_I()

static struct sit_info * SIT_I ( struct f2fs_sb_info sbi)
inlinestatic

◆ SM_I()

static struct f2fs_sm_info * SM_I ( struct f2fs_sb_info sbi)
inlinestatic

◆ start_sum_block()

static block_t start_sum_block ( struct f2fs_sb_info sbi)
inlinestatic

◆ sum_blk_addr()

static block_t sum_blk_addr ( struct f2fs_sb_info sbi,
int  base,
int  type 
)
inlinestatic

Variable Documentation

◆ f2fs_type_by_mode

unsigned char f2fs_type_by_mode[S_IFMT > > S_SHIFT]
static
Initial value:
= {
[S_IFREG >> S_SHIFT] = F2FS_FT_REG_FILE,
[S_IFDIR >> S_SHIFT] = F2FS_FT_DIR,
[S_IFCHR >> S_SHIFT] = F2FS_FT_CHRDEV,
[S_IFBLK >> S_SHIFT] = F2FS_FT_BLKDEV,
[S_IFIFO >> S_SHIFT] = F2FS_FT_FIFO,
}
#define S_SHIFT
Definition: f2fs.h:578
@ F2FS_FT_CHRDEV
Definition: f2fs_fs.h:1438
@ F2FS_FT_DIR
Definition: f2fs_fs.h:1437
@ F2FS_FT_REG_FILE
Definition: f2fs_fs.h:1436
@ F2FS_FT_FIFO
Definition: f2fs_fs.h:1440
@ F2FS_FT_BLKDEV
Definition: f2fs_fs.h:1439