aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/node.h
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/node.h')
-rw-r--r--fs/f2fs/node.h44
1 files changed, 20 insertions, 24 deletions
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index c65fb4f4230f..3496bb3e15dc 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -155,8 +155,7 @@ static inline void set_to_next_nat(struct f2fs_nm_info *nm_i, nid_t start_nid)
155static inline void fill_node_footer(struct page *page, nid_t nid, 155static inline void fill_node_footer(struct page *page, nid_t nid,
156 nid_t ino, unsigned int ofs, bool reset) 156 nid_t ino, unsigned int ofs, bool reset)
157{ 157{
158 void *kaddr = page_address(page); 158 struct f2fs_node *rn = F2FS_NODE(page);
159 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
160 if (reset) 159 if (reset)
161 memset(rn, 0, sizeof(*rn)); 160 memset(rn, 0, sizeof(*rn));
162 rn->footer.nid = cpu_to_le32(nid); 161 rn->footer.nid = cpu_to_le32(nid);
@@ -166,10 +165,8 @@ static inline void fill_node_footer(struct page *page, nid_t nid,
166 165
167static inline void copy_node_footer(struct page *dst, struct page *src) 166static inline void copy_node_footer(struct page *dst, struct page *src)
168{ 167{
169 void *src_addr = page_address(src); 168 struct f2fs_node *src_rn = F2FS_NODE(src);
170 void *dst_addr = page_address(dst); 169 struct f2fs_node *dst_rn = F2FS_NODE(dst);
171 struct f2fs_node *src_rn = (struct f2fs_node *)src_addr;
172 struct f2fs_node *dst_rn = (struct f2fs_node *)dst_addr;
173 memcpy(&dst_rn->footer, &src_rn->footer, sizeof(struct node_footer)); 170 memcpy(&dst_rn->footer, &src_rn->footer, sizeof(struct node_footer));
174} 171}
175 172
@@ -177,45 +174,40 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr)
177{ 174{
178 struct f2fs_sb_info *sbi = F2FS_SB(page->mapping->host->i_sb); 175 struct f2fs_sb_info *sbi = F2FS_SB(page->mapping->host->i_sb);
179 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); 176 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
180 void *kaddr = page_address(page); 177 struct f2fs_node *rn = F2FS_NODE(page);
181 struct f2fs_node *rn = (struct f2fs_node *)kaddr; 178
182 rn->footer.cp_ver = ckpt->checkpoint_ver; 179 rn->footer.cp_ver = ckpt->checkpoint_ver;
183 rn->footer.next_blkaddr = cpu_to_le32(blkaddr); 180 rn->footer.next_blkaddr = cpu_to_le32(blkaddr);
184} 181}
185 182
186static inline nid_t ino_of_node(struct page *node_page) 183static inline nid_t ino_of_node(struct page *node_page)
187{ 184{
188 void *kaddr = page_address(node_page); 185 struct f2fs_node *rn = F2FS_NODE(node_page);
189 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
190 return le32_to_cpu(rn->footer.ino); 186 return le32_to_cpu(rn->footer.ino);
191} 187}
192 188
193static inline nid_t nid_of_node(struct page *node_page) 189static inline nid_t nid_of_node(struct page *node_page)
194{ 190{
195 void *kaddr = page_address(node_page); 191 struct f2fs_node *rn = F2FS_NODE(node_page);
196 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
197 return le32_to_cpu(rn->footer.nid); 192 return le32_to_cpu(rn->footer.nid);
198} 193}
199 194
200static inline unsigned int ofs_of_node(struct page *node_page) 195static inline unsigned int ofs_of_node(struct page *node_page)
201{ 196{
202 void *kaddr = page_address(node_page); 197 struct f2fs_node *rn = F2FS_NODE(node_page);
203 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
204 unsigned flag = le32_to_cpu(rn->footer.flag); 198 unsigned flag = le32_to_cpu(rn->footer.flag);
205 return flag >> OFFSET_BIT_SHIFT; 199 return flag >> OFFSET_BIT_SHIFT;
206} 200}
207 201
208static inline unsigned long long cpver_of_node(struct page *node_page) 202static inline unsigned long long cpver_of_node(struct page *node_page)
209{ 203{
210 void *kaddr = page_address(node_page); 204 struct f2fs_node *rn = F2FS_NODE(node_page);
211 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
212 return le64_to_cpu(rn->footer.cp_ver); 205 return le64_to_cpu(rn->footer.cp_ver);
213} 206}
214 207
215static inline block_t next_blkaddr_of_node(struct page *node_page) 208static inline block_t next_blkaddr_of_node(struct page *node_page)
216{ 209{
217 void *kaddr = page_address(node_page); 210 struct f2fs_node *rn = F2FS_NODE(node_page);
218 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
219 return le32_to_cpu(rn->footer.next_blkaddr); 211 return le32_to_cpu(rn->footer.next_blkaddr);
220} 212}
221 213
@@ -237,6 +229,10 @@ static inline block_t next_blkaddr_of_node(struct page *node_page)
237static inline bool IS_DNODE(struct page *node_page) 229static inline bool IS_DNODE(struct page *node_page)
238{ 230{
239 unsigned int ofs = ofs_of_node(node_page); 231 unsigned int ofs = ofs_of_node(node_page);
232
233 if (ofs == XATTR_NODE_OFFSET)
234 return false;
235
240 if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK || 236 if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK ||
241 ofs == 5 + 2 * NIDS_PER_BLOCK) 237 ofs == 5 + 2 * NIDS_PER_BLOCK)
242 return false; 238 return false;
@@ -250,7 +246,7 @@ static inline bool IS_DNODE(struct page *node_page)
250 246
251static inline void set_nid(struct page *p, int off, nid_t nid, bool i) 247static inline void set_nid(struct page *p, int off, nid_t nid, bool i)
252{ 248{
253 struct f2fs_node *rn = (struct f2fs_node *)page_address(p); 249 struct f2fs_node *rn = F2FS_NODE(p);
254 250
255 wait_on_page_writeback(p); 251 wait_on_page_writeback(p);
256 252
@@ -263,7 +259,8 @@ static inline void set_nid(struct page *p, int off, nid_t nid, bool i)
263 259
264static inline nid_t get_nid(struct page *p, int off, bool i) 260static inline nid_t get_nid(struct page *p, int off, bool i)
265{ 261{
266 struct f2fs_node *rn = (struct f2fs_node *)page_address(p); 262 struct f2fs_node *rn = F2FS_NODE(p);
263
267 if (i) 264 if (i)
268 return le32_to_cpu(rn->i.i_nid[off - NODE_DIR1_BLOCK]); 265 return le32_to_cpu(rn->i.i_nid[off - NODE_DIR1_BLOCK]);
269 return le32_to_cpu(rn->in.nid[off]); 266 return le32_to_cpu(rn->in.nid[off]);
@@ -314,8 +311,7 @@ static inline void clear_cold_data(struct page *page)
314 311
315static inline int is_node(struct page *page, int type) 312static inline int is_node(struct page *page, int type)
316{ 313{
317 void *kaddr = page_address(page); 314 struct f2fs_node *rn = F2FS_NODE(page);
318 struct f2fs_node *rn = (struct f2fs_node *)kaddr;
319 return le32_to_cpu(rn->footer.flag) & (1 << type); 315 return le32_to_cpu(rn->footer.flag) & (1 << type);
320} 316}
321 317
@@ -325,7 +321,7 @@ static inline int is_node(struct page *page, int type)
325 321
326static inline void set_cold_node(struct inode *inode, struct page *page) 322static inline void set_cold_node(struct inode *inode, struct page *page)
327{ 323{
328 struct f2fs_node *rn = (struct f2fs_node *)page_address(page); 324 struct f2fs_node *rn = F2FS_NODE(page);
329 unsigned int flag = le32_to_cpu(rn->footer.flag); 325 unsigned int flag = le32_to_cpu(rn->footer.flag);
330 326
331 if (S_ISDIR(inode->i_mode)) 327 if (S_ISDIR(inode->i_mode))
@@ -337,7 +333,7 @@ static inline void set_cold_node(struct inode *inode, struct page *page)
337 333
338static inline void set_mark(struct page *page, int mark, int type) 334static inline void set_mark(struct page *page, int mark, int type)
339{ 335{
340 struct f2fs_node *rn = (struct f2fs_node *)page_address(page); 336 struct f2fs_node *rn = F2FS_NODE(page);
341 unsigned int flag = le32_to_cpu(rn->footer.flag); 337 unsigned int flag = le32_to_cpu(rn->footer.flag);
342 if (mark) 338 if (mark)
343 flag |= (0x1 << type); 339 flag |= (0x1 << type);