diff options
Diffstat (limited to 'fs/f2fs/node.h')
-rw-r--r-- | fs/f2fs/node.h | 44 |
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) | |||
155 | static inline void fill_node_footer(struct page *page, nid_t nid, | 155 | static 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 | ||
167 | static inline void copy_node_footer(struct page *dst, struct page *src) | 166 | static 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 | ||
186 | static inline nid_t ino_of_node(struct page *node_page) | 183 | static 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 | ||
193 | static inline nid_t nid_of_node(struct page *node_page) | 189 | static 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 | ||
200 | static inline unsigned int ofs_of_node(struct page *node_page) | 195 | static 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 | ||
208 | static inline unsigned long long cpver_of_node(struct page *node_page) | 202 | static 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 | ||
215 | static inline block_t next_blkaddr_of_node(struct page *node_page) | 208 | static 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) | |||
237 | static inline bool IS_DNODE(struct page *node_page) | 229 | static 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 | ||
251 | static inline void set_nid(struct page *p, int off, nid_t nid, bool i) | 247 | static 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 | ||
264 | static inline nid_t get_nid(struct page *p, int off, bool i) | 260 | static 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 | ||
315 | static inline int is_node(struct page *page, int type) | 312 | static 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 | ||
326 | static inline void set_cold_node(struct inode *inode, struct page *page) | 322 | static 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 | ||
338 | static inline void set_mark(struct page *page, int mark, int type) | 334 | static 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); |