Android-cuttlefish cvd tool
node.h
Go to the documentation of this file.
1
16#ifndef _NODE_H_
17#define _NODE_H_
18
19#include "fsck.h"
20
21static inline bool IS_INODE(struct f2fs_node *node)
22{
23 return F2FS_NODE_FOOTER(node)->nid == F2FS_NODE_FOOTER(node)->ino;
24}
25
26static inline unsigned int ADDRS_PER_PAGE(struct f2fs_sb_info *sbi,
27 struct f2fs_node *node_blk, struct f2fs_node *inode_blk)
28{
30 unsigned int nblocks;
31
32 if (IS_INODE(node_blk))
33 return ADDRS_PER_INODE(&node_blk->i);
34
35 if (!inode_blk) {
36 struct node_info ni;
37
38 inode_blk = calloc(F2FS_BLKSIZE, 2);
39 ASSERT(inode_blk);
40
41 get_node_info(sbi, ino, &ni);
42 ASSERT(dev_read_block(inode_blk, ni.blk_addr) >= 0);
43 nblocks = ADDRS_PER_BLOCK(&inode_blk->i);
44 free(inode_blk);
45 } else {
46 nblocks = ADDRS_PER_BLOCK(&inode_blk->i);
47 }
48 return nblocks;
49}
50
51static inline __le32 *blkaddr_in_inode(struct f2fs_node *node)
52{
53 return node->i.i_addr + get_extra_isize(node);
54}
55
56static inline __le32 *blkaddr_in_node(struct f2fs_node *node)
57{
58 return IS_INODE(node) ? blkaddr_in_inode(node) : node->dn.addr;
59}
60
61static inline block_t datablock_addr(struct f2fs_node *node_page,
62 unsigned int offset)
63{
64 __le32 *addr_array;
65
66 ASSERT(node_page);
67 addr_array = blkaddr_in_node(node_page);
68 return le32_to_cpu(addr_array[offset]);
69}
70
71static inline void set_nid(struct f2fs_node * rn, int off, nid_t nid, int i)
72{
73 if (i)
75 else
76 rn->in.nid[off] = cpu_to_le32(nid);
77}
78
79static inline nid_t get_nid(struct f2fs_node * rn, int off, int i)
80{
81 if (i)
82 return le32_to_cpu(F2FS_INODE_I_NID(&rn->i, off - NODE_DIR1_BLOCK));
83 else
84 return le32_to_cpu(rn->in.nid[off]);
85}
86
87enum {
88 ALLOC_NODE, /* allocate a new node page if needed */
89 LOOKUP_NODE, /* lookup up a node without readahead */
91};
92
93static inline void set_new_dnode(struct dnode_of_data *dn,
94 struct f2fs_node *iblk, struct f2fs_node *nblk, nid_t nid)
95{
96 memset(dn, 0, sizeof(*dn));
97 dn->inode_blk = iblk;
98 dn->node_blk = nblk;
99 dn->nid = nid;
100 dn->idirty = 0;
101 dn->ndirty = 0;
102 dn->alloced = 0;
103}
104
105static inline void inc_inode_blocks(struct dnode_of_data *dn)
106{
107 u64 blocks = le64_to_cpu(dn->inode_blk->i.i_blocks);
108
109 dn->inode_blk->i.i_blocks = cpu_to_le64(blocks + 1);
110 dn->idirty = 1;
111}
112
113static inline int IS_DNODE(struct f2fs_node *node_page)
114{
115 unsigned int ofs = ofs_of_node(node_page);
116
117 if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK ||
118 ofs == 5 + 2 * NIDS_PER_BLOCK)
119 return 0;
120
121 if (ofs >= 6 + 2 * NIDS_PER_BLOCK) {
122 ofs -= 6 + 2 * NIDS_PER_BLOCK;
123 if (!((long int)ofs % (NIDS_PER_BLOCK + 1)))
124 return 0;
125 }
126 return 1;
127}
128
129static inline nid_t ino_of_node(struct f2fs_node *node_blk)
130{
131 return le32_to_cpu(F2FS_NODE_FOOTER(node_blk)->ino);
132}
133
134static inline __u64 cpver_of_node(struct f2fs_node *node_blk)
135{
136 return le64_to_cpu(F2FS_NODE_FOOTER(node_blk)->cp_ver);
137}
138
139static inline bool is_recoverable_dnode(struct f2fs_sb_info *sbi,
140 struct f2fs_node *node_blk)
141{
142 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
143 __u64 cp_ver = cur_cp_version(ckpt);
144
145 /* Don't care crc part, if fsck.f2fs sets it. */
147 return (cp_ver << 32) == (cpver_of_node(node_blk) << 32);
148
150 cp_ver |= (cur_cp_crc(ckpt) << 32);
151
152 return cp_ver == cpver_of_node(node_blk);
153}
154
155static inline block_t next_blkaddr_of_node(struct f2fs_node *node_blk)
156{
157 return le32_to_cpu(F2FS_NODE_FOOTER(node_blk)->next_blkaddr);
158}
159
160static inline int is_node(struct f2fs_node *node_blk, int type)
161{
162 return le32_to_cpu(F2FS_NODE_FOOTER(node_blk)->flag) & (1 << type);
163}
164
165static inline void set_cold_node(struct f2fs_node *rn, bool is_dir)
166{
167 unsigned int flag = le32_to_cpu(F2FS_NODE_FOOTER(rn)->flag);
168
169 if (is_dir)
170 flag &= ~(0x1 << COLD_BIT_SHIFT);
171 else
172 flag |= (0x1 << COLD_BIT_SHIFT);
173 F2FS_NODE_FOOTER(rn)->flag = cpu_to_le32(flag);
174}
175
176#define is_fsync_dnode(node_blk) is_node(node_blk, FSYNC_BIT_SHIFT)
177#define is_dent_dnode(node_blk) is_node(node_blk, DENT_BIT_SHIFT)
178
179#endif
unsigned long long __u64
Definition: blkid_types.h:16
__u32 __bitwise __le32
Definition: blkid_types.h:39
#define cpu_to_le32(x)
Definition: ext4_utils.h:52
#define le32_to_cpu(x)
Definition: ext4_utils.h:54
unsigned long long u64
Definition: ext4_utils.h:63
static bool is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f)
Definition: f2fs.h:349
static unsigned int ofs_of_node(struct f2fs_node *node_blk)
Definition: f2fs.h:332
static unsigned long long cur_cp_version(struct f2fs_checkpoint *cp)
Definition: f2fs.h:338
static __u64 cur_cp_crc(struct f2fs_checkpoint *cp)
Definition: f2fs.h:343
static struct f2fs_checkpoint * F2FS_CKPT(struct f2fs_sb_info *sbi)
Definition: f2fs.h:300
__le32 nid
Definition: f2fs_fs.h:0
#define ADDRS_PER_INODE(i)
Definition: f2fs_fs.h:950
#define ASSERT(exp)
Definition: f2fs_fs.h:272
#define le64_to_cpu(x)
Definition: f2fs_fs.h:225
#define ADDRS_PER_BLOCK(i)
Definition: f2fs_fs.h:953
#define CP_NOCRC_RECOVERY_FLAG
Definition: f2fs_fs.h:832
#define F2FS_NODE_FOOTER(blk)
Definition: f2fs_fs.h:1130
#define NODE_DIR1_BLOCK
Definition: f2fs_fs.h:957
u32 block_t
Definition: f2fs_fs.h:122
#define get_extra_isize(node)
Definition: f2fs_fs.h:1741
@ COLD_BIT_SHIFT
Definition: f2fs_fs.h:1106
u32 nid_t
Definition: f2fs_fs.h:123
int dev_read_block(void *, __u64)
Definition: libf2fs_io.c:727
#define cpu_to_le64(x)
Definition: f2fs_fs.h:228
#define NIDS_PER_BLOCK
Definition: f2fs_fs.h:955
#define F2FS_BLKSIZE
Definition: f2fs_fs.h:657
#define F2FS_INODE_I_NID(inode, i)
Definition: f2fs_fs.h:1092
#define CP_CRC_RECOVERY_FLAG
Definition: f2fs_fs.h:835
__le32 ino
Definition: f2fs_fs.h:1
void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *)
Definition: mount.c:2604
static unsigned int ADDRS_PER_PAGE(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk, struct f2fs_node *inode_blk)
Definition: node.h:26
static void inc_inode_blocks(struct dnode_of_data *dn)
Definition: node.h:105
static int is_node(struct f2fs_node *node_blk, int type)
Definition: node.h:160
static void set_cold_node(struct f2fs_node *rn, bool is_dir)
Definition: node.h:165
static nid_t get_nid(struct f2fs_node *rn, int off, int i)
Definition: node.h:79
static nid_t ino_of_node(struct f2fs_node *node_blk)
Definition: node.h:129
static bool is_recoverable_dnode(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
Definition: node.h:139
static block_t datablock_addr(struct f2fs_node *node_page, unsigned int offset)
Definition: node.h:61
static __le32 * blkaddr_in_node(struct f2fs_node *node)
Definition: node.h:56
static __le32 * blkaddr_in_inode(struct f2fs_node *node)
Definition: node.h:51
static int IS_DNODE(struct f2fs_node *node_page)
Definition: node.h:113
static void set_nid(struct f2fs_node *rn, int off, nid_t nid, int i)
Definition: node.h:71
static block_t next_blkaddr_of_node(struct f2fs_node *node_blk)
Definition: node.h:155
@ ALLOC_NODE
Definition: node.h:88
@ LOOKUP_NODE_RA
Definition: node.h:90
@ LOOKUP_NODE
Definition: node.h:89
static __u64 cpver_of_node(struct f2fs_node *node_blk)
Definition: node.h:134
static bool IS_INODE(struct f2fs_node *node)
Definition: node.h:21
static void set_new_dnode(struct dnode_of_data *dn, struct f2fs_node *iblk, struct f2fs_node *nblk, nid_t nid)
Definition: node.h:93
uint8_t type
Definition: pairing_connection.h:0
__le32 addr[0]
Definition: f2fs_fs.h:1098
Definition: f2fs.h:235
struct f2fs_node * node_blk
Definition: f2fs.h:237
int ndirty
Definition: f2fs.h:242
int alloced
Definition: f2fs.h:242
int idirty
Definition: f2fs.h:242
struct f2fs_node * inode_blk
Definition: f2fs.h:236
nid_t nid
Definition: f2fs.h:238
Definition: f2fs_fs.h:845
__le32 i_addr[0]
Definition: f2fs_fs.h:1083
__le64 i_blocks
Definition: f2fs_fs.h:1042
Definition: f2fs_fs.h:1122
struct f2fs_inode i
Definition: f2fs_fs.h:1125
struct direct_node dn
Definition: f2fs_fs.h:1126
struct indirect_node in
Definition: f2fs_fs.h:1127
Definition: f2fs.h:251
__le32 nid[0]
Definition: f2fs_fs.h:1102
Definition: f2fs.h:121
u32 blk_addr
Definition: f2fs.h:124